近日写了一个某网站的签到小脚本,依照惯例会用Supervisor托管到小鸡上,以实现不间断运行。程序很成功地被托管到后台,但当我想看一下Supervisor记录的日志的时候,却发觉日志并没有更新。Supervisor的配置文件如下:

[program:program_name]
directory=/home/program_name/
command=python3 -u /home/program_name/program_name.py
autostart=true
autorestart=true
startsecs=3
redirect_stderr=true
stdout_logfile=/home/program_name/program_name_stdout.log

最初,我以为是配置文件的问题,便对配置文件进行修改。可无论我如何修改,问题依然存在。接着我考虑是否是日志文件权限的问题,可一检查文件权限也没问题。

最后在Google上找到了答案。

引起此问题的原因是因为Python的print()函数不会自动刷新输出到屏幕。因为print函数实际上调用的是Python的标准输出函数sys.stdout.write() ,而sys.stdout并不会像sys.stderr一样将内容直接输出到屏幕上,而是先将内容缓存到缓冲区,然后在缓冲区达到一定大小、或者存在换行符的情况下才会输出到屏幕,因此有些情况下我们会发觉本来应该按顺序依次显示在屏幕上的信息却在最后一条信息显示之时同时显示出来。

已知的解决办法有三种:

1、使用sys.stdout.flush() 手动刷新缓冲区

2、使用 print(msg, flush=True) 关闭缓冲区

3、在命令行运行Python脚本时,带上参数-u (unbuffered),强制将内容不写入缓存而是直接输出到屏幕。

例:

python -u program_name.py

当然,我选择的是最短最简便的一种。=_=

最后,参考链接:

感谢他们。