当作业需要很长时间才能完成时,不会发送Cron通知

当作业需要很长时间才能完成时,不会发送Cron通知,cron,crontab,Cron,Crontab,我在crontab中添加了以下内容。它每30分钟运行一次。但我注意到一件奇怪的事情,即每当cron在几分钟内完成时发送电子邮件,而不是在需要3分钟以上时发送。有这样的限制吗?有没有办法告诉crontab等待作业完成并发送流程输出的全部文本 MAILTO=notifs@mydevdomain.com 0,30 * * * * /usr/bin/php /var/www/z/process_batch.php 通常,cron将重定向所有输出并收集这些输出,并且在作业完成后,将输出get发送到MAI

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

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

通常,cron将重定向所有输出并收集这些输出,并且在作业完成后,将输出get发送到MAILTO中的内容。不管这需要多长时间

这里的问题通常是:

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

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

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

正如一些提示:

-------------%<--------------------
...
# 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

-------------->%------------------
--------------%%------------------

没错,另一个作业在第一个作业仍在运行时启动,然后查看数据库锁并退出。那么,这杀死了第一个?这不是很独立吗?我对cron和unix系统的了解非常少。实际上,我们有一个非常类似的情况,我们通过让第二个查找信号量(在/tmp中的文件)并在不访问数据库的情况下立即退出来解决这个问题。从而防止一次有两个实例。因此,我将所有作业都包含在一个bash脚本中,该脚本处理锁并启动真正的作业。如果可能,您可以共享该脚本吗?这将是我的第一个shell实验。我试试看。