如何订购 Cronjobs 以避免重叠或冲突

How to order the Cronjobs to avoid overlap or conflict

我在 ubuntu 系统上每 5 分钟 运行 为 python 脚本执行两个 cronjobs,两者都 运行ning 成功但顺序不同。当我检查日志时,我发现有时第二份工作 运行 先完成,有时在完成第一份工作之前 triggered.Is 有任何方式我可以安排第二份工作应该在完成第一份工作后开始两者都应该 运行 每 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

虽然您 运行 同一个脚本同时在 crontab 中有两个不同的条目,但它们被视为两个不同的 cron 任务。不确定您使用的 OS 是什么。但是 Ubuntu 的典型顺序是 top-down(并行),即假设您在 crontab 中定义了三个任务,如下所示:

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

T1 先开始,然后是 T2,无需等待 T1 完成,然后是 T3,无需等待 T2 或 T1 完成。 Ubuntu 从 Debian 继承了这个命令。但总的来说,这种行为可能因 Linux 发行版或版本和 cron 实现而异。依赖它是一样的真的没有意义。例如,在 FreeBSD 中,顺序是 bottom-up。如果脚本相互依赖,最好按顺序调用它们,一个接一个地调用,或者从一个通用的包装器脚本调用,这是唯一一个 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"