Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux 計劃任務完全指南:at 一次性、cron 週期性、anacron 錯過補跑、系統級與用戶級分層管理

編輯:Linux 教學

Linux 任務調度三層體系:at 單次執行、cron 週期執行、anacron 關機補跑。本文系統講解語法、權限控制、日志排查、生產環境最佳實踐。

一、 at:一次性定時任務

基本用法


# 交互式提交
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。

二、 cron:週期性任務調度核心

1. crontab 文件格式


*    *    *    *    *  command
分   時   日   月   周  命令
字段範圍特殊符號
分0-59* */5 1,15 10-20
時0-23
日1-31
月1-12
周0-7 (0/7=周日)

2. 經典範例


# 每天 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

3. 用戶級 crontab 管理


crontab -e    # 編輯當前用戶 (打開編輯器)
crontab -l    # 列出
crontab -r    # 刪除所有 (慎用!)
# 非交互式添加
echo "10 1 * * 7 /backup.sh" | crontab -
# 或追加
(crontab -l; echo "10 1 * * 7 /backup.sh") | crontab -

4. 系統級 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 批量執行目錄腳本。

5. /etc/cron.d/ 目錄

投放獨立任務文件 (格式同 /etc/crontab),便於包管理與版本控制:


# /etc/cron.d/myapp
10 3 * * * appuser /opt/myapp/bin/cleanup.sh

三、 anacron:非 24/7 系統的補跑機制

適用於桌面/筆記本/非持續運行服務器。配置 /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.denyallow > deny
cron/etc/cron.allow/etc/cron.denyallow > deny
  • 兩文件均不存在:at 僅 root,cron 僅 root (部分發行版允許所有)。
  • 同一用戶在 allow 和 deny 中:allow 生效。
  • 被拒絕 cron 的用戶仍可使用 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 會語法檢查

六、 systemd Timer 現代替代 (CentOS 7+)


# /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)、隨機化延遲避免驚群。

Copyright © Windows教程網 All Rights Reserved