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