
你想每天凌晨兩點起床,清理日誌、清理臨時檔案,然後執行相同的伺服器維護任務嗎?
好吧,我也不想。管理著全球超過 140 億臺伺服器的數百萬伺服器管理員也不想。
所以,別再胡鬧了——我求求你!
Cron 作業就是為此而生的。
因為,說實話,沒有什麼比沉睡並將指令碼為你完成的工作據為己有更能體現“稱職的系統管理員”的了。這叫做“利用你的資源”。
有了 Cron 作業:
- 你的老闆認為你很敬業。
- 你的伺服器知道你很懶。
- 你們之間存在著一種美好的共生關係,叫做自動化。
今天,你將成為一名 Cron 作業專家。
什麼是Cron Job?
Cron job 本質上是類 Unix 作業系統(Linux、macOS)內建的任務排程程式,可讓您在指定的時間和日期自動執行 Linux 命令。
您可以將其想象成伺服器的待辦事項列表,但……這個待辦事項確實會完成。
Cron的隱喻
如果你的伺服器基礎設施是餐廳:
- cron daemon 就像是檢視每日日程安排的經理。
- crontab 是員工分配板。
- 每個 cron job 都是在特定時間分配給特定員工的任務。
- command 是實際正在執行的工作。
當時鍾到達預定時間時,經理會拍拍被分配員工的肩膀說:“表演時間到了!”
然後,員工會毫無異議地執行他們的任務。
如果我們人類也能如此可靠,世界將會變得截然不同!
Cron Job的剖析
每個 Cron 作業都包含兩個主要部分:
- 何時執行(計劃)
- 執行什麼(要執行的命令或指令碼)
計劃使用一種特定的語法,乍一看可能像是某種計算機魔法:

但仔細觀察,你就會明白。
每個星號都可以替換為特定的值、範圍或間隔,從而精確地建立你所需的計劃。
伺服器管理員為何鍾愛Cron Job
伺服器管理員(甚至包括我)在討論 Cron 作業時會眼眶溼潤是有原因的。
它們將伺服器管理變成了(至少在某種程度上)類似於工作與生活平衡的事情。
1. 節省時間
還記得時間嗎?那件你永遠覺得不夠用的東西?Cron 作業會把時間還給你。你設定了它們,然後就忘記了,而且你幾乎從來不會去看它們。
(嗯,直到它們崩潰或者你需要更改計劃。)
2. 保持一致性
人類的本性是不一致的。我們會忘記事情。我們會打錯字。我們會被貓咪影片分散注意力。而 Cron 作業每次都以完全相同的方式執行完全相同的任務——沒有例外。
3. 您的伺服器永不休眠
有了 cron 作業,無論您是醒著、睡著,還是在海灘上啜飲瑪格麗塔雞尾酒,基本維護工作都可以 24/7/365 全天候進行。
4. 錯誤日誌 > 人類記憶
當您手動執行任務時,您能準確地記住自己做了什麼以及何時做的嗎?可能記不住。
但是,您可以配置 cron 作業來記錄其活動,從而建立所有自動化操作的紙質記錄,以便進行故障排除和驗證。
5. 專為可擴充套件性而構建
隨著您的基礎設施規模不斷擴大,手動管理所有操作的難度將呈指數級增長。而 cron 作業則可以輕鬆擴充套件。
這意味著,同一項作業可以在多臺伺服器上執行,而無需您投入額外的時間。
設定Cron Job:分步指南
理論知識講得夠多了!你需要親自動手,進行一些實際的 Cron job 設定。
步驟 1:確認Cron已安裝
大多數類 Unix 系統都預裝了 Cron。要檢查它是否可用,請輸入以下命令:
crontab -e
根據預設編輯器,該命令將使用您指定的編輯器開啟 crontab。如果您以前從未使用過 crontab,它可能會要求您設定預設編輯器。

如果終端顯示“command not found”,則需要使用以下命令安裝 cron:
- Ubuntu/Debian:
sudo apt update && sudo apt install cron - CentOS/RHEL:
sudo yum install cronie
完成後,啟動並啟用 cron 服務:
sudo systemctl start cron sudo systemctl enable cron
使用 start 和 enable 命令,我們將啟動 cron 服務來執行 cron 任務。
使用 enable 命令,我們可以確保即使您的伺服器重啟,cron 服務也會自動重啟,並且不會錯過任何 cron 任務。
提示:CentOS 將 cron 服務稱為“crond”,因此您需要啟動並啟用 crond 服務。
步驟 2:瞭解Crontab
好的,開啟 crontab 或 crontable 開始新增您的計劃任務。
系統中的每個使用者都可以擁有自己的 crontab 檔案。此外,還有一個系統範圍的 crontab。
要編輯您的個人 crontab:
crontab -e
這將在您的預設文字編輯器中開啟您的 crontab 檔案。如果這是您第一次使用,請選擇 nano 編輯器(選項 1),因為它最適合初學者。
對於系統級 crontab,請使用 sudo 許可權執行以下命令:
sudo nano /etc/crontab

