为什么我的Python脚本在Linux中背景时不写入文件?

use*_*987 6 python linux bash

我可以:

python script.py > logfile 2>&1
Run Code Online (Sandbox Code Playgroud)

一旦我使用ctrl c杀死它,我可以看到日志文件的更改.但是,当我这样做时:

python script.py > logfile 2>&1 &
Run Code Online (Sandbox Code Playgroud)

我看不到对日志文件的任何更改.如何设置我的脚本并仍然将其写入日志文件?

Cha*_*ffy 9

你的写不会进入以太 - 他们正在缓冲.在正常关闭(SIGTERM,而不是SIGKILL)之后,您应该也会看到文件中的内容.

或者,您可以显式刷新:

sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)

...或告诉Python以无缓冲模式运行:

python -u yourscript.py
Run Code Online (Sandbox Code Playgroud)

或者用你的脚本开始

#!/usr/bin/python -u
Run Code Online (Sandbox Code Playgroud)

...确保内容被写入.当然,这将导致性能下降,因为您的脚本将尝试更频繁地执行IO.


(顺便说一句,#!/usr/bin/env python -u 不能保证工作:只保证命令名和单个参数从shebang行传递到运行的命令;您的操作系统可能会或可能不会更多地支持).