at 命令,此命令在指定的時間僅能執行一次任務,但在實際工作中,系統的定時任務一般是需要重複執行的。而 at 命令顯然無法滿足需求,這是就需要使用crontab 命令來執行迴圈定時任務。
在介紹 crontab 命令之前,我們首先要介紹一下 crond,因為 crontab 命令需要 crond 服務支援。crond 是 linux 下用來週期地執行某種任務或等待處理某些事件的乙個守護程序,和 windows 中的計畫任務有些類似。
crond 服務的啟動和自啟動方法如下:
[root@localhost ~]# service crond restart
停止 crond: [確定]
正在啟動 crond: [確定]
#重新啟動crond服務
[root@localhost ~]# chkconfig crond on
#設定crond服務為開機自啟動
其實,在安裝完成作業系統後,缺省會安裝 crond 服務工具,且 crond 服務預設就是自啟動的。crond 程序每分鐘會定期檢查是否有要執行的任務,如果有,則會自動執行該任務。
接下來,在介紹 crontab 命令。該命令和 at 命令類似,也是通過 /etc/cron.allow 和 /etc/cron.deny 檔案來限制某些使用者是否可以使用 crontab 命令的。而且原則也非常相似:
crontab 命令的基本格式如下:
[root@localhost ~]# crontab [選項] [file]
注意,這裡的 file 指的是命令檔案的名字,表示將 file 作為 crontab 的任務列表檔案並載入 crontab,若在命令列中未指定檔名,則此命令將接受標準輸入(鍵盤)上鍵入的命令,並將它們鍵入 crontab。
與此同時,表 1 羅列出了此命令常用的選項及功能。
表 1 crontab 命令常用選項及功能 選項
功能-u user
用來設定某個使用者的 crontab 服務,例如 "-u demo" 表示裝置 demo 使用者的 crontab 服務,此選項一般由 root 使用者來執行。
-e編輯某個使用者的 crontab 檔案內容。如果不指定使用者,則表示編輯當前使用者的 crontab 檔案。
-l顯示某使用者的 crontab 檔案內容,如果不指定使用者,則表示顯示當前使用者的 crontab 檔案內容。
-r 從 /var/spool/cron 刪除某使用者的 crontab 檔案,如果不指定使用者,則預設刪除當前使用者的 crontab 檔案。
-i在刪除使用者的 crontab 檔案時,給確認提示。
其實 crontab 定時任務非常簡單,只需執行「crontab -e」命令,然後輸入想要定時執行的任務即可。不過,當我們執行「crontab -e」命令時,開啟的是乙個空檔案,而且操作方法和 vim 是一致的。那麼,這個檔案的格式才是我們真正需要學習的內容。檔案格式如下:
[root@localhost !]# crontab -e
#進入 crontab 編輯介面。會開啟vim編輯你的任務
* * * * * 執行的任務
這個檔案中是通過 5 個「*」來確定命令或任務的執行時間的,這 5 個「*」的具體含義如表 2 所示。
表 2 crontab 時間表示
專案 含義 範圍 第乙個"*" 一小時當中的第幾分鐘(minute) 0~59 第二個"*" 一天當中的第幾小時(hour) 0~23 第三個"*" 乙個月當中的第幾天(day) 1~31 第四個"*" 一年當中的第幾個月(month) 1~12 第五個"*" 一周當中的星期幾(week) 0~7(0和7都代表星期日)
在時間表示中,還有一些特殊符號需要學習,如表 3 所示。
表 3 時間特殊符號
特殊符號
含義*(星號)
代表任何時間。比如第乙個"*"就代表一小時種每分鐘都執行一次的意思。
,(逗號)
代表不連續的時間。比如"0 8,12,16***命令"就代表在每天的 8 點 0 分、12 點 0 分、16 點 0 分都執行一次命令。
-(中槓)
代表連續的時間範圍。比如"0 5 ** 1-6命令",代表在周一到週六的凌晨 5 點 0 分執行命令。
/(正斜線)
代表每隔多久執行一次。比如"*/10****命令",代表每隔 10 分鐘就執行一次命令。
當「crontab -e」編輯完成之後,一旦儲存退出,那麼這個定時任務實際就會寫入 /var/spool/cron/ 目錄中,每個使用者的定時任務用自己的使用者名稱進行區分。而且 crontab 命令只要儲存就會生效,只要 crond 服務是啟動的。知道了這 5 個時間欄位的含義,我們多舉幾個時間的例子來熟悉一下時間字段,如表 4 所示。
表 4 crontab舉例 時間
含義45 22 ***命令
在 22 點 45 分執行命令
0 17 ** 1命令
在每週一的 17 點 0 分執行命令
0 5 1,15**命令
在每月 1 日和 15 日的凌晨 5 點 0 分執行命令
40 4 ** 1-5命令
在每週一到周五的凌晨 4 點 40 分執行命令
*/10 4 ***命令
在每天的凌晨 4 點,每隔 10 分鐘執行一次命令
0 0 1,15 * 1命令
在每月 1 日和 15 日,每週乙個 0 點 0 分都會執行命令,注意:星期幾和幾日最好不要同時出現,因為它們定義的都是天,非常容易讓管理員混淆
現在我們已經對這 5 個時間字段非常熟悉了,可是在「執行的任務」欄位中都可以寫什麼呢?既可以定時執行系統命令,也可以定時執行某個 shell 指令碼,這裡舉幾個實際的例子。
【例 1】讓系統每隔 5 分鐘就向 /tmp/test 檔案中寫入一行「11」,驗證一下系統定時任務是否會執行。
[root@localhost ~]# crontab -e
#進入編輯介面
*/5 * * * * /bin/echo "11" >> /tmp/test
[root@mysql cron]# crontab -l
*/5 * * * * /bin/echo >> /tmp/text
[root@mysql cron]# ll /var/spool/cron/
total 4
-rw-------. 1 root root 35 mar 27 16:04 root
[root@mysql cron]# cat root
*/5 * * * * /bin/echo "crontab test">> /tmp/text
這個任務在時間工作中沒有任何意義,但是可以很簡單地驗證我們的定時任務是否可以正常執行。如果覺得每隔 5 分鐘太長,那就換成「*」,讓它每分鐘執行一次。而且和 at 命令一樣,如果我們定時執行的是系統命令,那麼最好使用絕對路徑。
【例 2】讓系統在每週二的凌晨 5 點 05 分重啟一次。
[root@localhost ~]# crontab -e
5 5 * * 2 /sbin/shutdown -r now
如果伺服器的負載壓力比較大,則建議每週重啟一次,讓系統狀態歸零。比如絕大多數遊戲伺服器每週維護一次,維護時最主要的工作就是重啟,讓系統狀態歸零。這時可以讓我們的伺服器自動來定時執行。
【例 3】在每月 1 日、10 日、15 日的凌晨 3 點 30 分都定時執行日誌備份指令碼 autobak.sh
[root@localhost ~]# crontab -e
30 3 1,10,15 * * /root/sh/autobak.sh
這些定時任務儲存之後,就可以在指定的時間執行了。我們可以使用命令來檢視和刪除定時任務,命令如下:
[root@localhost ~]# crontab -l
#檢視root使用者的crontab任務
*/5 * * * * /bin/echo "crontab test" >> /tmp/test
5 5 * * 2 /sbin/shutdown -r now
30 3 1,10,15 * * /root/sh/autobak.sh
[root@localhost ~]# crontab -r
#刪除root使用者所有的定時任務。如果只想刪除某個定時任務,則可以執行「crontab -e」命令進入
#編輯模式手工刪除
[root@localhost ~]# crontab -l
no crontab for root
#刪除後,再查詢就沒有root使用者的定時任務了
在書寫 crontab 定時任務時,需要注意以下幾個事項: python運維 ansible迴圈
有可能在乙個任務中,可能要做很多事情,例如建立多個使用者,安裝很多個包等,那麼就有可能用到迴圈。重複的任務可以用下面的方式 name add several users user name state present groups wheel with items testuser1 testuse...
linux crontab命令詳解
12 3 root tar czf usr local backups daily etc.tar.gz etc dev null 2 1這條語句將在每天的凌晨3點12分 03 12 執行tar czf usr local backups daily etc.tar.gz etc命令。dev nul...
linux crontab命令使用
cron用法說明 cron 於希臘單詞chronos 意為 時間 是linux系統下乙個自動執行指定任務的程式。例如,你想在每晚睡覺期間建立某些檔案或資料夾的備份,就可以用cron來自動執行。cron服務是linux的內建服務,但它不會開機自動啟動。可以用以下命令啟動和停止服務 sbin servi...