在 Linux 中使用 Crontab 安排任務

  • Cron 是執行計劃任務的守護進程,而 Crontab 是定義這些任務的文件,它採用靈活的語法,基於五個時間字段和命令字段。
  • 正確配置時間、權限、絕對路徑和環境變數是確保 cron 作業正確運行而不出現靜默錯誤的關鍵。
  • Cron 可以自動執行備份、清理、更新和監控,但如果計劃不周,可能會影響系統效能和安全性。
  • 在更複雜的場景或其他系統中,可以使用 Anacron、Fcron、launchd 等工具和替代方案或外部服務來擴展或替換 Cron。

在 Linux 中使用 Crontab 安排任務

如果你每天都使用 Linux,那麼遲早你會需要它。 使用 Cron 和 Crontab 自動執行重複性任務備份、更新、報告產生、文件清理、監控……手動完成所有這些工作既耗時又容易遺忘。而 Cron 正是解決這些問題的工具,幾十年來一直是 Unix 和 GNU/Linux 系統管理的基石。

雖然乍看 Crontab 的語法可能有點嚇人,但一旦你理解了它的邏輯,你就會發現 在 Linux 中使用 Crontab 調度任務比看起來容易得多。本文提供了全面的指南:Cron 是什麼,Crontab 是什麼,如何編寫規則,如何調試錯誤,它對性能的潛在影響,您可以使用的外部工具,其他系統中的替代方案,以及家庭和商業用例。

Cron 和 Crontab 的差別

人們經常把 Cron 和 Crontab 當作同一件事來談論,但實際上它們並非同一回事。 它們是兩個不同的部件,但需要協同工作。理解這種差異可以幫你省去很多調試未運行任務的麻煩。

  • 克龍 它是從系統啟動之日起就在背景運行的守護程式。它的功能非常簡單: 每分鐘檢查一系列設定檔 並檢查是否需要根據系統日期和時間執行任何計劃任務。
  • crontab中就其本身而言,它是 這些任務定義在一個文字檔中。每個使用者都可以擁有自己的 crontab 文件,其中包含自己的規則和腳本,並以各自的權限執行這些規則和腳本。 Cron 守護程式會讀取這些文件,並在適當的時候執行相應的命令。

在任何現代Linux發行版中,這兩個元件預設都是可用的。 幾乎在任何發行版中,你都可以安排重複性任務。無論是 Debian、Ubuntu、Oracle Linux、CentOS、Rocky、Fedora 等。

cron的

什麼是 Cron?為什麼系統時間至關重要?

Cron 是一個 Linux啟動時啟動的系統守護程式它通常透過經典的啟動腳本啟動。 / etc / init.d下 或採取類似的路線,例如 /etc/rc.d或使用 systemd 單元(根據發行版的不同,可能是 crond 或 cron 服務)。它每分鐘檢查一次:

/etc/crontab、/etc/cron.d、/var/spool/cron 和 /var/spool/cron/crontabs (具體路徑因發行版而異),搜尋與目前分鐘數相符的條目。如果找到匹配項,則執行指定的命令。

許多人忽略的一點是: Cron 完全依賴系統時間如果時鐘或時區設定不正確,您的任務將在錯誤的時間運行。要在現代系統中檢查時間,您可以使用:

timedatectl

此指令顯示本機時間、UTC時間、時區,以及系統是否正在與NTP(網路時間協定)伺服器同步。理想情況下, NTP同步已啟動因為這樣時鐘就能自動校正時間。

如果發現時區不正確,可以使用類似這樣的指令進行更改。 timedatectl 設定時區為 Europe/Madrid 或選擇與您所在國家/地區相符的其他時區。此外,在許多 Linux 系統中,NTP 會自動配置,但如果您想自訂配置,您也可以… /etc/ntp.conf中 或使用 Chrony 等替代服務。

什麼是 Crontab?它的結構是怎樣的?

Crontab是 用於編寫計劃任務執行規則的文件每一行(忽略註解)代表一個「任務」:運行時間和執行的命令。通常,每個使用者在後台作業目錄中都有自己的 crontab 檔案。 / var / spool / cron o /var/spool/cron/crontabs根據發行版的說法。

