假设我有一个可执行文件,我想为其记录 STDOUT 和 STDERR 以分隔文件,如下所示:
python write.py > out 2> err
Run Code Online (Sandbox Code Playgroud)
当我将此命令与 GNU 一起使用时timeout,我的out文件始终为空。为什么会发生这种情况,我该如何解决?
timeout 5s python write.py > out 2> err
Run Code Online (Sandbox Code Playgroud)
示例 write.py:
#!/bin/bash
import sys, time
i = 0
while True:
print i
print >> sys.stderr, i
time.sleep(1)
i += 1
Run Code Online (Sandbox Code Playgroud)
小智 6
$ 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
Run Code Online (Sandbox Code Playgroud)
python使用缓冲写入 onstdout但不使用 on stderr。因此,写入的所有内容都会sys.stderr立即写入,但内容sys.stdout会保留在缓冲区中,直到缓冲区已满以最大程度地减少写入操作。在 5 秒内,缓冲区没有填充到足以写入一次并timeout终止python解释器。
将-u选项添加到python的调用,写入也stdout将是无缓冲的。
您可以通过设置环境变量对 Python 程序强制执行相同的行为PYTHONUNBUFFERED。对于其他程序,您可以使用unbuffer从预期包或stdbuf从GNU的coreutils(见关闭管道缓冲)。
| 归档时间: |
|
| 查看次数: |
1759 次 |
| 最近记录: |