当前位置: 首页 > 面试题库 >

如果cron作业已在运行,则如何防止其执行

柳宏深
2023-03-14
问题内容

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

问题是,如果cron作业将花费10分钟以上,则将启动同一cron作业的另一个实例。

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

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

但是可能存在一个问题,就是由于某种原因,脚本未删除或删除锁定文件时。Cron将永远不会再次启动。

有什么方法可以停止cron作业(如果已经在运行),Linux命令或类似命令吗?


问题答案:

咨询锁定正是为此目的而进行的。

您可以使用完成咨询锁定flock()。只需将函数应用于先前打开的锁定文件,即可确定另一个脚本是否对其具有锁定。

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

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

如果当前脚本过早终止,则操作系统将释放所有文件锁。



 类似资料:
  • 问题内容: 我有几个使用共享资源(数据库)的作业,有时这会在(碰巧)同时触发作业的(罕见)事件中导致构建失败。 例如,给定作业A到E,是否有任何方法可以指定A和C 绝不能同时运行 ? 除上述资源外,构建彼此独立(例如,不存在上游/下游关系)。 “强力”方式将执行者的数量限制为一个,但是如果大多数作业可以很好地同时执行并且在构建服务器上不缺少计算资源,那么显然这不是理想的选择。 问题答案: 当前有两

  • 问题内容: 我试图在docker容器中运行cron作业 但对我没有用 我的容器只有cron.daily和cron.weekly文件 crontab,cron.d,cron.hourly …在我的容器中不存在 crontab -e也无法正常工作 我的容器使用/ bin / bash运行 问题答案: 这是我运行我的cron容器之一的方法。 Dockerfile: crontab.txt entry.s

  • 问题内容: 我正在尝试在调用shell脚本的docker容器中运行cronjob。 昨天我一直在网上搜索和堆栈溢出,但是我找不到真正可行的解决方案。 我怎样才能做到这一点? 编辑: 我已经创建了一个(带注释的)github存储库,上面有一个工作的docker cron容器,该容器以给定的时间间隔调用shell脚本。 问题答案: 您可以将crontab复制到映像中,以使从该映像启动的容器运行该作业。

  • 我创建了一个(有注释的)github存储库,其中有一个工作的docker cron容器,它以给定的时间间隔调用一个shell脚本。

  • 问题内容: 很简单,我有要每月执行一次的节点脚本。 但这是行不通的,大概是因为该命令正在运行的路径或外壳。我尝试了以下通过cron执行节点的方法(已通过-v测试): 我没办法尝试了,有什么建议吗? 问题答案: 只需提供cron作业中node的完整路径即可,例如:

  • 我有点困惑,因为当通过HTTP请求启动Spring Batch作业的执行时,如果我在作业执行时收到另一个HTTP请求来启动相同的作业,但参数不同,则正在执行的作业停止未完成并开始处理新作业。 我开发了一个API REST来加载和处理Excel文件的内容。web服务公开了两个endpoint,一个用于加载、验证和存储数据库中Excel文件的内容,另一个用于开始处理存储在数据库中的记录。 > POST