首页 > 解决方案 > 如何订购 Cronjobs 以避免重叠或冲突

问题描述

我在 ubuntu 系统上每 5 分钟为 python 脚本运行两个 cronjobs,两者都运行成功,但顺序不同。当我检查日志时,我发现有时第二个作业先运行,有时在完成第一个作业之前触发第二个作业。有什么办法可以安排第二个作业应该在完成第一个作业后开始,并且两者都应该每 5 次运行一次分钟。

*/5 * * * * cd path/to/script && /usr/bin/python3 comand.py -pgw y
*/5 * * * * cd path/to/script && /usr/bin/python3 comand.py -px y

标签: pythoncroncron-task

解决方案


尽管您在 crontab 中使用两个不同的条目同时运行相同的脚本,但它们被视为两个不同的 cron 任务。不确定您使用的是什么操作系统。但 Ubuntu 的典型顺序是自上而下(并行),即假设您在 crontab 中定义了三个任务,如下所示:

* * * * * T1
* * * * * T2
* * * * * T3

T1 先启动,然后是 T2 而不等待 T1 完成,然后是 T3 而不等待 T2 或 T1 完成。Ubuntu 从 Debian 继承了这个顺序。但总的来说,这种行为可能因 Linux 发行版或版本以及 cron 实现而异。依赖它是一样的真的没有意义。例如,在 FreeBSD 中,顺序是自下而上的。如果脚本相互依赖,最好按顺序调用它们,一个从另一个调用,或者从一个通用的包装脚本调用,这是唯一一个实际执行的 cron。您看到的重叠日志可能是由于在两个任务中实际调用脚本之前的第一个更改目录命令。您可能想尝试指定脚本的绝对路径。

*/5 * * * * /usr/bin/python3 /path/to/script/comand.py -pgw y
*/5 * * * * /usr/bin/python3 /path/to/script/comand.py -px y

另一种选择是创建一个类似这样的示例包装脚本并将其安排在 crontab 中。你可以自由修改。

#!/bin/bash

/usr/bin/python3 /path/to/script/comand.py -pgw y > /path/to/task1.log 2>&1 &
TASK1_PID=$!
echo "Task1 PID: $TASK1_PID Started"
while ps -p $TASK1_PID; do sleep 1; done; echo "Task1 PID: $TASK1_PID Completed"

/usr/bin/python3 /path/to/script/comand.py -pgw y > /path/to/task2.log 2>&1 &
TASK2_PID=$!
echo "Task2 PID: $TASK2_PID Started"
while ps -p $TASK2_PID; do sleep 1; done; echo "Task2 PID: $TASK2_PID: Completed" 

推荐阅读