Stdout
將標準輸出重定向到文件時使用 GNU 超時
假設我有一個執行檔,我想將 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
但不是 onstderr
。因此,寫入的所有內容都會sys.stderr
立即寫入,但內容sys.stdout
會保存在緩衝區中,直到緩衝區已滿,以最大限度地減少寫入操作。在 5 秒內,緩衝區沒有填充到足以寫入一次並timeout
終止python
解釋器。將
-u
選項添加到python
’s 呼叫,寫入stdout
也將無緩衝。您可以通過設置環境變數來強制 Python 程序執行相同的行為
PYTHONUNBUFFERED
。對於其他程序,您可以unbuffer
從expect包或GNU coreutilsstdbuf
中使用(請參閱關閉管道中的緩衝)。