- Cron 會在精確的時間運行任務,非常適合始終在線的伺服器,而 Anacron 則確保在已關閉的電腦上定期執行任務。
- Cron 使用系統和使用者 crontab,以及 cron.* 和 cron.d 目錄,而 Anacron 依賴 /etc/anacrontab 和 /var/spool/anacron 中的時間戳記。
- Cron 和 Anacron 的結合使用涵蓋了以下兩個面向: El Temppo 例如,不應錯過的每日、每週或每月工作。
- at 或 systemd 定時器等工具可與 Cron 和 Anacron 搭配使用,以安排特定的執行或更進階的配置。

如果你使用 GNU/Linux,遲早會遇到需要這樣做的情況。 自動化重複性任務備份、更新、清理 日誌, 文件同步等等。此時,幾乎總是出現相同的名字: 克羅恩和阿納克隆每個人都提到了它們,但並不總是很好地解釋每一種功能、它們之間的區別,以及最重要的是,何時適合使用其中一種、另一種或同時使用兩者。
本文將深入淺出地講解它們的工作原理、影響的文件、配置方法以及其他相關內容… Cron 和 Anacron 在實際應用上的差異 Linux你會看到具體的例子, 技巧 常見任務(例如啟動圖形腳本、管理使用者權限或合併兩個系統)以及在安排關鍵任務時避免出錯的一些最佳實踐。
Cron 和 Anacron 分別是什麼?它們之間通常有哪些差異?
簡而言之, Cron 是一個守護進程,它會在精確的時間執行任務。 (具體分鐘和時間),而 Anacron 是一款專為非始終開啟的裝置設計的程式設計器。 這樣即使系統關閉,也能確保常規任務不會遺失。
Cron 假定係統 24/7 全天候可用,這在…中非常典型 伺服器、VPS 或生產機器如果任務計劃在凌晨 03:00 運行且伺服器處於運行狀態,則會運行。如果伺服器當時處於關閉或睡眠模式,任務將會錯過,Cron 將等待下一個規劃時間,而不會嘗試進行補償。
另一方面,Anacron 則持相反的觀點:他認為團隊可以 經常關閉或暫停 (手提(例如桌上型電腦、家用迷你伺服器等)。因此,它並非以精確的小時為單位,而是以天為單位來表示時間段。如果有一個「每日」任務,而電腦已經關機三天,那麼當電腦重新開機時,Anacron 會檢查哪些任務尚未完成,並在時間合適時執行它們。
哲學上一個重要的差異是: Chron 是同步的,指的是精確的時間。 (具體小時/分鐘),而 Anacron 與系統時鐘非同步運行它只關心自上次執行以來經過了多長時間,而不是具體的時間。
Cron 的工作原理:守護程式、檔案和任務結構
Cron 是一個 系統惡魔 (一項後台服務)在機器開機期間始終處於活動狀態。在 Debian、Ubuntu 和許多其他發行版中,它以服務的形式運作。 cron的 它每分鐘都會檢查一系列定義了計劃任務的檔案和目錄。
在 Debian/Ubuntu 類型的系統中,Cron 會定期檢查這些項目。 地點:
- / etc / crontab中系統主文件。
- /etc/cron.d/:附加任務文件,通常由軟體包或管理員創建。
- /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly:包含定期運行的腳本的目錄。
- /var/spool/cron/crontabs/每個使用者的任務文件。
在 Debian 及其衍生發行版中,該文件 / etc / crontab中 它包含一些特殊條目,這些條目會呼叫通用腳本來執行 cron.* 目錄中的內容。例如,一個典型的命令會執行以下目錄中的所有內容: /etc/cron.daily 每天在特定時間一次,只要阿納克隆沒有處理它(我們稍後再看看阿納克隆介入後會發生什麼)。
系統檔案中 Cron 行的結構
在系統檔案中,例如 / etc / crontab中 以及以下文件 /etc/cron.d/每行任務都遵循以下結構:
最小小時 日_月 月 日_週 使用者指令
範例行:
14 1 * * * pepe /home/pepe/bin/tarea.sh > /dev/null 2>&1
在這種情況下,任務啟動。 每天凌晨 01 點 14 分它以用戶身份運行 佩佩 指示的命令是 腳本 /home/pepe/bin/tarea.sh將標準輸出和錯誤輸出重定向到 的/ dev / null的 這樣它就不會打擾你了。
使用者 crontab:為每個帳戶自訂排程任務
每個系統使用者都可以使用指令定義自己的任務。 crontab中這會產生並管理以下各個文件 /var/spool/cron/crontabs/ (在 Debian 系統上),每位使用者一份。在這些文件中 使用者列未顯示因為 Cron 知道那裡的一切都必須按照所有者的方式運行。
- crontab -e命令編輯或建立目前使用者的任務。
- crontab -l:列出該使用者的任務。
- crontab -e -u 名稱:as 根編輯其他使用者的任務。
- crontab -l -u 名稱:列出其他使用者的任務。
格式 使用者 crontab 中的每一行:
最小小時 日_月 月 日_週 指令
一些典型的使用範例 crontab -e命令 將:
# 每天晚上 10:14 執行 Nextcloud 備份 14 22 * * * /home/pi/scripts/nextcloudbkp.sh # 每 3 小時運行一次 0 0,3,6,9,12,15,18,21 * * * /home/pi/scripts/n extcloud /home/pi/? /home/pi/scripts/backup_mensual.sh
克羅恩領域的含義
在所有 crontab 檔案中,無論是系統 crontab 還是使用者 crontab, 前五個字段 它們含義相同。充分理解它們至關重要,這樣才能確保任務在需要時觸發。
| 場 | 描述 |
|---|---|
| 分鐘(米) | 數值介於 0 和 59 之間。符號 * 意思是「每分鐘」。 |
| 時間(小時) | 範圍從 0 到 23,採用 24 小時制。 * 它表示“所有時間”。 |
| 月份中的某一天(星期日) | 1 到 31 之間的數字,支援諸如 10-20 之類的範圍,以及諸如 1、15、30 之類的列表,此外還支持 *. |
| 月份(星期一) | 值範圍為 1 到 12,也支援範圍/列表和通配符。 *. |
| 星期幾(下) | 0 到 7,其中 0 和 7 通常代表星期日;也可以使用英文縮寫:mon、tue、wed、thu、fri、sat、sun。 |
除了數字和星號之外,您還可以使用以下表達式: */15 在相應的欄位中表示「每 15 個單位」(例如,在第一個欄位中表示「每 15 分鐘」),或表示類似這樣的範圍 1-5 星期幾欄填寫「星期一至星期五」。
/etc/cron.d 目錄:打包任務和系統任務
目錄 /etc/cron.d/ 它的設計目的是讓系統軟體包或管理員可以在不修改主文件的情況下定義定期任務。 / etc / crontab中您放置的每個文件都代表 Cron 每分鐘檢查的一個或多個任務。
每行的語法與…相同 / etc / crontab中也就是說,它包括以下領域: 用戶例如,如果您希望 Firefox 更新腳本每天晚上 10 點以 root 使用者身分執行,您可以建立 /etc/cron.d/firefox 具有以下內容:
0 22 * * * root bash /home/joan/scripts/firefox_update.sh
這些文件只能由擁有以下權限的人建立和編輯: 管理員權限因此,它們是將系統任務與每個使用者的個人設定分開的好方法。
目錄 cron.daily、cron.weekly、cron.monthly、cron.hourly
目錄 /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly y /etc/cron.hourly 它們用於放置 可執行腳本 這些產品將按照其名稱所示的頻率發布。
- cron.hourly它每小時運行一次,始終由 Cron 管理。
- cron.daily它每天運行一次,根據配置,可以透過 Cron 或 Anacron 運行。
- cron.weekly它每週運行一次。
- cron.monthly它每月舉辦一次。
如果 Anacron 不存在,則會標記這些目錄觸發的確切時間。 / etc / crontab中如果安裝了 Anacron,它通常會處理這個問題。 cron.daily、cron.weekly 和 cron.monthly而 cron.hourly 通常仍然依賴 Cron (此設定可以更改,但這是預設設定)。
使用者權限管理:cron.allow 和 cron.deny
預設情況下,大多數發行版都允許所有使用者使用 Cron 來調度任務。但是,如果您管理的是共享伺服器,您可能需要… 限制誰可以使用 crontab這就是文件的作用:
- /etc/cron.allow:授權使用者白名單。
- /etc/cron.deny: 禁止使用 Cron 的使用者黑名單。
邏輯很簡單:如果它存在 /etc/cron.allow 而且沒有 /etc/cron.deny只有列出的使用者才能使用 Cron。如果只有一個使用者存在的話。 /etc/cron.deny除指定使用者外,所有人都可以存取。如果指定使用者和系統使用者都不存在,則任何系統使用者都可以定義自己的 crontab。
使用 Cron 時需要考慮的實際問題
有一系列的 細節 為確保 Cron 任務順利運行,請注意以下事項:
- 一律使用 絕對路徑 在 命令 (例如,使用 /usr/bin/rsync 而不是 rsync)。
- 如果您需要運行具有管道、重定向或多個步驟的複雜命令,最好建立一個 bash腳本 然後透過 Cron 呼叫該腳本。
- 性格 % 它有特殊的含義(標記行尾和標準輸入的開始),所以如果您確實需要它,則必須對其進行轉義。
- 要從 Cron 啟動圖形應用程序,您需要匯出 顯示器 例如,有效:
env DISPLAY=:0 /usr/bin/xdg-open /ruta/archivo
非常重要的一點是:如果設備在預定時間準時關閉, 任務完成後將無法恢復。它丟失了,我們只能等待下一個時間間隔。阿納克隆的出現正是為了填補這個空白。
Anacron 的工作原理:理念、文件和任務管理
Anacron 是一個專為以下用途設計的程式: 為了解決 Cron 在非持續開機系統上的主要局限性:系統在關鍵時刻關閉或暫停時,導致計劃任務遺失。
它並不是一個一直駐留在記憶中的惡魔。 Anacron 是一次性運行的。通常是在系統啟動時、從睡眠狀態恢復時,或透過定期呼叫它的 Cron 任務(例如,在某些時間段內每小時呼叫一次)。
Anacron啟動時,會讀取其配置,檢查最近幾天應該執行哪些作業,並進行驗證。 如果自上次以來已超過規定的期限如果偵測到有逾期任務,它會安排這些任務執行,並可能延遲執行,直到趕上進度為止。
Anacron 金鑰文件
在 Debian/Ubuntu 系統上, 主要元素 Anacron的產品通常是:
- /etc/anacrontab:Anacron 任務聲明的中心文件。
- /var/spool/anacron/:儲存每個任務時間戳檔案的目錄。
- /etc/cron.d/anacron在許多系統中,有一個檔案可以讓 Cron 定期呼叫 Anacron(例如,在 7:30 到 23:30 之間每小時一次)。
- /etc/apm/event.d/anacron 或其他啟動腳本:在某些發行版中用於在偵測到市電或系統啟動時執行 Anacron。
此外,當 Anacron 控制系統目錄時,每日、每周和每月任務將受到影響。 /etc/cron.daily, /etc/cron.weekly y /etc/cron.monthly 它們都隸屬於該框架。這些目錄中的腳本保持不變,但是… Cron 不再直接啟動它們但 Anacron 透過其定義 /etc/anacrontab.
/etc/anacrontab 檔案的結構
如果你打開 /etc/anacrontab 使用文字編輯器,你會看到,在文件開頭聲明了一些環境變數:
- SHELL:用於執行任務的命令解釋器(通常是 /bin/sh 或 /bin/bash)。
- 路徑:將要搜尋可執行檔的路徑。
- 首頁:預設工作目錄。
- 日誌名稱:執行任務的使用者(通常是 root)。
這些變數之後是定義每個任務的語句。 整體結構 是:
延遲期標識符命令
其中:
- 期:兩次執行或快捷方式之間的天數,例如 @日常的, @每週, @每月.
- 滯後:從 Anacron 決定執行該作業到實際啟動該作業所預計花費的時間(分鐘)。
- 識別碼:任務的唯一名稱,用於在日誌中識別任務並命名時間戳記檔案。
- 命令要執行的命令或腳本,及其完整路徑。
簡單範例 每周作業:
7 10 備用.weekly /bin/bash /home/joan/scripts/backup.sh
在這種情況下,Anacron 將確保每個 7天 該腳本會運行。如果電腦已關機,距離上次執行已超過七天,則一旦… 開機 或者阿納克隆再次運行,他們會等待 10 Minutos (延遲一段時間)之後才會發布副本。
/var/spool/anacron 中的時間戳
為了了解每個任務的最後執行時間,Anacron 會為每個作業建立一個檔案。 /var/spool/anacron/每個文件的名稱都與 識別碼 定義於 /etc/anacrontab (例如,backup.weekly、cron.daily、cron.weekly…)。
這些文件的內容通常只是一個日期格式。 YYYYMMDDAnacron啟動時,會將該時間戳記與目前日期和anacrontab中定義的時間段進行比較。如果已過去指定的天數或更長時間,則會安排執行相應的命令。
這意味著 只考慮日期,不考慮具體時間。這就是為什麼 Anacron 不用於在特定時間運行任務,而是用於確保「此任務至少每 N 天運行一次」。
Anacron 的實用參數和選項
命令 安克龍 它接受一系列選項,這些選項對於測試或控制任務的執行方式非常實用:
- -f:強制執行所有工作,即使期限尚未到期。
- -u:更新所有作業的時間戳,就好像它們已經執行過一樣,但實際上並沒有執行這些命令。
- -s:依序執行任務,等待一個任務完成後再開始下一個任務。
- -n立即執行相關作業,隱式激活 -s.
- -d:不會在背景運作;透過標準輸出顯示訊息(方便調試)。
- -q:抑制標準輸出上的錯誤訊息,旨在與以下功能結合使用: -d.
- -t 檔使用備用任務文件代替 /etc/anacrontab.
- -T:檢查任務文件的語法並顯示錯誤,但不執行任何操作。
- -S 目錄:使用備用目錄來儲存時間戳記。
如果您願意的話 立即執行 對於 anacrontab 中定義的任務,您可以使用以下命令來檢查一切是否正常運作:
sudo anacron -f
/etc/anacrontab 中的進階選項:隨機調度和延遲
除了任務線之外,在 /etc/anacrontab 也可以定義一些影響整體行為的附加參數:
- 開始時間範圍=3-22:限制 Anacron 可以執行作業的時間範圍(在本例中,僅限 03:00 至 22:00)。
- 隨機延遲=10:為每個任務添加 0 到 10 分鐘之間的隨機延遲,這有助於 避免負載峰值 一開始就一次推出所有內容。
透過將這些參數與每個任務的週期和延遲結合起來,您可以 微調行為 避免出現諸如 CPU 或磁碟在工作時間內滿載運轉等意外情況。
Cron 和 Anacron 的主要區別
在分別考察了兩者之後,值得比較它們的主要特徵。 克龍 y 阿納克隆 要明確每個人的貢獻。
| 克龍 | 阿納克隆 |
|---|---|
| 這是一個 惡魔 始終在背景運行。 | 這是一個 準時運行的程序 當它被呼叫時(系統啟動、Cron、腳本)。 |
| 它可以讓你安排任務 精確到分鐘和小時. | 適用於 天數 (每日、每週、每月、每隔 N 天),不限特定時間。 |
| 如果在排程任務時電腦處於關機狀態, 執行失敗. | 如果設備已關閉,則在重新開啟時 完成逾期任務 在適當的情況下。 |
| 任何使用者都可以安排任務(但受 cron.allow/cron.deny 限制除外)。 | 通常情況下,只有 管理員(root). |
| 非常適合 全天候伺服器或系統 時鐘可靠的地方。 | 非常適合 筆記型電腦、桌上型電腦和經常關機的設備. |
在許多現代發行版中,尤其是 Debian 及其衍生版本, 它們都是預先安裝好的嗎?還是建議一起安裝?Cron 處理時間敏感型任務、使用者作業和諸如 cron.hourly 之類的調度程序,而 Anacron 則負責 cron.daily、cron.weekly 和 cron.monthly,以確保即使電腦並非始終處於開機狀態,系統維護任務也不會遺失。
何時使用 Cron,何時使用 Anacron,以及何時將它們結合使用。
一個非常實際的決定方法是考慮以下幾點: 機器類型 以及您想要自動化的任務類型。
- 在一個 全天候運作的伺服器 (網路、資料庫、電子郵件等),幾乎完全依賴 克龍你可以安裝 Anacron,但對於一台從未關閉的伺服器來說,它並不會增添太多功能。
- 在一個 台式機或筆記本電腦 由於它每天都會開關機,所以明智的做法是使用 時間 + 阿納克隆Cron 用於執行非常特定的任務(例如,電腦開機時每 15 分鐘運行一次),而 Anacron 用於執行「每日」、「每週」或「每月」的維護任務,這樣即使電腦關機,也不會錯過這些任務。
實用規則 通常效果不錯:
- 如果你需要 精確執行 使用 Cron 在整點執行(例如,每天 23:58 執行計費腳本)。
- 如果你覺得發生點什麼就夠了。 至少每隔 X 天一次 (例如,輪換日誌、刪除臨時檔案、重新產生索引),可以使用 Anacron 或讓它處理 cron.daily、cron.weekly 和 cron.monthly 中的腳本。
- 在 Debian 伺服器上,軟體包安裝的任務通常位於 /etc/cron.daily 類似地。如果安裝了 Anacron,即使伺服器發生意外中斷,它也能確保這些任務得到執行。
Anacron 的實際應用範例:即使電腦並非始終處於開機狀態,也能實現每日備份。
想像一下你想要擁有 重要文件的每日副本但你的電腦每晚都會關機,你也不知道什麼時候會再開機。 Anacron 正好能解決這個問題。
假設你有一個文件 /home/usuario/prueba.txt 你想每天保存一份包含日期和時間的副本。你可以建立一個小型 Bash 腳本,賦予它執行權限,然後加入一行程式碼到 /etc/anacrontab 每天運行一次,在系統啟動後稍作延遲。
流向 典型工作:
- 你創建腳本 /home/usuario/prueba.sh 它會複製一份文件,並在文件末尾添加日期和時間後綴。
- 你用以下方式賦予它執行權限 chmod 700 prueba.sh.
- 您需要手動測試腳本,以確認它能如預期運作。
- 埃迪塔斯 /etc/anacrontab 然後再加入這樣一行:
@daily 1 somebooks /bin/bash /home/usuario/prueba.sh - 您可以重新啟動或強制 Anacron 檢查一切是否正常運作。
從那一刻起, 每天一次或者,如果電腦在前一天無法執行該作業,則在電腦開機後,Anacron 將啟動您的腳本,等待一分鐘(delay=1),然後產生新的版本副本。
其他相關工具:at 和 systemd 定時器
儘管 Cron 和 Anacron 是 Linux 中用於實現循環自動化的明星工具,但還有其他一些工具也值得關注。 其他工具 這一點你應該注意。
一方面你有 at專為程式設計 僅執行一次的任務 在特定時間運轉。例如,如果您想說“明天上午 10:15 運行此命令,然後就不用管它了”,那麼這種方法就非常理想。
- 以下是一個在特定時間重新啟動的基本範例:
at 10:15
> reboot
> ^D - 或者更複雜一些,例如服務中斷、等待一段時間,然後在特定日期恢復:
at 12.12.2106 21:23
> /etc/init.d/apache stop
> sleep 600
> /etc/init.d/apache start
> ^D
的作品 at 儲存在 /var/spool/cron/atjobs 您可以將它們列出來 和 o 在-l除了用以下方式刪除它們之外 自動櫃員機.
另一方面,在現代系統中, systemd 還有 系統定時器這些工具可讓您透過定義 `.timer` 和 `.service` 單元來(部分或完全)取代 Cron 和 Anacron。它們功能強大,但配置起來也稍微複雜一些;如果您已經精通 Cron/Anacron,並且想要更精細地控制依賴關係和服務狀態,那麼這些工具值得您深入研究。
實際上,對於大多數管理員和高級用戶而言,結合使用 克龍、阿納克隆和 它提供了足夠的範圍來滿足幾乎所有自動化需求,而無需從一開始就使用 systemd 定時器來使您的生活變得複雜。
綜上所述,你現在應該對整個過程有相當全面的了解了。 Cron 和 Anacron 共同承擔 Linux 中的自動化工作。只要係統正常運行,Cron 就會以瑞士手錶般的精確度觸發進程;而 Anacron 則會在後台運行,檢查機器關閉後還有哪些未完成的工作,確保即使設備的壽命比傳統伺服器更長,每日、每週或每月的維護任務也不會丟失。
對字節世界和一般技術充滿熱情的作家。我喜歡透過寫作分享我的知識,這就是我在這個部落格中要做的,向您展示有關小工具、軟體、硬體、技術趨勢等的所有最有趣的事情。我的目標是幫助您以簡單有趣的方式暢遊數位世界。