用于停止Cron作业重叠的代码

时间:2010-06-29 10:36:38

标签: cron

我需要停止cron作业的重叠,例如:如果一个cron作业安排在早上2点钟进行数据库备份,其他cron作业安排在早上7点再次进行数据库备份。所以我需要停止如果2点钟的数据库备份未完成,则7时钟预定的cron作业。

7 个答案:

答案 0 :(得分:6)

这就是flock的用途。来自man flock

...
The  third form is convenient inside shell scripts, and is usually used
       the following manner:

       (
         flock -n 9 || exit 1
         # ... commands executed under lock ...
       ) 9>/var/lock/mylockfile
...

在这种情况下,flock会尝试锁定/var/lock/myfile的fd 9。如果不能(因为早期作业仍在运行),它将退出。

你需要把它放在一个脚本中。

答案 1 :(得分:3)

最简单的方法是让你的2am和7am任务协调一致。因此,例如,数据库备份脚本可以在执行时创建锁定文件,并在启动时检查该文件是否存在。如果文件存在,它可以简单地退出而不做任何工作(或者稍微睡一觉,或者你决定的任何事情)。

以完全与任务无关的方式执行此操作可能是可能的,但在这种特定情况下,这将变得更加棘手和不必要。

答案 2 :(得分:2)

假设您使用的是Unix系统:最简单的方法是 创建一个文件并将cron作业的PID写入其中。如果文件不能 已经使用带有open(2)标志的O_CREAT|O_EXCL创建了 存在,因此以前的工作仍然在运行或没有崩溃 打扫干净。 PID可用于确定作业是否仍然存在 运行

在您的情况下,最安全的方法可能是让cron工作死亡 如果在启动时找到PID文件。

由于您将perl标记放入问题,我建议您查看一下 在File::PidProc::PID::File模块。

答案 3 :(得分:1)

您只需要一些可以查看第一个任务是否已完成运行的内容,并且应该在作业再次运行之前完成此检查。

我将使用数据库(如果可用)或注册密钥甚至文本文件来实现此功能。所以你的任务看起来像这样:

  read job_flag
  if job_flag == 0
    step job_flag = 1
    run job
    step job_flag = 0
  else
    stop job 
  end

答案 4 :(得分:0)

你可以用cron做到这一点。您将不得不在脚本或代码中添加一些逻辑来检查另一个是否正在运行。完全破解是让您的脚本检查特定文件的存在。如果它不存在,那么您应该创建此文件,执行备份,然后将其删除。如果文件存在,则不执行任何操作。

这是一个黑客攻击,只有你的工作距离太远才能真正起作用。

答案 5 :(得分:0)

为什么不在一个cron工作中这样做呢?

/path/to/job1 && /path/to/job2

答案 6 :(得分:0)


这是我的解决方案:

$ crontab -l
* * * * * cd /patch/to/script; . /patch/to/.profile; overlap.pl process.sh -t Device || process.sh -t Device
$
$
$ cat overlap.pl
#!/usr/bin/env perl
use warnings;
use strict;

my $cmd = join(' ',@ARGV);
my @result = `pgrep -f \"$cmd\"`;
scalar @result > 2 ? exit 0 : exit 1;

说明:

  • 此作业每分钟运行一次脚本以检查它是否有效(* * * * *)
  • cron job很复杂,fisrt更改目录,加载配置文件所以我需要直接从这个作业启动脚本,而不是从检查重叠的脚本启动
  • 然后检查具有相同参数的特定进程是否已在运行(overlap.pl与我要检查的确切命令)
  • if“no”,返回0,如果“是”,则返回> 0
  • 然后有逻辑“或”检查结果并启动所需的脚本

注意overlap.pl中的数组长度,您可以通过执行`ps -elf |来自行检查grep \“$ cmd \”>>的/ tmp / croncheck`;