我发现这个有趣的页面提出了几种选择:
- 创建锁文件
- 创建 PID 文件。
flock
solo
但是他的选择又如何呢?
检查ps
执行的命令当前是否正在运行。
(ps-check.sh
甚至可以在您创建的每个 cron 作业开始时包含脚本。)
我认为我没有遇到这种解决方案的原因是因为它是一个坏主意。
为什么这是个坏主意?
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
已经处理了其中的大部分。
答案1
使用中的缺陷ps
在于你期望过程姓名独一无二。
除非您始终以绝对路径启动进程,否则其他用户(或您自己)可以轻松创建具有相同名称的完全不同的进程,从而阻止您的 cron 作业运行。
答案2
我建议使用运行一次命令 - 比处理锁简单得多。来自文档:
运行一次是一个包装器脚本,它最多运行一个具有一组唯一参数的命令的唯一实例。当您希望一次运行不超过一个副本时,这通常对 cronjobs 很有用。
运行这一个与 run-one 完全相同,不同之处在于它将使用 pgrep 和 kill 来查找并终止用户拥有的任何正在运行且与目标命令和参数匹配的进程。请注意,run-this-one 将在尝试终止匹配的进程时阻塞,直到所有匹配的进程都终止。
持续运行操作方式与 run-one 完全相同,只是它会在 COMMAND 退出(零或非零)时重新生成“COMMAND [ARGS]”。
保持一个运行是 run-one-constantly 的别名。
运行一次直到成功操作方式与 run-one-constantly 完全相同,只是它会重新生成“COMMAND [ARGS]”直到 COMMAND 成功退出(即退出零)。
运行一次直至失败操作方式与 run-one-constantly 完全相同,只是它会重新生成“COMMAND [ARGS]”直到 COMMAND 失败退出(即退出非零)。