我有一个PHP脚本,我在CentOS上每隔10分钟通过cron执行这个脚本.
问题是如果cron作业需要10分钟以上,那么同一个cron作业的另一个实例将启动.
我尝试了一个技巧,那就是:
但是,当由于任何原因未通过脚本删除或删除锁定文件时,可能存在一个问题.cron永远不会重新开始.
有没有办法我可以再次执行cron作业,如果它已经在运行,使用Linux命令或类似的?
Ja͢*_*͢ck 45
咨询锁定就是为了这个目的.
您可以使用完成咨询锁定flock().只需将该函数应用于先前打开的锁定文件,以确定其他脚本是否具有锁定.
$f = fopen('lock', 'w') or die ('Cannot create lock file');
if (flock($f, LOCK_EX | LOCK_NB)) {
    // yay
}
在这种情况下,我添加LOCK_NB以防止下一个脚本等到第一个脚本完成.由于您使用的是cron,因此总会有下一个脚本.
如果当前脚本过早终止,则操作系统将释放任何文件锁.
Leo*_*nov 15
如果您可以配置代码,最好不要编写代码:
https://serverfault.com/questions/82857/prevent-duplicate-cron-jobs-running
小智 12
flock()对我来说很棒 - 我有一个cron作业,每5分钟安排一次数据库请求,所以不能同时运行几个是至关重要的.这就是我做的:
$filehandle = fopen("lock.txt", "c+");
if (flock($filehandle, LOCK_EX | LOCK_NB)) {
    // code here to start the cron job
   flock($filehandle, LOCK_UN);  // don't forget to release the lock
} else {
    // throw an exception here to stop the next cron job
}
fclose($filehandle);
如果你不想杀死下一个预定的cron作业,只是暂停它直到正在运行的作业完成,那么只需省略LOCK_NB:
if (flock($filehandle, LOCK_EX))