Cron 作业似乎正在运行,但没有输出,一段时间后被终止

Cron 作业似乎正在运行,但没有输出,一段时间后被终止

我正在尝试使用 crontab 运行我的 python 脚本。我在同一个目录中有 2 个 python 脚本。第一个file1.py只有 1 行print(1)。第二个文件file2.py以 开头print(2),然后是一长段代码,用于查询和更新我的 SQL 数据库中的数据。

我的设置crontab -e是这样的(我设置文件每分钟运行一次并将输出保存到cron.log

* * * * * cd /path/to/files && python3 file1.py >> /path/to/files/cron.log 2>&1
* * * * * cd /path/to/files && python3 file2.py >> /path/to/files/cron.log 2>&1

当我检查 中的输出时cron.log,起初我只看到1,它来自file1.py,但我没有看到2的输出file2.py。然而,过了一会儿,大概 10 分钟左右,我看到Killedcron.log

我认为该Killed消息意味着 cron 启动了作业并过了一段时间后终止了该作业。我对file2.pycron 终止我的作业的原因不感兴趣。我感到困惑的是,如果 cron 启动了作业file2.py,为什么没有。我看到的只有和。当我手动运行这两个文件时,它们都可以正常运行。感谢任何帮助2cron.log1Killed

答案1

我怀疑这是因为当输出被重定向时,python3 会缓冲其标准输出流 - 并且当进程被终止时缓冲区不会被刷新。

为了说明,给定

$ cat file2.py
import time
print(2)
time.sleep(5)

然后

$ timeout 3 python3 file2.py
2

然而

$ timeout 3 python3 file2.py | cat
Terminated

如果您强制python3取消缓冲其流,您可能会看到预期的日志输出:

$ timeout 3 python3 -u file2.py | cat
2
Terminated

相关内容