使用 cron 定時任務的小技巧
在計算機上讓任務按照有規律並且可預測的時間表運行很重要。作為人類,我們有時會因為分心、腦子裡想太多,或是度假而記不住要做的事情。計算機真的很擅長按計劃做事,但在計算機採取行動之前,人類必須對計算機進行編程。
在某種程度上,cron 系統是編程的初級簡單入門。通過編輯一個文件就可以讓計算機做你想讓它做的事。你甚至不需要知道文件保存在哪裡。只需鍵入一個簡單的命令,輸入你希望電腦遵循的 「配方」,並保存。從那時起,計算機會在指定時間執行你的指令,直到被告知停止。
從設計上來看,cron 不是一個複雜的系統。這裡有一些你需要了解的內容。
cron 是什麼?
cron 命令在 Linux 和 Unix 中無處不在,而且它經常被模仿和重塑,以至於它幾乎成了按計劃發生的事情的一個通用術語。它是自動化的一種形式,儘管有不同的實現方式(比如 Dillon's cron、Vixie's cron、chrony 和其他),以及像 anacron 和 systemd 定時器這樣的變化,但其語法和工作流程幾十年來一直保持著基本一致。
cron 在一個 「 假離線 」 系統上工作,像印表機和電子郵件一樣。如果不你知道印表機和電子郵件使用假離線也沒關係,因為假離線文件的意義在於,你不需要想太多。在 Linux 系統中,/var/spool
目錄被設計為重要但低級的文件的中心樞紐,用戶不需要直接與之交互。 在 /var/spool
中管理的一個假離線是 cron 表(簡稱為 「crontab」)。 包括你在內的每個用戶在 Linux 系統中都有一個 crontab。用戶可以編輯、查看和刪除自己的 crontab。除此之外,用戶可以使用 crontab 來安排任務。cron 系統監控 crontab,並確保一個 crontab 中列出的任何工作都能在其指定時間執行。
編輯 cron 設置
你可以使用 crontab
命令和 -e
(代表「編輯」)選項來編輯你的 crontab。默認情況下,大多數系統會調用 vim
文本編輯器。如果你和我一樣,不使用 Vim,那麼你可以在 ~/.bashrc
文件中為自己設置一個不同的編輯器。我把我的設置為 Emacs,但你也可以試試 Nano、Kate,或者任何你喜歡的編輯器。EDITOR
環境變數定義了你在終端使用的文本編輯器,而 VISUAL
變數定義了你在圖形模式下使用的編輯器:
export EDITOR=nano
export VISUAL=kate
更新設置後刷新你的 shell 會話:
$ source ~/.bashrc
現在你可以用喜歡的編輯器編輯 crontab:
$ crontab -e
為任務執行安排時間
cron 系統本質上是一個日曆系統。可以通過五個不同的屬性告訴 cron 需要讓一個任務多長時間運行一次:分、時、日、月、星期。這些屬性的順序是固定的,並且不一定是直觀的,你可以把它們看作是過濾器或掩碼。默認情況下,你可以理解為所有東西都被設置為「總是」或者「每一個」。此命令將在全年的每一天每小時每分鐘運行 touch /tmp/hello
:
* * * * * touch /tmp/hello
可以通過設置每個屬性的具體定義來限制這個包羅萬象的時間安排表。使任務在每個小時的 30 分鐘時運行,將分鐘設置為 30
:
30 * * * * touch /tmp/hello
可以通過一個具體的小時來進一步約束這個指令。使任務在每個凌晨 3:30 運行:
30 3 * * * touch /tmp/hello
你也可以讓這個任務只在每個月的第一天運行:
30 3 1 * * touch /tmp/hello
你可以用 1
至 12
表示 1 至 12 月來設置月份,用 0
至 6
表示周日至周六來設置星期。這項任務在 4 月份的周一的 3:15 運行:
15 3 * 4 1 touch /tmp/hello
設置增量
所有這些設置都與一個固定時間 完全 匹配。使用 cron 符號設置可以在特定時間段後運行任務,例如,每 15 分鐘運行一個任務:
*/15 * * * * touch /tmp/hello
每三天在上午 10 點運行任務:
* 10 */3 * * touch /tmp/hello
每 6 小時運行一次任務:
* */6 * * * touch /tmp/hello
Cron 速記符
現代的 cron 實現已經為常見的時間安排表添加了方便的速記符,包括:
@hourly
:每小時@daily
:每天@weekly
:每周@monthly
:每月@yearly
或@annually
:每年
列出 cron 任務
使用 crontab
命令,查看計劃中的 cron 任務列表:
$ crontab -l
15 3 * 4 1 touch /tmp/hello
刪除一個 crontab
當一個 crontab 任務不需要時,可以使用 -r
選項來刪除它:
$ crontab -r -i
-i
選項代表 互動式。它在刪除文件之前會提示你進行確認。
Cron 可以做什麼
知道如何使用 cron 是一回事,但但知道它的用途是另一回事。經典用例就是備份計劃。如果你的電腦一天中大部分時間都是開著的,或者整天整夜地開著,那麼可以為重要分區進行例行備份。我會在每天凌晨 3 點在主要數據分區上運行一個名為 rdiff-backup
的備份程序:
$ crontab -l | grep rdiff
* 3 * * * rdiff-backup /data/ /vault/
另一個常見的用途是系統維護。在我的 Slackware 桌面上,每周五下午會更新本地版本庫目錄:
$ crontab -l | grep slack
* 14 * * 5 sudo slackpkg update
我還會每 3 天在 15:00 運行一個 Ansible 腳本來 清理我的下載文件夾 :
$ crontab -l | grep ansible
* 15 */3 * * ansible-playbook /home/seth/Ansible/cleanup.yaml
有一些重複數據刪除腳本、文件大小和 /tmp
目錄的監視器、照片調整器、文件移動工具以及很多瑣碎的任務,你可以安排在後台運行,以幫助保持系統不受干擾。有了 cron,計算機可以以我希望我的實體公寓能夠做到的方式來照顧自己。
記住 cron 的設置
除了想明白你為什麼需要 cron 之外,根據我的經驗,cron 最難的事情是記住它的語法。重複這句話給自己聽,反反覆復,直到你記牢它:
分、時、日、月、星
分、時、日、月、星
分、時、日、月、星
更好的做法是,去 下載我們免費的速查表 ,這樣當你最需要它時,它觸手可及!
via: https://opensource.com/article/21/11/cron-linux
作者:Seth Kenlon 選題:lujun9972 譯者:Veryzzj 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive