【问题标题】:Why is my Python script not writing to file when it is backgrounded it in Linux?为什么我的 Python 脚本在 Linux 中作为后台时没有写入文件?
【发布时间】:2015-06-08 16:54:39
【问题描述】:

我能做到:

python script.py > logfile 2>&1

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

python script.py > logfile 2>&1 &

我看不到日志文件的任何更改。我怎样才能让我的脚本在后台运行,并且仍然让它写入日志文件?

【问题讨论】:

  • 缓冲。显式刷新。
  • 顺便说一句——在进入标准输出和进入文件之间工作方式不同的典型原因是标准 C 库的行为基于被写入的输出描述符是否是 TTY 而不同;默认情况下,TTY 输出是行缓冲或无缓冲的,而输出到文件则不是。 (我说“典型”是因为 Python 运行时可能会做自己的事情,而不是在这里依赖 C 库,但最终效果是相似的)。

标签: python linux bash


【解决方案1】:

您的写入不会进入以太网络——它们会被缓冲。在正常关闭(SIGTERM,而不是 SIGKILL)之后,您应该也会看到文件中的内容。

或者,您可以显式刷新:

sys.stdout.flush()

...或者告诉 Python 在无缓冲模式下运行:

python -u yourscript.py

或者用

开始你的脚本
#!/usr/bin/python -u

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


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

【讨论】:

  • 谢谢!对于我发现的非 python 命令:how to flush
  • 关于该问题的公认答案归结为“您需要在您正在运行的特定程序的范围内解决它” - 没有太大帮助。 stdbuf 是 GNU 扩展,unbufferexpect 打包在一起——不是 POSIX 标准化工具。这里没有很好的通用答案。
  • 就个人而言,如果我想指出一个好的通用参考,我会提出 BashFAQ #009:mywiki.wooledge.org/BashFAQ/009
猜你喜欢
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 2019-11-09
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多