Cron Job 执行顺序设置指南
一、核心原则
二、在同一分钟内强制串行的做法
0 2 * * * /usr/local/bin/serial_tasks.sh >> /var/log/serial_tasks.log 2>&1
#!/usr/bin/env bash
set -e
exec 200>/var/lock/serial_tasks.lock
flock -n 200 || { echo "Another instance is running"; exit 1; }
# 按顺序执行
/usr/local/bin/step1.sh
/usr/local/bin/step2.sh
/usr/local/bin/step3.sh
0 2 * * * timeout 3600 /usr/local/bin/serial_tasks.sh >> /var/log/serial_tasks.log 2>&1
0 2 * * * [ ! -f /var/run/serial_tasks.running ] && { touch /var/run/serial_tasks.running; /usr/local/bin/serial_tasks.sh; rm -f /var/run/serial_tasks.running; } >> /var/log/serial_tasks.log 2>&1
以上做法依赖“一个入口脚本 + 锁 + 日志”,是在纯 cron 环境下实现顺序与互斥的通用模式。
三、跨分钟的顺序依赖与时间设计
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
5 2 * * * /usr/local/bin/cleanup.sh >> /var/log/cleanup.log 2>&1
# 备份任务
0 2 * * * /usr/local/bin/backup.sh && touch /var/run/backup.done || rm -f /var/run/backup.done
# 清理任务(依赖标记)
5 2 * * * [ -f /var/run/backup.done ] && { /usr/local/bin/cleanup.sh; rm -f /var/run/backup.done; } || echo "Backup not done"
四、提升调度与执行优先级的补充手段
# 提高优先级(root)
0 2 * * * nice -n -10 /usr/local/bin/critical.sh >> /var/log/critical.log 2>&1
# 降低优先级(普通用户也可)
0 3 * * * nice -n 10 /usr/local/bin/low_prio.sh >> /var/log/low_prio.log 2>&1
# /etc/systemd/system/mytimer.timer
[Unit]
Description=MyTimer
[Timer]
OnCalendar=*-*-* 02:00:00
AccuracySec=1s
Persistent=true
[Install]
WantedBy=multi-user.target
修改后执行:sudo systemctl daemon-reload && sudo systemctl enable --now mytimer.timertail -f /var/log/cron
# 或在任务中重定向
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
以上可改善“谁先被调度/谁更先拿到 CPU”,但不能替代“任务间依赖与串行”的设计。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。