Stdout

將標準輸出重定向到文件時使用 GNU 超時

  • April 6, 2015

假設我有一個執行檔,我想將 STDOUT 和 STDERR 記錄到單獨的文件中,如下所示:

python write.py > out 2> err

當我將此命令與 GNU 一起使用時timeout,我的out文件始終為空。為什麼會發生這種情況,我該如何解決?

timeout 5s python write.py > out 2> err

範例 write.py:

#!/bin/bash
import sys, time

i = 0
while True:    
   print i
   print >> sys.stderr, i
   time.sleep(1)
   i += 1
$ timeout 5s python write.py > out 2> err
$ ls -l out err
-rw-r--r-- 1 yeti yeti 10 Apr  6 08:12 err
-rw-r--r-- 1 yeti yeti  0 Apr  6 08:12 out
$ timeout 5s python -u write.py > out 2> err
$ ls -l out err
-rw-r--r-- 1 yeti yeti 10 Apr  6 08:13 err
-rw-r--r-- 1 yeti yeti 10 Apr  6 08:13 out
$ cmp err out && echo same
same
$ cat out 
0
1
2
3
4

python使用緩衝寫入 onstdout但不是 on stderr。因此,寫入的所有內容都會sys.stderr立即寫入,但內容sys.stdout會保存在緩衝區中,直到緩衝區已滿,以最大限度地減少寫入操作。在 5 秒內,緩衝區沒有填充到足以寫入一次並timeout終止python解釋器。

-u選項添加到python’s 呼叫,寫入stdout也將無緩衝。

您可以通過設置環境變數來強制 Python 程序執行相同的行為PYTHONUNBUFFERED。對於其他程序,您可以unbufferexpect包或GNU coreutilsstdbuf中使用(請參閱關閉管道中的緩衝)。

引用自:https://unix.stackexchange.com/questions/194561