【问题标题】:How to order the Cronjobs to avoid overlap or conflict如何订购 Cronjobs 以避免重叠或冲突
【发布时间】:2021-01-25 03:01:23
【问题描述】:

我在 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

【问题讨论】:

    标签: python cron cron-task


    【解决方案1】:

    虽然您在 crontab 中使用两个不同的条目同时运行相同的脚本,但它们被视为两个不同的 cron 任务。不确定您使用的是什么操作系统。但 Ubuntu 的典型顺序是自上而下(并行),即假设您在 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" 
    

    【讨论】:

    • 我正在使用 ubuntu。我希望 T2 应该在 T1 完成后开始,T3 应该在 T2 完成后开始。有什么办法吗?
    • 然后您可以创建一个包装脚本,并按照“您想要的顺序”(例如 T1、T2、T3)一个接一个地依次调用这些脚本。并在 crontab 中添加一个条目以运行包装脚本。
    • 感谢您的信息。您能解释一下如何创建包装脚本或添加解释作为答案吗?
    • 添加了一个示例脚本,你想抓住它吗?
    猜你喜欢
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    相关资源
    最近更新 更多