步驟 3:Cron Job語法
我們之前已經討論過 Cron 作業的基本結構。
但是,建立 Cron 作業有時會令人困惑。Crontab.guru 可以幫助您在輸入作業計劃時將其視覺化。

現在到了有趣的部分——編寫我們的第一個 Cron 作業。讓我們來看看一些常見的 Cron 作業計劃:
每分鐘:
* * * * /path/to/command
每小時 0 分鐘:
0 * * * * /path/to/command
每天午夜:
0 0 * * * /path/to/command
每週一凌晨 3 點:
0 3 * * 1 /path/to/command
每15分鐘:
*/15 * * * * /path/to/command
每月第一天上午 6:30:
30 6 1 * * /path/to/command
步驟 4:建立您的第一個Cron Job
讓我們開始為您的伺服器建立一個簡單的備份 Cron 作業。
以下任務每天凌晨 2 點建立您網站的備份。
0 2 * * * tar -czf /path/to/backup/website-backup-$(date +%Y%m%d).tar.gz /path/to/your/website
它將輸出您的網站目錄的壓縮 tar 存檔,並以當前日期作為檔名。
步驟 5:儲存並驗證
現在,退出編輯器。在 nano 中,按下 Ctrl+X,然後按 Y。
要檢視當前的 crontab 並驗證您的任務是否已新增:
crontab -l

