php - 如何防止 cron 作业执行,如果它已经在运行

标签 php cron centos

我有一个 php 脚本,我在 CentOS 上每 10 分钟通过 cron 执行这个脚本。

问题是,如果 cron 作业需要超过 10 分钟,那么同一 cron 作业的另一个实例将启动。

我尝试了一个技巧,那就是:

  1. 使用 php 代码创建一个锁文件(与 pid 文件相同) cron 作业开始了。
  2. 在作业完成时使用 php 代码删除了锁定文件。
  3. 当任何新的 cron 作业开始执行脚本时,我检查了是否锁定 文件存在,如果存在,则中止脚本。

但是可能存在一个问题,即当锁定文件由于某种原因没有被脚本删除或删除时。 cron 将永远不会重新启动。

如果 cron 作业已经在运行,我有什么办法可以通过 Linux 命令或类似命令再次停止它的执行?

最佳答案

Advisory locking正是出于这个目的。

您可以使用 flock() 完成建议锁定.只需将该函数应用于先前打开的锁定文件,以确定另一个脚本是否锁定了它。

$f = fopen('lock', 'w') or die ('Cannot create lock file');
if (flock($f, LOCK_EX | LOCK_NB)) {
    // yay
}

在这种情况下,我添加了 LOCK_NB 以防止下一个脚本等待第一个脚本完成。由于您使用的是 cron,因此总会有下一个脚本。

如果当前脚本提前终止,任何文件锁都会被操作系统释放。

关于php - 如何防止 cron 作业执行,如果它已经在运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10552016/

相关文章:

php - 查看多个用户在 CANVAS 上的实时绘图

php - 使用 PHP 获取排序查询的第一行和第二行中的值之间的差异

php - Laravel 未在 Ubuntu NGINX 上运行 Cronjob

java - Java cron中问号的意义

linux - Anydesk无法解锁安全设置以进行无人值守访问吗?

bash - 如何更改多服务器上的默认 root 密码

javascript - 如何使用 reactjs 从服务器路径中检索图像

php - Blade php 中的 Laravel 打印数组

javascript - 单击 php 中的脚本时,Elemente 将使其不可见

linux - Cron 计划任务被忽略