Linux 使用cron防止Bash脚本并行或重叠运行

Linux 使用cron防止Bash脚本并行或重叠运行,linux,bash,unix,cron,Linux,Bash,Unix,Cron,如果我的cron表中有以下条目: 00 03 * * * /java_prog1.sh 00 5 * * * /java_prog2.sh 第一项工作通常需要30分钟左右才能完成。第二项工作大约需要10分钟。有些特殊情况下,第一份工作需要两个多小时 是否有办法配置这两个作业,以便在第一个作业仍在运行时第二个作业不会启动 我见过几个使用工具的例子,如flock,但我认为flock不适用于这里,因为我没有试图阻止同一个作业同时运行。如果前一个作业仍在运行,我将尝试阻止另一个作业启动 只是在评论中

如果我的cron表中有以下条目:

00 03 * * * /java_prog1.sh 
00 5 * * * /java_prog2.sh
第一项工作通常需要30分钟左右才能完成。第二项工作大约需要10分钟。有些特殊情况下,第一份工作需要两个多小时

是否有办法配置这两个作业,以便在第一个作业仍在运行时第二个作业不会启动


我见过几个使用工具的例子,如
flock
,但我认为flock不适用于这里,因为我没有试图阻止同一个作业同时运行。如果前一个作业仍在运行,我将尝试阻止另一个作业启动

只是在评论中已有的建议上加了些肉而已

放入
java_prog1.sh的开头:

[ -f /var/run/java_prog1.sh.pid ] && exit
echo "$$" > /var/run/java_prog1.sh.pid

... everything else our script does ...

rm -f /var/run/java_prog1.sh.pid
[ -f /var/run/java_prog1.sh.pid ] && exit

... the rest of your java_prog2.sh ...
然后在
java_prog2.sh
的开头:

[ -f /var/run/java_prog1.sh.pid ] && exit
echo "$$" > /var/run/java_prog1.sh.pid

... everything else our script does ...

rm -f /var/run/java_prog1.sh.pid
[ -f /var/run/java_prog1.sh.pid ] && exit

... the rest of your java_prog2.sh ...
或:

如果a文件(可能并且可能包含来自第一个脚本的PID)存在,第一个脚本将立即退出。只有当文件存在并且该文件中有PID的进程在进程表中时,第二个进程才会退出(
kill-0
如果退出,则返回0)

就实际的脚本编写而言,您可能需要进行一些实验。这只是给你一个大概的想法,它可能会去

是否有办法配置这两个作业,以便在第一个作业仍在运行时第二个作业不会启动

因为我不能评论,我会给你另一个你能想到的例子,当然,“萨米-莱恩解决方案更优雅”。 您只需编辑如下配置文件:

启动时: 在/java_prog1.sh中: 在/java_prog2.sh中:
目录的创建是原子性的,因此您可以在两个脚本中都添加:

lock_dir=/tmp/name_of_lock_directory
if ! mkdir "$lock_dir"; then
    echo "Cannot run $0: lock directory $lock_dir exists" >&2
    exit 1
fi
cleanup () { rm -r "$lock_dir"; }
trap cleanup EXIT
# if you want, you can add the running pid to a file in the lock directory
echo $$ > "$lock_dir/pid"

让您的第一个cron作业在启动时在磁盘上的某个位置发出PID,并在完成后进行清理。这将为第二个确定第一个作业的状态让路。第一个作业每次运行时的PID是否相同?我认为每次执行的PID都是不同的。我提到了
在磁盘上发出PID
——这意味着将其写入一个具有已知名称的文件。
while [ `cat file.config` -eq 1 ] ; do sleep 5; done   # Wait whatever want
lock_dir=/tmp/name_of_lock_directory
if ! mkdir "$lock_dir"; then
    echo "Cannot run $0: lock directory $lock_dir exists" >&2
    exit 1
fi
cleanup () { rm -r "$lock_dir"; }
trap cleanup EXIT
# if you want, you can add the running pid to a file in the lock directory
echo $$ > "$lock_dir/pid"