我有以下 cronjob:
@reboot /usr/local/bin/python3.9 /home/pi/push_bullet/push_bullet_socket.py >> /var/log/push_bullet_socket.py.log 2>&1
这是我的 crontab 上唯一的东西。当我查看 /var/log/push_bullet_socket.py.log 时,我看到该文件存在,但没有将任何 stdout 发送到文件。当它不作为 cronjob 运行时,该脚本工作正常,除了没有记录输出外,它作为 cronjob 工作正常。我可以确认打印语句正在 python 脚本中运行,但出于某种原因,它们没有输出到日志文件。
重启后 cron.log 中的内容如下:
May 2 10:01:03 raspberrypi cron[351]: (CRON) INFO (pidfile fd = 3)
May 2 10:01:03 raspberrypi cron[351]: (CRON) INFO (Running @reboot jobs)
May 2 10:01:03 raspberrypi CRON[401]: (root) CMD (python /bin/push_bullet_socket.py >> /var/log/push_bullet_socket.py.log 2>&1)
May 2 10:01:03 raspberrypi CRON[402]: (pi) CMD (/usr/local/bin/python3.9 /home/pi/push_bullet/push_bullet_socket.py >> /var/log/push_bullet_socket.py.log 2>&1)
答案1
与大多数其他运行时一样,Python 在未写入终端时会缓冲 stdout。(在 3.8 之前,这也适用于 stderr。)您的写入将被缓冲,直到它们累积到 8 kB,或者直到您调用sys.stdout.flush()
或print(..., flush=True)
。
在 3.9 中,您可以选择更改缓冲模式(行缓冲是您通常在终端上获得的):
sys.stdout.reconfigure(line_buffering=True)