我已经设置了一个 cron 列表,一些 cron 脚本需要很长时间才能运行(例如 1-5 小时,而且每天都在增加)。我不想同时运行两个 cron 脚本,因为我没有资源或需要这样做。我需要找到一个解决方案,以便计划的脚本不会在另一个前一个脚本完成之前启动。我的列表中有 10-15 个 cron 作业,我不想让其中 5 个重叠。
是否有人对我应该更仔细地研究什么样的解决方案来实现我的目标有什么建议?
答案1
A. 创建临时锁文件,该文件将在脚本运行时供其使用,如果新脚本找到此文件,它就会停止。
IE
if [ -a lockfile ]; then
exit 0
else
touch lockfile
fi
... rest of code...
rm -f lockfile
B. 使用脚本检查是否另一个脚本已经在运行,如 ps auxwf|grep blabla。
答案2
使用锁定文件方法可能会导致每日 cronjob 无法启动的情况。您是否考虑过从一个 cronjob 中顺序运行这些作业
/bin/bash/ 的 #!/bin/bash/ sh /jobs/somejob1 sh /jobs/somejob2
我建议从一个作业中顺序运行 I/O 密集型应用程序
答案3
您也可以在 PHP 中使用锁文件。我用以下代码解决了完全相同的问题:
$lockfile='/tmp/'.__CLASS__.'.lock'; // the lockfile should be different for each script
$lock=fopen($lockfile, 'w');
if(!flock($lock, LOCK_EX|LOCK_NB)){
// $this->log("This process is already started, i'm exiting.");
exit;
}
将其放在你的工作脚本的开头。
答案4
本月初,Sysadvent 上也出现了同样的话题: http://sysadvent.blogspot.co.uk/2012/12/day-4-zookeeper-for-distributed.html
您可以使用 Zookeeper 作为跨机器集群的锁文件的分布式锁管理器。