让 nohup 实时写入输出

4
当使用nohup时,脚本的输出会被缓冲,只有在脚本执行完毕后才会转储到日志文件(nohup.out)中。能够实时地查看脚本输出以了解其进度将非常有用。是否有一种方法可以使nohup在脚本产生输出时立即写入输出?或者,由于这样频繁的文件访问操作很慢,在执行过程中定期转储输出?

以下是来自@john-zwinck的完美答案,这是一个Python脚本的工作解决方案: nohup unbuffer python script.py > log & - feedMe
1
这对我不起作用... :-(给出错误“nohup: failed to run command 'unbuffer': No such file or directory”@john-zwinck 有事情改变了吗? - Selfx Aadhyant
@SelfxAadhyant 你需要按照 brezniczky 在 https://askubuntu.com/questions/1047900/unbuffer-stopped-working-months-ago 中提到的安装 expect。 - Kaushik Acharya
3个回答

5
有一个特别的程序可以实现这个功能:unbuffer!详情请见http://linux.die.net/man/1/unbuffer
其原理是,程序的输出例程会识别stdout不是终端(isatty(stdout) == false),因此它们会将输出缓冲到某个最大值。使用unbuffer程序包装您的程序将“欺骗”它以每次写入一行输出,就像在交互式终端上直接运行该程序时一样。

非常感谢。有趣的是,语法中unbuffernohup之后。我在自己的问题上发表了评论,并提供了解决方案,因为我最终使用了它。 - feedMe

1
你正在执行什么命令?你可以创建一个.bash文件,在其中在每个命令后重定向输出到文件(echo "blabh" >> your-output.txt),这样你就可以在nohup执行过程中检查该文件(你应该运行:nohup script.bash &)。
干杯。

好的,这个方法可行,但我想要更优雅的解决方案。我必须在我的代码中包含很多文件打印语句才能看到发生的一切。当然,我的脚本已经在写一些数据文件,所以我并不完全盲目于此过程。 - feedMe
考虑使用“行缓冲”而不是“无缓冲”。stdbuf -i0 -oL -eL - lucky62

0
请使用stdbuf。它从7.5版的GNU coreutils开始添加。
stdbuf  -i0 -o0 -e0 cmd

使用类似于nohup的命令:

nohup stdbuf -i0 -o0 -e0 ./server >> log_server.log 2>&1  

参考


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接