You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 07:05:19