若要管理您的個人 crontab,請使用下列命令 crontab中 它提供了一些非常基礎但功能強大的選項。這些文件不是用原始編輯器手動編輯的,而是透過此命令編輯,以避免權限或格式錯誤。

Crontab 單行指令的基本語法是基於 五個時間字段加上命令:

m h dom mon dow comando

  • u人 (m):取值範圍為 0 到 59。
  • 時間 (h):取值範圍為 0 到 23。
  • 一個月中的某天 (太陽):1 至 31。
  • MES (星期一):1 到 12 或縮寫名稱(根據系統,Jan、Feb 等)。
  • 平日 (向下):從 0 到 6 或 0 到 7,星期日為 0(有時為 7)。
  • 命令:任何可以在終端機中執行的命令,包括腳本和重定向。

一個典型的例子是:

00 19 * * * /home/usuario/scripts/backup.sh

這一行表示腳本將被執行。 每天晚上7點 (晚上 7 點),不論當月哪一天、哪一個月份或星期幾。

crontab中

如何建立、編輯和列出您的 Crontab

要處理個人任務文件,幾乎總是需要使用命令本身。 crontab中。 這個想法是 請勿手動編輯 /var/spool/cron/crontabs 目錄下的檔案。因為它們的設計初衷就是由系統自動管理。

最常見的訂單是:

  • crontab -e命令在預設文字編輯器中開啟你的 crontab 檔案(許多發行版都自備此功能)。 VIM o 納米)建立或修改條目。
  • crontab -l:在螢幕上顯示為您的使用者安排的所有任務。
  • crontab -r刪除您的整個 crontab 檔案;此操作不可逆。 如果不加入 -i 參數,它不會要求確認。.
  • crontab -i -r刪除 crontab 前會請求確認。
  • crontab文件:將目前 crontab 替換為指定檔案的內容。
  • crontab -u用戶: 管理其他使用者的 crontab(僅限 root 使用者或具有相應權限的使用者)。
  • crontab -c目錄:在支援的系統中,定義 crontab 將儲存在哪個目錄中。

如果您想備份設置,可以這樣做:

crontab -l > ~/crontab_backup.txt

如果以後需要恢復,只要:

crontab ~/crontab_backup.txt

進階語法:Crontab 中的特殊字符

除了數字之外,Crontab 還允許您使用 特殊字符使語法更加靈活借助它們,您可以以簡潔的方式表達範圍、清單或區間。

  • *(星號): 表示該欄位中的「所有可能值」。例如, * 在小時字段中 意思是所有時間。
  • , (吃)單獨的 具體數值列表。 範例: 0 6,18 * * * 演出時間為早上 6 點和下午 6 點。
  • - (腳本):定義一個 連續範圍。 範例: 0 8-17 * * 1-5 週一至週五,上午 8 點至下午 17 點,每小時一班。
  • /(斜線)標記一 步驟或間隔。 例如, */10 * * * * 意思是「每 10 分鐘一次」。
  • 範圍/例外 (取決於具體實現):有些變體允許定義排除值,儘管這並非所有 cron 作業的標準做法。

組合使用的典型例子是:

*/5 2 * * 1-5 /bin/ejecutar/script.sh

這一行啟動指令 週一至週五,每 2 小時(2:00)每隔 5 分鐘播放一次這是一種簡潔的方式來取代冗長的會議記錄。

性格 # (軟墊) 在行首,它的作用是 添加評論同一行中該符號之後的所有內容都將被忽略,這非常適合記錄某個工作存在的原因,或者在不刪除工作的情況下暫時停用它。

Crontab 中的關鍵字和時間快捷方式

對於最常見的情況,Crontab 提供 以「保留字」形式存在的捷徑 這些字段可以替換所有時間字段。當您想要設定「每天」或「每小時」之類的時間,而又不想考慮具體數字時,它們非常有用。

  • @重啟執行該命令 系統啟動後.
  • @每年 o @每年:每年一次,相當於 0 0 1 1 *.
  • @每月每個月一次,在第一天的午夜,相當於 0 0 1 * *.
  • @每週:每週一次,在第 0 天(通常是星期日)午夜,相當於 0 0 * * 0.
  • @日常的 o @午夜每天一次,在 00:00,相當於 0 0 * * *.
  • @每小時:每小時一次,在第 0 分鐘,相當於 0 * * * *.

