Linux 任務調度三層體系:at 單次執行、cron 週期執行、anacron 關機補跑。本文系統講解語法、權限控制、日志排查、生產環境最佳實踐。
# 交互式提交
at 08:08
at> echo "Hello"
at> (EOT)
job 1 at Tue May 21 08:08:00 2024
# 管道提交
echo "backup.sh" | at 02:00 tomorrow
echo "reboot" | at now + 1 hour
| 命令 | 功能 |
|---|---|
atq / at -l | 查看待執行隊列 |
atrm 1 / at -d 1 | 刪除任務編號 1 |
at -c 1 | 查看任務具體內容 |
/etc/at.allow # 白名單,存在時僅允許列表用戶
/etc/at.deny # 黑名單,allow 不存在時生效
# 默認僅有 at.deny 為空,所有用戶可用
注意:at 執行結果以郵件發送給提交用戶,需配置 mailx 或查看 /var/spool/mail/$USER。
* * * * * command
分 時 日 月 周 命令
| 字段 | 範圍 | 特殊符號 |
|---|---|---|
| 分 | 0-59 | * */5 1,15 10-20 |
| 時 | 0-23 | |
| 日 | 1-31 | |
| 月 | 1-12 | |
| 周 | 0-7 (0/7=周日) |
# 每天 17:30 關機
30 17 * * * /sbin/shutdown -h now
# 每周三、六 02:03 清理 yum 緩存
3 2 * * 3,6 /usr/bin/yum clean all
# 每 6 小時更新數據庫
0 */6 * * * /usr/bin/updatedb
# 每小時第 10 分鐘備份 (注意區別 */6)
10 * * * * tar -czf /backup/data-$(date +\%F).tar.gz /data
crontab -e # 編輯當前用戶 (打開編輯器)
crontab -l # 列出
crontab -r # 刪除所有 (慎用!)
# 非交互式添加
echo "10 1 * * 7 /backup.sh" | crontab -
# 或追加
(crontab -l; echo "10 1 * * 7 /backup.sh") | crontab -
/etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts 執行目錄下所有腳本
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
優勢:指定執行用戶 (root)、環境變量、run-parts 批量執行目錄腳本。
投放獨立任務文件 (格式同 /etc/crontab),便於包管理與版本控制:
# /etc/cron.d/myapp
10 3 * * * appuser /opt/myapp/bin/cleanup.sh
適用於桌面/筆記本/非持續運行服務器。配置 /etc/anacrontab:
# 週期(天) 延遲(分) 標識 命令
1 65 cron.daily run-parts /etc/cron.daily
7 70 cron.weekly run-parts /etc/cron.weekly
30 75 cron.monthly run-parts /etc/cron.monthly
cron.daily 目錄腳本,實現「開機必跑」語義。| 服務 | 允許文件 | 拒絕文件 | 優先級 |
|---|---|---|---|
| at | /etc/at.allow | /etc/at.deny | allow > deny |
| cron | /etc/cron.allow | /etc/cron.deny | allow > deny |
at 僅 root,cron 僅 root (部分發行版允許所有)。at。
# 查看執行日志
grep CRON /var/log/cron
grep anacron /var/log/cron
# 常見坑
# 1. 環境變量缺失 → 腳本內显式聲明 PATH 或使用絕對路徑
# 2. 腳本無執行權限 → chmod +x
# 3. 相對路徑失效 → cd 到目錄或用絕對路徑
# 4. 輸出未重定向 → 郵件堆積 / 磁盤滿,建議 > /dev/null 2>&1
# 5. 時間格式錯誤 → crontab -e 會語法檢查
# /etc/systemd/system/backup.timer
[Unit]
Description=Daily backup
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
# /etc/systemd/system/backup.service
[Service]
Type=oneshot
ExecStart=/backup.sh
# 啟用
systemctl enable --now backup.timer
優勢:精確到秒、依賴管理、日志集中 (journalctl)、隨機化延遲避免驚群。