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