Shell-crontab 执行定时任务如何控制前一个任务执行完后再启动下一个任务?
在 Linux 下使用 crontab 执行定时任务,如果任务自身运行时间超过任务执行的间隔时间,就有可能导致两次任务发生冲突,请问如何控制前一个任务执行完后再启动下一个任务?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
在 Linux 下使用 crontab 执行定时任务,如果任务自身运行时间超过任务执行的间隔时间,就有可能导致两次任务发生冲突,请问如何控制前一个任务执行完后再启动下一个任务?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(4)
可以考虑用一个 run.sh 来代理定时任务的启动。
crontab中写作:
1 1 * * * run.sh task_path.sh >> log_file 2>&1
在 run.sh 中用 ps 来检测 task_path 是否已经在运行,进而决定是否启动task_path.sh。
这种方法,除了可以控制任务的运行外,还可以做一些数据投递,监控定时任务的运行情况。
你可以用队列形式设置定时任务,这样先来先执行后来后执行;或者弄个cron配置文件设置每个任务的依赖关系,比如你如果知道那个任务大概超出了间隔时间,就把它后面的任务与之设置成依赖关系,这样这个任务必须执行完后面的才执行。这样避免任务冲突!
加个文件锁就OK了。
每次任务执行时先判断锁文件是否存在,存在则退出任务,不存在则建立锁文件,任务执行完毕时删除该文件。
在超出crontab执行的间隔时间的情况下,如果你还想继续执行之前没有执行的任务,则需要在脚本中判断当次任务执行时间,如果超过了crontab的间隔时间,那么在当前任务结束时进行系统调用执行该定时任务。
crontab的确只能在指定的时间进行对应的任务,但是办法还是有的,可以使用一个标志位(创建一个文件或者文件中特定的内容)来实现控制:
比如计划任务A和B,其中B必须在A后执行才能执行:
1、设置好Crontab的内容,分别是A和B的对应时间。
2、然后A在执行后会创建一个文件,B脚本中在执行前检查这个文件是否存在,如果不存在的话,可以将B程序设计成周期性检测(这样子的话就不会因为A还没有执行完成导致B脚本跳过)
这种方法挺不错的,当然是依靠Crontab的前提下,其实我感觉你甚至自己写个定时计划任务算了,可以不依靠系统本身的crontab功能的。