2012-10-16 69 views
80

我使用下面的命令在后台运行一个python脚本:NOHUP不写日志输出文件

nohup ./cmd.py > cmd.log & 

但看来,nohup的不写任何东西到日志文件。 cmd.log已创建,但始终为空。在python脚本中,我使用sys.stdout.write而不是print来打印到标准输出。我做错了什么?

+0

你使用了哪种“nohup”变种? BSD版本写入当前目录中的一个名为'nohup.out'的文件(或者如果当前目录不可写,则为'$ HOME/nohup.out')。我没有看到改变输出文件名的方法... – wulong

+0

@wulong这只是如果标准输出是一个终端。 –

+0

我也试过了没有重定向的命令,它根本没有创建nohup.out文件。我不知道它是哪个版本,但如果有帮助的话,我在SunOS 5.10上。 – ezbentley

回答

69

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

+0

谢谢。这工作。 – ezbentley

+13

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

+8

@ J.F.Sebastian截至今天,'nohup'不会缓冲输出,'python -u'工作得很好。 (只是人的更新) – Pijusn

200

你可以用-u标志运行Python避免输出缓冲:

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

这样更好!非常感谢:) – Sadjad

+1

这会是一个性能问题吗? – kommradHomer

+0

@kommradHomer我猜这取决于你的程序产生的stdout/stderr的输出量。 – vz0

12

使用'-u''nohup'为我工作。一切都将保存在“nohup.out”文件中。像这样 -

nohup python -u code.py & 
+0

与@ vz0的答案有何区别? – Deqing

+0

@德庆没有区别。 – Overcode