例如,如果你想執行一個腳本 每小時,足夠了:

@hourly /bin/ejecutar/script.sh

如果您希望啟動維護腳本,請點擊此處。 每次重新啟動後您可以使用:

@reboot /ruta/a/mi_script.sh

環境變數和命令語法

常見的錯誤來源是: Cron 在最小環境下運行它沒有為你充電 的.bashrc 也不是您的整個使用者環境,所以 路徑非常有限 (通常是這樣的) /usr/bin:/bin這使得諸如此類的命令成為可能 Python、Git、PHP 或 Pip 如果不使用絕對路徑,則無法找到它們。

為了避免這種情況,你有兩個選擇: 始終使用完整路徑 在你的腳本中(例如, /usr/bin/python3 代替 python)o 在 crontab 檔案的開頭定義環境變數。例如:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SHELL=/bin/bash
HOME=/home/usuario

這些行位於 crontab 檔案的開頭, 無時間字段並影響您在下方聲明的其他作業。您也可以定義 郵件 指示作業的標準輸出和錯誤輸出會傳送到哪個電子郵件地址。

記住 Crontab 中的命令接受所有 shell 語法您可以將輸出重定向到文件,使用管道符連接命令等等。例如,要 將所有腳本輸出儲存到日誌中:

* * * * * /home/usuario/helloworld.sh >> /var/log/logs.log 2>&1

如果你想 完全靜音訊息,不接收電子郵件 對於那份工作,你可以重定向到 的/ dev / null的:

* * * * * /home/usuario/helloworld.sh >/dev/null 2>&1

輸出管理:日誌和電子郵件

根據發行版和配置的不同,Cron 輸出可以透過多種方式處理。在 Oracle Linux 或精簡版 Debian 等系統中,如果沒有安裝郵件代理, cron守護程式直接將輸出傳送到日誌系統。.

在許多情況下,您可以在諸如以下文件中查看 cron 活動:

  • /var/log/cron (常見於 Oracle Linux、CentOS、RHEL)。
  • 在/ var / log / syslog的 (在 Debian 及其衍生版本中常見)。

例如,對於 僅篩選與 cron 相關的訊息 在使用 syslog 的系統中,您可以執行類似以下的操作:

grep CRON /var/log/syslog

資訊通常很簡短(時間、使用者、命令),但可以幫助您了解某些內容是否正在運行或是否出現故障。

如果您安裝了郵件傳輸代理程式 (MTA),例如 Postfix 或 Sendmail然後,將作業的輸出結果送出去。 傳送到使用者的本機郵件佇列它通常儲存在 /var/spool/mail/$USER 或類似的路徑,你可以使用諸如此類的工具來閱讀它。 mailx的 (命令 mail).

此外,您可以使用變數來控制定時任務郵件的收件者。 郵件 在 crontab 的開頭:

MAILTO="[email protected]"

如果您將 MAILTO 留空,像這樣:

MAILTO=""

然後 該 crontab 中定義的任何作業都不會傳送電子郵件。如果您有很多任務會持續產生輸出,這將非常有用。

crontab大師

用於處理 Cron 的工具和實用程序

如果您不習慣手動編寫 cron 表達式,可以使用以下幾種方法: 幫助你產生規則而不會出錯的工具有些是網路服務,有些是圖形應用程式。

  • Crontab專家: 這是一個非常實用的頁面,您可以在其中編寫 cron 表達式,然後… 請用簡單易懂的文字解釋它的功能它會提醒您注意錯誤,並提供常見範例和技巧。
  • 定時任務產生器線上助手,可根據時間、日期、間隔等選項產生 cron 表達式。允許您建立循環任務。 預定義設置 並進行個人化訂製。
  • 易克朗:雲端服務 安排對 URL 的 HTTP 請求 依指定時間間隔執行。廣泛用於啟動 Web 腳本、API 任務等,並具有控制面板、日誌和電子郵件警報功能。
  • KDE Cron (KCron):一個整合到 KDE 環境中的圖形工具,用於 無需使用命令列即可建立、修改和刪除 cron 作業它允許您透過視覺化介面選擇時間和日期。
  • 定時任務產生器:專為線上 cron 表達式產生器而設計 與 Quartz 庫集成 (廣泛用於 Java 環境),也有助於理解複雜的組合。

