Linux中cron命令的16個基礎(chǔ)用法及示例
Linux/Unix中,我們可以使用cron命令自動運(yùn)行和計(jì)劃任務(wù),你可以一次或定期執(zhí)行任務(wù)。“Cron”廣泛用于定期執(zhí)行重復(fù)性工作(使用名為“crontab”的命令運(yùn)行),“at”程序用于在特定時(shí)間段內(nèi)執(zhí)行一次任務(wù)。Crontab為所有用戶維護(hù)單獨(dú)的crontab文件。這些自動化的工作對許多使用Linux服務(wù)器的管理員來說是非常有用的。
一般來說,“crontab”文件用于備份、更新系統(tǒng)、同步服務(wù)器等任務(wù)。cron的一個重要優(yōu)點(diǎn)是,你不需要詳細(xì)了解它,只需要知道如何使用它作為設(shè)置cron作業(yè)的一部分。
本教程將指導(dǎo)你使用crontab的各種選項(xiàng)。下文中所有crontab的例子都在RHEL/CENTOS 7.6上測試過。
首先,讓我們看看crontab的基本語法和表達(dá)式:
- Minute hour Day-of-Month Month-of-Year Day-of-Week Command
- 0-59 0-23 1-31 1-12 0-6 command / script
Crontab總共有6個字段。第1-5個字段是日期和時(shí)間,第6個字段可用于任何可執(zhí)行的Linux命令或腳本。
注意:時(shí)間字段采用24小時(shí)格式。
1. 如何在每天的特定時(shí)間執(zhí)行cronjob?
要把任務(wù)添加到crontab中,我們應(yīng)該使用'-e'選項(xiàng)。一旦添加了任務(wù),vi編輯器將打開crontab配置文件,然后使用’:wq!'保存并關(guān)閉該文件。
- # crontab -e
- 30 01 * * * /usr/scripts/rsync_svnvmback.sh >/dev/null 2>&1
注意:在這里,我們有一個名為“rsync_svnbackup.sh”的bash腳本,每天(周一到周日)凌晨1點(diǎn)30分執(zhí)行。一旦任務(wù)被執(zhí)行,Cron就會向特定的用戶發(fā)送一封關(guān)于任務(wù)狀態(tài)的通知郵件,無論是成功還是失敗。如果不需要通知,那么我們可以在腳本的最后使用>/dev/null 2>&1命令來禁用它,它將使所有的通知無效。
2. 如何列出crontab任務(wù)?
使用下面的命令列出我們添加到crontab配置文件中的任務(wù)。這里,我們使用的是root賬戶。
- # crontab -l
- 30 01 * * * /usr/scripts/rsync_svnvmback.sh >/dev/null 2>&1
注意:'-l'是列出當(dāng)前登錄的用戶的crontab列表的選項(xiàng)。
3. 如何以其他用戶身份修改cronjob?
比方說,我想以另一個名為“linuxteck”的用戶修改crontab任務(wù)。
- # crontab -u linuxteck -e
- 30 01 * * * /usr/scripts/rsync_svnvmback.sh
注意:上述命令只能由高權(quán)限用戶執(zhí)行,比如“root用戶或超級用戶”,或者被賦予了特權(quán)的普通用戶。這里‘-u’代表用戶名,‘-e’選項(xiàng)代表編輯。
4. 如何列出其他用戶的crontab任務(wù)?
下面的命令將顯示其他用戶(linuxteck)的任務(wù)列表。
- # crontab -u linuxteck -l
- 30 01 * * * /usr/scripts/rsync_svnvmback.sh
注意:記住,只有root/超級用戶可以執(zhí)行上述命令,或者具有相同權(quán)限的普通用戶。
5. 如何配置每分鐘運(yùn)行的cronjob?
這個要求在實(shí)際中很少使用,但也有一些用例。舉個例子:如果你使用rsync腳本/命令從線上服務(wù)器同步備份,這樣以來,備份服務(wù)器將每分鐘從線上服務(wù)器獲得更新。
- # crontab -e
- * * * * * /usr/scripts/rsync_svnvmback.sh
注意:上述crontab任務(wù)(rsync_svnvmback.sh)將在全年每小時(shí)中的每一分鐘運(yùn)行。
6. 如何配置一個每天運(yùn)行兩次的cronjob?
這意味著一條命令/腳本在一天內(nèi)將被執(zhí)行兩次。舉個例子:一些公司在早上和晚上進(jìn)行數(shù)據(jù)庫備份,比方說早上6點(diǎn)和晚上8點(diǎn)。
- 00 06,20 * * * /usr/scripts/mysqldump.sh >/dev/null 2>&1
注意:在小時(shí)字段使用了逗號分隔值。這個腳本將在每天早上6點(diǎn)和晚上8點(diǎn)執(zhí)行。正如第一個例子中提到的,用'>/dev/null 2>&1'命令來禁用通知。
7. 如何配置每10分鐘運(yùn)行一次的cronjob?
下面的任務(wù)可以連續(xù)每10分鐘執(zhí)行一次命令/腳本。
- */10 * * * * /usr/scripts/rsync_svnvmback.sh
注意:你可以根據(jù)你的要求調(diào)整為5分鐘或10分鐘等進(jìn)行測試。
8. 如何配置特定日期執(zhí)行的cronjob?
使用下面的配置,我們可以在特定的日子里執(zhí)行cronjob。例如:你可以只在周五和周日的晚上11點(diǎn)運(yùn)行備份腳本。
- > 0 23 * * fri,sun /usr/scripts/rsync_svnvmback.sh
注意:在這里我使用了日期的簡稱并用逗號來分隔,而不是數(shù)字,這樣用戶就很容易讀懂。如果你使用數(shù)字,一些系統(tǒng)上是0-6,一些是1-7。因此,許多初學(xué)者在配置“星期天”時(shí)感到困惑,到底該使用0還是7。實(shí)際上,‘0和7’都代表星期天。
9. 如何配置在特定月份運(yùn)行的cronjob?
使用下面的配置,我們可以為在特定月份執(zhí)行cronjob,例如:該腳本應(yīng)該只在1月和7月的晚上11.00執(zhí)行。
- 0 23 * jan,jul * /usr/scripts/rsync_svnvmback.sh
注意:crontab語法中第四字段是月份的名稱。如果不止一個月份執(zhí)行,則使用逗號來分隔。
10. 如何在一行中連續(xù)運(yùn)行多個cronjob?
正常情況下,我們?yōu)椴煌娜蝿?wù)、不同的時(shí)間一個一個地添加crontab任務(wù)。實(shí)際上,我們可以在一個特定的時(shí)間添加多個任務(wù),一個接一個地執(zhí)行。例如:我有多個命令/腳本要在我的服務(wù)器上執(zhí)行,即備份數(shù)據(jù)庫、備份應(yīng)用程序文件,然后壓縮數(shù)據(jù)庫和文件,并將這些tar文件推送到備份位置,然后從服務(wù)器上刪除這些tar/archive文件,然后清理tmp文件,等等。這種情況下,如果我們同時(shí)執(zhí)行所有的腳本,將極大地影響服務(wù)器的性能。例如,可能導(dǎo)致服務(wù)器的磁盤空間用完,內(nèi)存、CPU和帶寬的占用率會大幅升高,有時(shí)甚至使服務(wù)器失去響應(yīng)。
這種情況下,我們可以在crontab中使用下面的方式,讓腳本一個接一個地執(zhí)行,例如:如果我們有5組腳本要在早上1點(diǎn)運(yùn)行,那么第一個腳本將在1點(diǎn)開始運(yùn)行,一旦完成,第二個就立即開始,以此類推。
常規(guī)做法:
- 00 01 * * * /usr/scripts/mysqldump.sh
- 00 02 * * * /usr/scripts/application_backup.sh
- 10 01 * * * /usr/scripts/tar_db_appfile.sh
- 30 01 * * * /usr/scripts/cp_tar_remote_server.sh
- 10 02 * * * /usr/scripts/tardelete.sh
- 30 02 * * * /usr/scripts/clean_tmp.sh
多個任務(wù)在一個crontab中執(zhí)行:
- 00 01 * * * /usr/scripts/mysqldump.sh && /usr/scripts/application_backup.sh && /usr/scripts/tar_db_appfile.sh && /usr/scripts/cp_tar_remote_server.sh && /usr/scripts/tardelete.sh && /usr/scripts/clean_tmp.sh
- -OR-
- 00 01 * * * /usr/scripts/mysqldump.sh; /usr/scripts/application_backup.sh; /usr/scripts/tar_db_appfile.sh; /usr/scripts/cp_tar_remote_server.sh; /usr/scripts/tardelete.sh; /usr/scripts/clean_tmp.sh
注意:雙引號‘&&’和分號‘;’的區(qū)別是:‘&&’意味著作業(yè)將一個接一個地執(zhí)行,而‘;’則表示無論前面的作業(yè)是否成功,第二或第三作業(yè)都將運(yùn)行。
11. 如何在cron中使用特殊字符?
特殊字符是cron中用一個關(guān)鍵詞替換其他字段來執(zhí)行任務(wù)。我們可以在’@’后面接關(guān)鍵字,語法和含義如下。
- 關(guān)鍵字 等價(jià)于 含義
- @yearly 0 0 1 1 * --> 每年執(zhí)行一次
- @monthly 0 0 1 * * --> 每月執(zhí)行一次
- @daily 0 0 * * * --> 每天執(zhí)行一次
- @hourly 0 * * * * --> 每小時(shí)執(zhí)行一次
- @reboot -- --> 重啟后執(zhí)行一次
接下來我們用幾個例子來說明關(guān)鍵字的使用方法。
12. 如何使用@yearly的特殊字符配置cronjob?
@yearly相當(dāng)于‘0 0 1 1 *’。
- @yearly /usr/scripts/yearly_archival.sh
注意:上面的crontab任務(wù)將執(zhí)行腳本,把所有前一年的數(shù)據(jù)移到存檔服務(wù)器中。它將在每年的第一個月(一月)的00:00執(zhí)行。
13. 如何使用@monthly特殊字符來配置cronjob?
@monthly相當(dāng)于‘0 0 1 * *’。
- @monthly /usr/scripts/monthly-backup.sh
注意:上面的crontab任務(wù)將執(zhí)行每月備份的腳本,它將在每月1日的00:00執(zhí)行。
14. 如何使用@daily特殊字符串配置cronjob?
@daily相當(dāng)于‘0 0 * * *’。
- @daily /usr/scripts/daily-temp.sh
注意:上述crontab任務(wù)將執(zhí)行daily-temp.sh的腳本,它將清除temp文件夾中所有的臨時(shí)文件。任務(wù)將在每天的00:00執(zhí)行。
15. 如何使用@hourly特殊字符配置cronjob?
@hourly相當(dāng)于‘0 * * *’。
- @hourly /usr/scripts/hourly_rsync_svnvmback.sh
注意:上述crontab任務(wù)將執(zhí)行hourly_rsync_svnvmback.sh的腳本,它每小時(shí)將所有數(shù)據(jù)從線上服務(wù)器同步到備份服務(wù)器。
16. 如何使用@reboot特殊字符在每次重啟后執(zhí)行一個腳本/命令?
@reboot可以用來在每次重啟服務(wù)器后執(zhí)行一組命令/腳本。例如:在重啟后,我們可以執(zhí)行一個命令/腳本來檢查服務(wù)的狀態(tài),如DNS、Apache狀態(tài)等。
- @reboot /usr/scripts/bootup_service_status.sh
注意:上述crontab腳本將在每次重啟后執(zhí)行。這里,我在腳本中加入了檢查“httpd, named,dhcpd”等狀態(tài)的命令,這樣它就會顯示所有服務(wù)的狀態(tài)列表。
我希望這篇文章能夠幫助你學(xué)習(xí)Linux中的crontab命令。歡迎把你的反饋/意見告訴我。
感謝閱讀!