【问题标题】:Cron notification not getting sent when the job takes a long time to finish作业需要很长时间才能完成时未发送 Cron 通知
【发布时间】:2013-06-09 01:04:38
【问题描述】:

我已将以下内容添加到 crontab。它每 30 分钟运行一次。我观察到一件奇怪的事情,即每当 cron 在几分钟内完成时发送电子邮件,而不是在需要 3 分钟以上时发送。有这样的限制吗?有没有办法告诉 crontab 等到作业完成并发送进程输出的整个文本?

MAILTO=notifs@mydevdomain.com
0,30 * * * * /usr/bin/php /var/www/z/process_batch.php

【问题讨论】:

    标签: cron crontab


    【解决方案1】:

    通常,cron 将重定向所有输出并收集它们,在作业完成后,输出 get 发送到 MAILTO 中的内容。这与这可能需要多长时间无关。

    这里的问题通常是:

    该作业需要超过 30 分钟(您的时间间隔)才能运行,并且 cron 正在启动您的批处理的第二个实例。你需要解决这个问题。

    作业永远不会完成并挂起,这可能会导致系统中出现一些僵尸进程,并且在某些情况下还可能会阻止 cron 正常工作。

    因此,如果作业运行时间超过 3 分钟并且在它实际完成之后,cron 没有发送电子邮件似乎不是 cron 问题,而只是与您的批处理 php 相关。

    【讨论】:

    • 没错,当第一个作业仍在运行时,另一个作业开始,然后查看数据库锁并退出。那么,这会杀死第一个吗?是不是有点独立?我对 crons 和 unix 系统的了解很少。
    • 实际上我们有一个非常相似的情况,我们通过让第二个查找信号量(/tmp 中的文件)并立即退出而不访问数据库来解决这个问题。从而防止一次有两个实例。因此,我将所有工作都包含在一个 bash 脚本中,用于处理锁定并开始真正的工作。
    • 如果可以的话可以分享一下脚本吗?
    【解决方案2】:

    正如一些提示:

    -------------%<--------------------
    ...
    # name of the task, param 1
    export LOCKEXT=$1; shift
    export LOCK=/tmp/cron_lock.$LOCKEXT
    ...
    
    # catch on external signals
    trap "rm $LOCK" 10 11 15
    
    ...
    
    if [ -f $LOCK ]
    then
        echo "`date`: still running: `ls -l $LOCK` ...."
        exit 0
    else
        touch $LOCK
    fi
    
    .....
    # run your task
    ....
    
    rm -f $LOCK
    
    -------------->%------------------
    

    【讨论】:

    • 将是我的第一个 shell 实验。我试试看。
    猜你喜欢
    • 1970-01-01
    • 2018-02-07
    • 2016-07-30
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多