這些工具並不能取代系統中的 Cron,但是 它們簡化了表達式的組成部分。減少語法錯誤。

Crontab 的類型:系統與用戶

在 Linux 系統中,用於規劃任務的設定檔主要有兩種類型: 系統定時任務使用者 crontab兩者使用的語法非常相似,但它們的管理方式卻不同。

El 系統的Cronab,通常在 / etc / crontab中 以及在文件中 /etc/cron.d,通常需要 根權限它用於關鍵系統任務(日誌輪替、資料庫維護、進階備份任務等),與使用者 crontab 不同,它在每一行中都明確地包含使用者欄位以進行指示。 該指令是以什麼身分執行的?.

很多 使用者 crontab 以……進行管理 crontab -e命令 並儲存在 /var/spool/cron/crontabs 或類似地點。 只有使用者才能提交職位資訊。 (或 root 用戶,他們可以管理其他人的 cron 任務),這些檔案不應該直接編輯。要限制誰可以使用 cron,您可以修改這些檔案。 /etc/cron.allow y /etc/cron.deny.

Cron 和 Crontab 對效能的影響

雖然 Cron 本身消耗的資源很少,但糟糕的任務規劃可能會造成資源浪費。 對系統效能產生負面影響問題通常不在於 cron 守護程序,而在於我們命令它執行的內容。

當您安排多個任務同時觸發時,可能會導致… CPU和記憶體使用率峰值例如,同時執行三個大型備份、資料庫重新索引和日誌分析腳本幾乎肯定會導致伺服器速度變慢。

