如何命令Cronjob避免重叠或冲突

问题描述

我在ubuntu系统上每5分钟运行两个cronjobs for python脚本,两个都运行成功,但顺序不同。当我检查日志时,我发现有时第二项工作首先执行,而有时是因为完成第一项工作而触发第二项工作。有什么办法可以安排第二项工作应该在完成第一项工作后开始并且两者都应每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任务。不确定您使用的是哪个操作系统。但是Ubuntu的典型顺序是自上而下(并行),也就是说,假设您在crontab中定义了三个任务,如下所示:

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

T1首先启动,然后在不等待T1完成的情况下启动T2,然后在不等待T2或T1完成的情况下启动T3。 Ubuntu继承了Debian的订单。但通常,此行为可能因Linux发行版或版本以及cron实现而异。而且,依靠它保持一致真的没有任何意义。例如,在FreeBSD中,顺序为bottom-up。如果这些脚本相互依赖,则最好按顺序调用它们,一个从另一个调用,或者从一个通用的包装程序脚本(这是一个cron实际执行的)中依次调用。您看到的重叠日志可能是由于在两个任务中实际调用脚本之前都存在第一个change directory命令。您可能要尝试指定脚本的绝对路径。

*/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"