如何使用Bash调度多个CronJob且避免任务冲突?
解决方案
核心思路
利用文件锁实现任务2、3、4的互斥执行,通过Linux系统自带的flock命令保证同一时间只有一个任务持有锁,其他任务会等待锁释放后再启动。任务1无需修改,因为没有互斥要求。
具体实现步骤
1. 确定统一锁文件路径
选择系统重启后会自动清空的目录存放锁文件,比如:
/var/run/job_mutex.lock
确保执行脚本的用户对该目录有读写权限,默认系统权限即可满足需求。
2. 修改任务2、3、4的脚本
在job_2.sh、job_3.sh、job_4.sh的最开头添加锁逻辑,示例(以job_2.sh为例):
#!/bin/bash # 尝试获取锁,若锁被持有则等待释放后再执行 flock /var/run/job_mutex.lock || exit 1 # 原脚本的业务逻辑放在这里 # ... 你的任务代码 ... # 脚本执行完毕或异常退出时,flock会自动释放锁,无需手动处理
- 若不想让任务无限等待,可添加
-n参数,此时锁被持有会直接退出任务:flock -n /var/run/job_mutex.lock || exit 1 flock基于文件描述符实现锁机制,进程结束后锁会自动释放,不会遗留死锁问题。
3. Cron调度规则保持不变
原Cron规则无需修改,锁逻辑已在脚本内部处理:
0 9,11,14 * * 1-5 /bin/bash /home/userName/Desktop/Auto/job_1.sh 0 8-17 * * 1-5 /bin/bash /home/userName/Desktop/Auto/job_2.sh */6 * * * * /bin/bash /home/userName/Desktop/Auto/job_3.sh */20 * * * * /bin/bash /home/userName/Desktop/Auto/job_4.sh
可选优化
- 若需要记录任务等待和执行状态,可添加日志输出:
echo "$(date '+%Y-%m-%d %H:%M:%S'): 等待获取执行锁..." >> /var/log/job_mutex.log flock /var/run/job_mutex.lock || exit 1 echo "$(date '+%Y-%m-%d %H:%M:%S'): 获取锁成功,开始执行任务..." >> /var/log/job_mutex.log
内容的提问来源于stack exchange,提问作者Lastwish
相关产品推荐
相关产品推荐

