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