如果任務涉及網路(遠端複製, 使用 rclone 進行同步(海量資料傳輸),您可以生成 頻寬過載、延遲增加和 ping 值上升影響依賴於該連接的其他服務。

還存在以下風險 任務衝突兩個腳本同時對同一個檔案或資料庫執行不同的操作可能會導致資料損壞或難以診斷的奇怪故障。

為了減少影響,您可以使用以下工具: 尼斯 降低作業的 CPU 優先權,或者 CPU限制 限制進程可使用的 CPU 最大百分比:

  • CPU優先權低:
    0 19 * * * usuario nice -n 19 /ruta/script.sh
  • 限制CPU使用率至50%:
    0 19 * * * usuario cpulimit -l 50 /ruta/script.sh

使用 Crontab 執行例行任務:備份、清理和監控

Cron 的一大優點在於它允許你 實現機器「維護」自動化 幾乎毫不費力地就能提高中期性能並節省時間。

一個非常典型的用法是 定期清理暫存檔案、快取和空目錄透過編寫腳本刪除特定路徑中的舊文件或空文件,可以釋放空間並減少文件系統碎片。

另一種有用的模式是 日程系統和應用程式更新 在非尖峰時段。例如,夜間啟動的工作 apt 更新 && apt 升級 (或您發行版中的等效功能)讓系統在不中斷日常工作的情況下保持最新狀態。

你也可以自動化 關閉長時間未使用的申請釋放記憶體供其他進程使用。在桌面或應用程式伺服器環境中,這會產生顯著的效能提升。

當然,Cron 非常適合… 監控和日誌腳本定期捕獲 CPU、RAM、磁碟使用情況、網路延遲等數據,並將其儲存在日誌檔案中,然後分析趨勢,以便在瓶頸演變成嚴重事件之前發現它們。

Cron 和 Crontab 的缺點和局限性

雖然 Cron 是一個功能極其強大的工具,但它並非萬能的解決方案。它有 值得了解的限制 以免超出其能力範圍。

一方面是 學習曲線如果您之前使用的是圖形化環境或系統(例如 Windows),那麼一開始手動編寫 cron 表達式並且沒有視覺化介面可能會讓您感到害怕。

另一方面,Cron 與 Unix/Linux 生態系緊密相關。你所學到的知識在許多伺服器和類似系統中都很有用,但是… 在 Windows 或 macOS 系統上,您將無法直接使用它。 (它有自己的機制)。

關於安全問題,如果 cron 設定檔保護不力。它們可能成為惡意程式執行的入口。允許任何使用者在不受控制的情況下進行編程,無異於打開了問題的大門。

此外,Cron 它不適用於非常複雜的任務或有很多依賴項的任務。它無法以進階方式處理錯誤流程,不能使用條件邏輯進行重試,也無法與分散式系統原生整合。為此,可以使用更複雜的調度器或 systemd 自帶的計時器。

您還必須記住 crontab 僅提供一分鐘的精確度。如果你需要每秒運行數次或以不到一分鐘的間隔運行某些程序,則必須使用其他工具或在腳本本身中使用程序循環。

Cron 和 Crontab 的替代方案:Anacron、Fcron、hcron、Mcron 等

在某些情況下,Cron 並不完美適用。例如,如果你的筆記型電腦或伺服器並非始終處於開機狀態, 已安排在特定時間執行的任務可能會「遺失」。 如果當時設備已關閉。

為了因應這種情況,還有一些替代方案,例如: 阿納克隆它旨在執行週期性任務 無需機器始終處於開啟狀態如果任務到期時電腦處於關機狀態,Anacron 將在啟動後儘快啟動任務。

弗克龍 這是另一個有趣的選擇。它不需要係統持續運作;它可以與…協同工作。 具體日期和時間並且提供了更大的靈活性,但代價是需要在許多發行版上手動安裝。

hcron 它更進一步,允許使用 用於組織工作、管理機器網路和提高安全性的標籤它雖然不太流行,但在需要集中管理的環境中卻非常適用。

麥康 (基於 Guile)的不同之處在於,它依賴完整的程式語言來定義任務調度,這使其具有… 在重新定義工作、創建依賴關係和處理複雜邏輯方面擁有巨大的權力.

在Windows系統中,則使用Cron等解決方案。 WinCron、VisualCron 或高階任務規劃程序它們提供直覺的圖形介面和類似的功能,儘管它們與微軟生態系統整合在一起。

商業環境中的 Cron 和 Crontab

在各種規模的公司中,Cron 和 Crontab 都是維持系統運作的「黏合劑」。它們允許 自動化重複性和關鍵性流程 無需持續的人工幹預,降低了故障風險,並解放了管理人員的時間。

最常見的商業用途包括: 定期備份、軟體更新、定期報告產生、資料庫維護任務和日誌清理由於語法粒度細化,您可以微調執行操作的時間,從而最大限度地減少影響。

此外,這些自動化操作對…有直接影響 效率和生產力員工無需記住啟動常規流程,人為錯誤減少,低負載視窗期可以更好地用於執行繁重操作。

然而,在商業環境中,這樣做是可取的。 完整記錄所有規劃任務,維護 crontab 的備份,並定期檢查已定義的內容是否仍然合理。隨著時間的推移,很容易累積一些過時的任務,這些任務會持續消耗資源,卻沒有任何貢獻。

最終,Cron 和 Crontab 變成了一種 系統的“自動調度”如果使用得當,它們在小型伺服器和擁有眾多機器的大型基礎設施中都將變得不可或缺,並能幫助您維護一個堅實的基礎,在此基礎上建立其他更高級的編排或監控工具。

綜上所述,很明顯: 在 Linux 系統中使用 Crontab 來調度任務仍然是實現系統自動化最簡單、最強大的方法之一。只需編寫幾行程式碼,您就可以在不觸碰任何按鈕的情況下處理備份、清理、更新、監控和業務流程,前提是您尊重其限制、管理權限、控制環境,並合理規劃對效能和安全性的影響。

自動備份到外接磁碟機
相關文章:
自動備份:保護外部磁碟機上的數據

在 Google 中將其新增為首選來源