如何用nohup保存日志?Raspbian后台Python脚本日志异常求助
问题原因分析
- Python默认输出缓冲机制:当输出指向文件而非终端时,Python会启用块缓冲模式,只有当缓冲区填满或程序终止时,才会将内容写入文件。这就是前台运行
nohup python <script> >> log.txt时,只有终止程序才看到日志的原因。 - 后台运行(加
&)时,nohup结合Python的缓冲机制,导致缓冲区内容未被及时刷新,甚至程序退出前都不会写入文件,所以log.txt为空。 sudo和&>>(合并重定向stdout/stderr)不改变Python的缓冲行为,因此无效。
解决建议
方法1:运行Python时禁用缓冲
使用-u参数强制Python不缓冲stdout和stderr,命令如下:nohup python -u <script> >> log.txt &这个参数会让输出实时写入文件,
tail -f log.txt可以立即看到更新。方法2:在脚本内部手动刷新缓冲区
如果无法修改启动命令,可在Python脚本中主动刷新输出:- Python 3.3+:使用
print()的flush参数print("日志内容", flush=True) - 所有Python版本:调用
sys.stdout.flush()import sys print("日志内容") sys.stdout.flush()
- Python 3.3+:使用
方法3:用
stdbuf调整系统缓冲
通过stdbuf命令强制设置行缓冲,替代Python的缓冲机制:nohup stdbuf -oL python <script> >> log.txt &-oL表示将stdout设置为行缓冲,每输出一行就立即写入文件。
内容的提问来源于stack exchange,提问作者Juanjo Medina
相关产品推荐
相关产品推荐

