crontab 定時任務:排程自動化的完整教學 文章首圖

crontab 定時任務:排程自動化的完整教學

crontab 定時任務:排程自動化的完整教學

在 Linux 系統管理中,自動化是提升效率的關鍵。無論是定期備份資料庫、清理暫存檔案,還是監控系統狀態,crontab(Cron Table)都是最經典且強大的工具。它允許使用者精確設定指令在特定時間自動執行。這篇文章將深入解析 crontab 的運作原理與實用技巧,幫助你輕鬆掌握系統排程自動化。

什麼是 crontab?

crontab 是 "Cron Table" 的縮寫,背後由 cron 守護程序(Daemon)驅動。cron 會持續監聽系統時間,當時間符合使用者設定的規則時,就會自動執行對應的指令或腳本。對於伺服器管理者而言,善用 crontab 能大幅減少重複性手動操作,確保系統任務的穩定性。

基本操作與語法解析

在 Ubuntu 22.04 或 Debian 12 中,cron 通常預設已安裝。我們主要透過 crontab 指令來管理使用者的定時任務。

1. 編輯與查看任務

要新增或編輯當前使用者的定時任務,請執行以下指令:

crontab -e

首次執行時,系統可能會詢問你使用哪種文字編輯器,建議選擇 nanovim。編輯完成並儲存後,任務會立即生效。若要查看目前設定的所有任務,可使用:

crontab -l

若希望直接將任務寫入檔案而不進入編輯器,可以使用 -i 選項進行互動式新增,或直接將指令輸出導向至 crontab:

# 將簡單的指令直接加入 crontab
echo "*/5 * * * * /usr/bin/wall 'System check OK'" | crontab -

2. 時間格式详解

crontab 的時間設定由五個欄位組成,順序如下:

分鐘(0-59) 小時(0-23) 日期(1-31) 月份(1-12) 星期(0-7)

每個欄位可以使用特殊符號:

  • *:代表任何時間(例如 * 在小時欄位代表每小時)。
  • ,:分隔多個時間點(例如 1,15,30 代表第 1、15、30 分鐘)。
  • -:代表範圍(例如 1-5 代表 1 到 5)。
  • /:代表步長(例如 */5 代表每 5 個單位)。

實際範例:

# 每小時的第 0 分鐘執行
0 * * * * /path/to/script.sh

# 每週一的早上 9:30 執行
30 9 * * 1 /path/to/backup.sh

# 每月的 1 日和 15 日的午夜 00:00 執行
0 0 1,15 * * /path/to/clean.sh

# 每 5 分鐘執行一次(最常見用法)
*/5 * * * * /path/to/monitor.sh

注意: 星期欄位中,07 都代表星期日。

進階技巧與環境變數

許多新手在寫好 crontab 後發現指令無法執行,通常是因為環境變數(Environment Variables)遺失所致。在終端機中手動執行的腳本,往往依賴 PATHHOME 等變數,但 cron 執行的環境非常簡潔。

1. 指定 Shell 與路徑

建議在 crontab 檔案頂部明確指定 shell 和 PATH:

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# 此後的所有任務都會使用上述環境
*/10 * * * * /home/user/scripts/check_disk.sh

2. 重定向輸出

定時任務的標準輸出(stdout)和標準錯誤(stderr)預設會透過電子郵件發送給使用者。若不想收到垃圾郵件,或需要記錄日誌,應使用重導向:

# 將輸出追加到日誌檔案,錯誤訊息也導向同一檔案
*/5 * * * * /home/user/scripts/backup.sh >> /var/log/backup.log 2>&1

3. 使用 @ 簡寫語法

為了方便閱讀,crontab 支援一些特殊字串來簡寫時間:

  • @reboot:系統啟動時執行一次。
  • @yearly (或 @annually):每年 1 月 1 日 00:00。
  • @monthly:每月 1 日 00:00。
  • @weekly:每週日 00:00。
  • @daily (或 @midnight):每日 00:00。
  • @hourly:每小時 00:00。

範例:每次開機自動啟動一個服務腳本。

@reboot /home/user/scripts/start_service.sh

常見問題與排除

Q1: crontab 設定了但沒執行,該如何除錯?

首先檢查 cron 服務是否正在運行:

sudo systemctl status cron

若服務正常,請檢查 /var/log/syslog/var/log/cron.log(視系統配置而定)尋找錯誤訊息。常見原因包括:

  1. 路徑問題:腳本中使用的命令(如 pythongit)未使用絕對路徑。請使用 which <command> 查找完整路徑。
  2. 權限問題:確保腳本具有執行權限 chmod +x script.sh,且 cron 使用者有權讀取相關檔案。
  3. 環境變數:在腳本開頭加上 env 指令記錄當前環境,確認變數是否正確。

Q2: 如何管理不同使用者的 crontab?

預設情況下,crontab -e 編輯的是當前使用者的任務。若你有 root 權限,可以編輯其他使用者的任務:

# 編輯使用者 'alice' 的 crontab
sudo crontab -u alice -e

# 查看使用者 'bob' 的 crontab
sudo crontab -u bob -l

這對於系統管理員集中管理伺服器任務非常有用。

小結

crontab 是 Linux 系統自動化的基石,雖然其時間語法初看複雜,但透過熟記 */n 步長符號與理解環境變數的重要性,即可應對絕大多數自動化需求。建議在正式部署前,先使用較短的時間間隔(如每分鐘)測試腳本是否按預期運行,確認無誤後再調整為正式排程。掌握 crontab,你將能更從容地管理 Linux 伺服器,讓重複性工作自動化,專注於更重要的系統優化任務。