就這樣!您的第一個 cron 作業現已設定完畢,並將在預定時間自動執行。
面向網站管理員的實用cron job示例
現在您已經瞭解了基礎知識,讓我們來探索一些實用的 cron 作業,它們可以顯著簡化您作為網站管理員的工作。
資料庫備份
MySQL 資料庫備份(每天凌晨 1 點):
0 1 * * * mysqldump -u username -p'password' database_name | gzip > /path/to/backups/db-backup-$(date +%Y%m%d).sql.gz
日誌輪換和清理
清理超過 7 天的日誌(每週日):
0 0 * * 0 find /path/to/logs -type f -name "*.log" -mtime +7 -delete
網站效能監控
每 5 分鐘檢查一次網站響應時間:
*/5 * * * * curl -o /dev/null -s -w "%{http_code} %{time_total}sn" example.com >> /path/to/logs/website-performance.log
內容更新
獲取並更新動態內容(每小時):
0 * * * * /path/to/content-update-script.sh
電子郵件報告
每週一上午 9 點傳送每週流量摘要:
0 9 * * 1 /path/to/generate-and-email-report.sh
安全掃描
每天凌晨 3 點執行安全掃描指令碼:
0 3 * * * /path/to/security-scan.sh
Cron Job最佳實踐:注意事項
為了確保您的 Cron 作業順利執行,避免問題多於其解決的問題,以下是一些重要的最佳實踐。
應該
- 始終使用命令和檔案的完整路徑:您的 Cron 環境與使用者 Shell 的 PATH 不同,因此
"/usr/bin/python"比使用 python 更好。 - 重定向輸出以防止垃圾郵件:預設情況下,Cron 會將所有輸出透過電子郵件傳送給使用者。新增
>/dev/null 2>&1可以抑制輸出,或重定向到日誌檔案。 - 在排程命令之前測試它們:手動執行命令以確保其按預期工作。
新增註釋來解釋每個作業——將來您會感謝您記錄每個 Cron 作業的功能及其原因。
Daily database backup - Added by Jane on 2023-05-15 0 1 * * * /path/to/backup-script.sh
考慮對長時間執行的作業使用鎖檔案,以防止在前一個例項仍在執行時啟動新例項。
0 * * * * flock -n /tmp/script.lock /path/to/your/script.sh
不應該
- 不要在高峰時段安排資源密集型任務:您的備份無需在站點最繁忙的中午執行。
- 不要使用相對路徑:
"./script.sh"在 cron 中幾乎肯定會失敗。 - 不要忘記環境變數:Cron 不會載入您的 .bashrc 或 .profile 檔案。請在 crontab 或指令碼中設定所有必要的變數。
- 不要忽視日誌記錄:如果沒有適當的日誌記錄,除錯 cron 任務可能會成為一場噩夢。
- 不要過度:過多頻繁的 cron 任務可能會導致伺服器過載。要有策略性。
Cron Job出錯時該怎麼辦
只有在 Cron 作業中斷時才需要回顧它——當它中斷時,以下是如何診斷和修復常見問題的方法。
常見問題 #1:作業無法執行
症狀:您的計劃任務似乎根本沒有執行。
可嘗試的修復方法:
- 檢查 Cron 守護程序是否正在執行:“systemctl” status cron
- 驗證您的 crontab 語法:使用類似 crontab.guru 的工具
- 確保可執行檔案的完整路徑:使用哪個命令查詢完整路徑
- 檢查檔案許可權:指令碼必須是可執行的 (chmod +x script.sh)
常見問題 #2:作業執行但失敗
症狀:作業執行但未成功完成其任務。
可嘗試的修復方法:
- 將輸出重定向到日誌檔案以檢視錯誤:
* * * * /path/to/script.sh > /path/to/script.log 2>&1 - 在相同環境下手動測試該命令
- 檢查 cron 環境中可能缺少的依賴項
常見問題 #3:郵件氾濫
症狀:您的收件箱被 cron 輸出郵件淹沒。
可嘗試的修復方法:
- 將輸出重定向至 null:
>/dev/null 2>&1 - 重定向至日誌檔案:
>/path/to/logfile.log 2>&1
僅在發生錯誤時傳送電子郵件:
* * * * /path/to/script.sh >/dev/null || echo "Script failed" | mail -s "Cron failure" you@example.com
常見問題 #4:時間問題
症狀:作業在非預期的時間或頻率執行。
可嘗試的修復方法:
- 仔細檢查您的時區設定——日期與 cron 的預期時間
- 注意可能影響時間的夏令時 (DST) 變化
- 當精度要求較高時,請使用明確的時間框架,而不是相對時間框架
高階Cron Job編寫技巧
我們已經瞭解了基礎知識,現在您已經是 Cron 作業的專家了。但本節將帶您更進一步。
使用特殊字串
您不必總是使用星號來編寫 Cron 作業。有一些特殊字串可以讓您輕鬆設定 Cron 作業。
- @yearly 或 @annually:每年執行一次 (0 0 1 1 *)
- @monthly:每月執行一次 (0 0 1 * *)
- @weekly:每週執行一次 (0 0 * * 0)
- @daily 或 @midnight:每天執行一次 (0 0 * * *)
- @hourly:每小時執行一次 (0 * * * *)
- @reboot:啟動時執行一次
例如,如果您希望每天執行某些程式,只需輸入以下命令:
@daily /path/to/daily-backup.sh
Crontab中的環境變數
為了避免在 cron 作業中反覆重複輸入某個字串(例如,指定路徑或管理員郵箱),請在 crontab 的開頭設定環境變數。
然後,您可以在指令碼或命令中根據需要重複使用這些變數。
SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin MAILTO=admin@example.com # This job will send errors to admin@example.com 0 2 * * * /path/to/mailing_script.sh
如果我們在 mailing_script.sh 中使用環境變數 MAILTO,指令碼將自動向正確的電子郵件地址傳送電子郵件。
這樣,更改管理員電子郵件地址只需更改 MAILTO 變數的值,而無需在所有指令碼中進行更改。
以不同使用者身份執行作業
如果您擁有超級使用者許可權,則可以編輯其他使用者的 crontab:
sudo crontab -u username -e
在非常開機的機器上使用Anacron
與 cron 不同,anacron 即使在計劃時間內計算機處於關閉狀態,也能確保作業執行:
sudo apt install anacron
編輯 /etc/anacrontab 以新增系統恢復線上時將執行的作業。
複雜工作流程的作業鏈
按順序執行作業:
0 1 * * * /path/to/first-script.sh && /path/to/second-script.sh
監控Cron Job
對於嚴肅的伺服器管理,可以考慮使用 Cronitor 等工具來監控和提醒您的 Cron 作業。
0 * * * * cronitor exec check-12345 -- /path/to/your/script.sh
談談成本
Cron 作業不能孤立存在。它們需要一臺伺服器以及執行在伺服器上的一項服務,而您需要管理這些服務。
現在,如果您正在閱讀這篇文章,那麼您很可能已經擁有一臺用於執行網站或應用程式的伺服器。
事實上,如果您使用 VPS 或任何基於 Linux 的主機提供商,那麼您已經具備了開始自動化伺服器管理任務所需的一切。
如果沒有,那麼每月 10 美元的 VPS 就足夠了,尤其是在剛開始使用時。
對於已經在使用 VPS 的使用者來說,流程非常簡單:
- 透過 SSH 連線到您的伺服器
- 執行 crontab -e 編輯您的個人 cron 表
- 新增您的計劃任務
- 儲存,然後開始自動化!
就是這樣。您已經付費的基礎設施突然變得更有價值、更高效。
寫在最後
您已從體力勞動晉升到自動化魔法師的行列。有了 cron 作業處理日常維護、備份和監控,您可以專注於發展網站和業務,而無需操心伺服器的日常維護。
請記住,這將是一個過程。隨著您新增越來越多的任務,自動化將變得更加複雜。
但現在,請先從幾個基本的 cron 作業開始,監控它們的執行情況,並隨著您對流程的熟悉逐漸擴充套件您的自動化功能。
現在,去休息吧,因為您剛剛節省了一大筆時間。

評論留言