我正在尝试使用 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 分钟左右,我看到Killed
了cron.log
。
我认为该Killed
消息意味着 cron 启动了作业并过了一段时间后终止了该作业。我对file2.py
cron 终止我的作业的原因不感兴趣。我感到困惑的是,如果 cron 启动了作业file2.py
,为什么没有。我看到的只有和。当我手动运行这两个文件时,它们都可以正常运行。感谢任何帮助2
cron.log
1
Killed
答案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