Nohup没有将日志写入输出文件


141

我正在使用以下命令在后台运行python脚本:

nohup ./cmd.py > cmd.log &

但是似乎nohup没有向日志文件写入任何内容。cmd.log已创建,但始终为空。在python脚本中,我使用sys.stdout.write而不是print打印到标准输出。我做错什么了吗?


nohup您使用的是哪个版本?BSD版本会写入nohup.out当前目录中(或$HOME/nohup.out当前目录不可写的文件)中的文件。我看不到更改输出文件名的方法...
wulong 2012年

@wulong仅当stdout是终端时。
约翰·库格曼

我还尝试了不带重定向的命令,它根本没有创建nohup.out文件。我不知道它是哪个变体,但是如果有帮助,我使用的是SunOS 5.10。

Answers:


103

看来您需要定期刷新标准输出(例如sys.stdout.flush())。在我的测试中,Python不会自动执行此操作,print直到程序退出。


17
python以及其他基于C stdio的程序在交互情况下使用行缓冲(stdout连接到tty),并在重定向到文件时使用块缓冲。如果python -u不起作用;nohup可能已经引入了自己的缓冲。
jfs 2012年

12
@JFSebastian到今天为止,nohup它不会缓冲输出并且python -u可以正常工作。(仅是针对人员的更新)
Pijusn 2014年

1
@Pius:nohup是POSIX实用程序,在不同平台上可能有不同的实现。顺便说一句,python3 I / O不再基于C stdio,但具有相似的缓冲行为。
2014年

381

您可以使用带有-u标志的Python 来避免输出缓冲:

nohup python -u ./cmd.py > cmd.log &

12
这个更好!非常感谢:)
Sadjad

@kommradHomer我想这取决于程序产生的stdout / stderr的输出量。
vz0 2014年

1
奇迹般有效。我还认为,这比选择正确的答案更好。您能否将此标记为正确,以免混淆他人?
Ondrej Burkert,2015年

1
警告:它并不总是有效。我不知道为什么 你呢?
巴斯基

3
这应该是公认的答案...做了我想要的。谢谢!
krinker

42
  • 使用-u with nohup对我有用。使用-u将迫使stdoutstderr流是缓冲。它不会影响标准输入。一切都将保存在“ nohup.out ”文件中。像这样-

    nohup python -u your_code.py &

    您也可以将其保存到目录中。这条路-

    nohup python -u your_code.py > your_directory/nohup.out &
  • 另外,您可以使用PYTHONUNBUFFERED。如果将其设置为非空字符串,它将与该-u选项相同。要在运行python代码之前使用以下命令运行此命令。

    export PYTHONUNBUFFERED=1

    要么

    export PYTHONUNBUFFERED=TRUE

PS: 我建议使用cron-job之类的工具在后台运行程序并安排执行时间。


@ vz0的答案有什么区别?
德庆

1
@德庆没有区别。


2

Python 3.3及更高版本有一个flush参数用于打印,这是唯一对我有用的方法。

print("number to train = " + str(num_train), flush=True)
print("Using {} evaluation batches".format(num_evals), flush=True)

0

我有一个类似的问题,但未与Python进程关联。我正在运行一个脚本,该脚本执行了nohup,并且该脚本通过cron定期运行。

我可以通过以下方法解决问题:

  1. 重定向标准输入,标准输出和标准错误
  2. 确保通过nohup调用的脚本没有在后台运行其他任何东西

PS:我的脚本是用RHEL上运行的ksh编写的

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.