Cron Job:伺服器維護必須掌握的必殺技

Cron Job:伺服器維護必須掌握的必殺技

文章目录

  • 什麼是Cron Job?
  • Cron的隱喻
  • Cron Job的剖析
  • 伺服器管理員為何鍾愛Cron Job
  • 1. 節省時間
  • 2. 保持一致性
  • 3. 您的伺服器永不休眠
  • 4. 錯誤日誌 > 人類記憶
  • 5. 專為可擴充套件性而構建
  • 設定Cron Job:分步指南
  • 步驟 1:確認Cron已安裝
  • 步驟 2:瞭解Crontab
  • 步驟 3:Cron Job語法
  • 步驟 4:建立您的第一個Cron Job
  • 步驟 5:儲存並驗證
  • 面向網站管理員的實用cron job示例
  • 資料庫備份
  • 日誌輪換和清理
  • 網站效能監控
  • 內容更新
  • 電子郵件報告
  • 安全掃描
  • Cron Job最佳實踐:注意事項
  • 應該
  • 不應該
  • Cron Job出錯時該怎麼辦
  • 常見問題 #1:作業無法執行
  • 常見問題 #2:作業執行但失敗
  • 常見問題 #3:郵件氾濫
  • 常見問題 #4:時間問題
  • 高階Cron Job編寫技巧
  • 使用特殊字串
  • Crontab中的環境變數
  • 以不同使用者身份執行作業
  • 在非常開機的機器上使用Anacron
  • 複雜工作流程的作業鏈
  • 監控Cron Job
  • 談談成本
  • 寫在最後

Cron Job:伺服器維護必須掌握的必殺技

你想每天凌晨兩點起床,清理日誌、清理臨時檔案,然後執行相同的伺服器維護任務嗎?

好吧,我也不想。管理著全球超過 140 億臺伺服器的數百萬伺服器管理員也不想。

所以,別再胡鬧了——我求求你!

Cron 作業就是為此而生的。

因為,說實話,沒有什麼比沉睡並將指令碼為你完成的工作據為己有更能體現“稱職的系統管理員”的了。這叫做“利用你的資源”。

有了 Cron 作業:

  • 你的老闆認為你很敬業。
  • 你的伺服器知道你很懶。
  • 你們之間存在著一種美好的共生關係,叫做自動化。

今天,你將成為一名 Cron 作業專家。

什麼是Cron Job?

Cron job 本質上是類 Unix 作業系統(Linux、macOS)內建的任務排程程式,可讓您在指定的時間和日期自動執行 Linux 命令

您可以將其想象成伺服器的待辦事項列表,但……這個待辦事項確實會完成。

Cron的隱喻

如果你的伺服器基礎設施是餐廳:

  • cron daemon 就像是檢視每日日程安排的經理。
  • crontab 是員工分配板。
  • 每個 cron job 都是在特定時間分配給特定員工的任務。
  • command 是實際正在執行的工作。

當時鍾到達預定時間時,經理會拍拍被分配員工的肩膀說:“表演時間到了!”

然後,員工會毫無異議地執行他們的任務。

如果我們人類也能如此可靠,世界將會變得截然不同!

Cron Job的剖析

每個 Cron 作業都包含兩個主要部分:

  1. 何時執行(計劃)
  2. 執行什麼(要執行的命令或指令碼)

計劃使用一種特定的語法,乍一看可能像是某種計算機魔法:

Cron Job的剖析

但仔細觀察,你就會明白。

每個星號都可以替換為特定的值、範圍或間隔,從而精確地建立你所需的計劃。

伺服器管理員為何鍾愛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,它可能會要求您設定預設編輯器。

開啟 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

使用 startenable 命令,我們將啟動 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

系統級 crontab

步驟 3:Cron Job語法

我們之前已經討論過 Cron 作業的基本結構。

但是,建立 Cron 作業有時會令人困惑。Crontab.guru 可以幫助您在輸入作業計劃時將其視覺化。

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 作業順利執行,避免問題多於其解決的問題,以下是一些重要的最佳實踐。

應該

  1. 始終使用命令和檔案的完整路徑:您的 Cron 環境與使用者 Shell 的 PATH 不同,因此 "/usr/bin/python" 比使用 python 更好。
  2. 重定向輸出以防止垃圾郵件:預設情況下,Cron 會將所有輸出透過電子郵件傳送給使用者。新增 >/dev/null 2>&1 可以抑制輸出,或重定向到日誌檔案。
  3. 在排程命令之前測試它們:手動執行命令以確保其按預期工作。

新增註釋來解釋每個作業——將來您會感謝您記錄每個 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

不應該

  1. 不要在高峰時段安排資源密集型任務:您的備份無需在站點最繁忙的中午執行。
  2. 不要使用相對路徑:"./script.sh" 在 cron 中幾乎肯定會失敗。
  3. 不要忘記環境變數:Cron 不會載入您的 .bashrc 或 .profile 檔案。請在 crontab 或指令碼中設定所有必要的變數。
  4. 不要忽視日誌記錄:如果沒有適當的日誌記錄,除錯 cron 任務可能會成為一場噩夢。
  5. 不要過度:過多頻繁的 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 的使用者來說,流程非常簡單:

  1. 透過 SSH 連線到您的伺服器
  2. 執行 crontab -e 編輯您的個人 cron 表
  3. 新增您的計劃任務
  4. 儲存,然後開始自動化!

就是這樣。您已經付費的基礎設施突然變得更有價值、更高效。

寫在最後

您已從體力勞動晉升到自動化魔法師的行列。有了 cron 作業處理日常維護、備份和監控,您可以專注於發展網站和業務,而無需操心伺服器的日常維護。

請記住,這將是一個過程。隨著您新增越來越多的任務,自動化將變得更加複雜。

但現在,請先從幾個基本的 cron 作業開始,監控它們的執行情況,並隨著您對流程的熟悉逐漸擴充套件您的自動化功能。

現在,去休息吧,因為您剛剛節省了一大筆時間。

評論留言