防止cron作业重复

我发现这个有趣的页面 ,提出了几个select:

  1. 创build一个锁文件
  2. 创build一个PID文件。
  3. flock
  4. solo

但是他的select呢?

检查ps ,看看执行的命令是否正在运行。

ps-check.sh脚本甚至可以包含在您创build的每个cron作业的开始处。)

我假设我没有遇到这种解决scheme的原因是这是一个坏主意。

为什么这是一个坏主意?

如果命令已经运行, ps-check.sh可以返回1。 cron脚本可以像这样调用ps-check.sh

 #!/bin/bash #some script #get current script name into variable #then use ps-check.sh to see if current script is already running #by supplying it with 2 things: script name and current PID me=`basename "$0"` if (( $(ps-check.sh $me $$) == 1)); then exit 1; fi # do more stuff 

ps-check.sh将检查脚本是否已经在另一个PID下运行。

是否有任何情况下脚本将运行,但不可见在ps ? 如果睡觉?

编辑 – 结论:

我决定和flock一起去。 检查ps可以工作,但我可能要处理很多的条件,以确保。 我认为flock已经处理了大部分。

使用ps逻辑的缺点是你期望进程是唯一的。

除非您始终以绝对path启动进程,否则不同的用户(或您自己)可以轻松创build一个完全不同的进程,并使用相同的名称来阻止您的cron作业运行。

我会build议使用运行一个命令 – 比处理锁简单得多。 从文档:

run-one是一个包装脚本,只运行一个具有唯一参数集的命令的唯一实例。 这对于cronjobs来说是非常有用的,因为你一次只需要运行一个副本。

run-this-one就像run-one一样,除了它将使用pgrep和kill来查找和终止用户拥有的任何正在运行的进程并匹配目标命令和参数。 请注意,在试图杀死匹配的进程之前,运行这个程序将会阻塞,直到所有匹配的进程都死亡。

run- one-像运行一样运行,除了COMMAND退出(零或非零)时重新运行“COMMAND [ARGS]”。

保持一个跑步跑步的别名。

直到成功运行就像运行一样 – 除了它重新生成“COMMAND [ARGS]”,直到COMMAND成功退出(即退出零)为止。

一直运行,直到失败运行完全像运行一样,除了重新命令“COMMAND [ARGS]”,直到COMMAND退出失败(即退出非零)。