我需要停止cron作业的重叠,例如:如果一个cron作业安排在早上2点钟进行数据库备份,其他cron作业安排在早上7点再次进行数据库备份。所以我需要停止如果2点钟的数据库备份未完成,则7时钟预定的cron作业。
答案 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::Pid
和Proc::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;
说明:
注意overlap.pl中的数组长度,您可以通过执行`ps -elf |来自行检查grep \“$ cmd \”>>的/ tmp / croncheck`;