Linux 黑話解釋:什么是定時任務(wù)
在本期的《Linux 黑話解釋》系列文章中,你將了解到 Linux 中的定時任務(wù)功能。你將通過學(xué)習(xí)編輯 crontab 文件來創(chuàng)建定時任務(wù)。
何為定時任務(wù)
cron 是一個用于按計劃運行短小且快速的命令的實用命令行工具。該工具是一個方便、經(jīng)典的系統(tǒng)管理工具,通過和其他工具結(jié)合使用可以自動運行各式各樣的任務(wù)。比如,有些人通過把 rsync 和 cron 結(jié)合使用,在特定的時間自動創(chuàng)建每日備份和每周備份。也有些人使用 cron 來分析服務(wù)器日志,并且結(jié)合郵件系統(tǒng)功能,在日志檢測到錯誤時自動發(fā)送告警郵件。
cron 就如同“瑞士軍刀”一樣,可以多場景多樣化使用。盡可能發(fā)揮你的想象,去挖掘它的功能。
其實 cron 的使用很容易上手,只需要幾秒鐘。不過在我們開始上手之前,先來討論下幾個經(jīng)常容易混淆的概念。
cron、定時任務(wù)、crontab
有三個術(shù)語比較容易混淆:cron、定時任務(wù)和 crontab,讓我們來看看它們的含義:
| 術(shù)語 | 含義 | 
|---|---|
cron | 
            這是安裝在系統(tǒng)上的實際執(zhí)行定時任務(wù)的 守護進程。 | 
| 定時任務(wù) | “任務(wù)”是指一段啟動并運行的程序。cron 可以按照約定的時間計劃運行各種任務(wù),這樣的任務(wù)通常叫做“定時任務(wù)”。 | 
        
| crontab | 這是一個文件,用于定義定時任務(wù)。一個 crontab 文件可以通過表格形式(每一行就是一個定時任務(wù))定義多個定時任務(wù)。 | 
        
來看一個簡單例子:創(chuàng)建一個定時任務(wù),每小時向 crontabl_log.txt 文件打印 Linux is cool!。
0 * * * * echo "Linux is Cool!" >> ~/crontab_log.txt
是不是這么個簡單定時任務(wù)的例子都讓你感到驚恐,這是因為你需要懂得如何去讀懂一個定時任務(wù)的屬性。
我將在后文中講述這個基礎(chǔ)理論知識。
上手 cron
我們通過另一個例子來看看 cron 如何工作。
為了創(chuàng)建定時任務(wù)(或者說 cron 將要執(zhí)行的命令任務(wù)),你只需要運行:
crontab -e
這將會打開一個文件,用于編輯定時任務(wù):
Crontab default view
其中,所有以 # 開頭的行都是注釋,用于指導(dǎo)你如何使用 cron,如果覺得沒用可以刪除它們。
我們將創(chuàng)建如下任務(wù),作為我們的第一個定時任務(wù):
* * * * * touch ~/crontab_test
讓我快速看看該任務(wù)將會做什么:
定時任務(wù)都是以 “分鐘 小時 天 月 周 命令” 形式呈現(xiàn):
- 分鐘:指該任務(wù)在哪一分鐘會被執(zhí)行。所以,該值為 
0則代表在每個小時開始時運行,5則代表在每個小時的第 5 分鐘會運行。 - 小時:指該任務(wù)在一天中的哪個小時會被執(zhí)行,取值范圍為 
0-23。沒有24的原因是23時的末尾是半夜11:59,然后就是每天的開始0時。分鐘的取值范圍定義邏輯與之類似。 - 天:指一個月中的哪一天執(zhí)行該任務(wù),取值范圍是 
1-31(不同于前面的分鐘和小時從0開始取值)。 - 月:指該任務(wù)在哪個月被執(zhí)行,取值范圍是 
1-12。 - 周:指該任務(wù)在星期幾被執(zhí)行,從周日開始算起,取值范圍是 
0-6(分別對應(yīng)周日、周一到周六)。 - 命令:是你想要運行的命令任務(wù)。
 
如果想對 “分鐘 小時 天 月 周” 部分有更詳細的理解,可以參考 Crontab guru 網(wǎng)站,該網(wǎng)站可以幫助你理解正在執(zhí)行什么。
接著之前的例子 * * * * * touch ~/crontab_test,表示每分鐘創(chuàng)建一次 ~/crontab_test 文件。
讓我們將該任務(wù)編輯進 crontab 然后看看執(zhí)行結(jié)果: 
等到下一分鐘,你就會發(fā)現(xiàn)你的家目錄下多了文件 crontab_test:
這便是 cron 的基礎(chǔ)應(yīng)用示例。
一個實用的定時任務(wù)示例
假設(shè)你想創(chuàng)建一個腳本,用于拷貝多個目錄內(nèi)容到一個路徑并打包作為備份,該如何實現(xiàn)?
通過 cron 定時任務(wù)就可以很容易實現(xiàn)該功能。
請看如下腳本:
#!/usr/bin/bashecho "Backing up..."mkdir -p ~/.local/tmp/tar -Pc ~/Documents/ -f ~/.local/tmp/backup.gz
該腳本做了如下事情:
- 確保備份路徑目錄 
~/.local/tmp/存在。 - 將目錄 
~/Documents/下的所有內(nèi)容打包至文件~/.local/tmp/backup.gz。 
我們先來手動運行該腳本,看看它到底如何工作。
首先,我們在家目錄(~)下創(chuàng)建該腳本,命令為 backup_script,如下圖所示: 
然后編輯 backup_script 腳本,寫入上面那個腳本代碼。
接著,賦予 backup_script 可執(zhí)行權(quán)限: 
最后運行腳本 ~/backup_script,進行功能驗證:
你可以通過運行命令 tar -xf ~/.local/tmp/backup.gz -C <output_dir> 來進行備份恢復(fù),這里 <output_dir> 是指文件要恢復(fù)到的路徑目錄。
接下來,就可以用 cron 工具來進行定時任務(wù)運行該腳本了。
舉個例子,假設(shè)需要每天的凌晨 3 點運行該備份腳本,你可以在 crontab 中輸入如下命令:
* 3 * * * ~/backup_script
這樣你就可以每天自動進行備份操作了。
后記
本文簡單介紹了定時任務(wù)功能。盡管我不確定 Linux 桌面用戶使用該功能多不多,但我知道定時任務(wù)功能被許多系統(tǒng)管理員廣泛應(yīng)用。






















 
 
 






 
 
 
 