Linux系統中的定時任務cron,一個很實際很有效很簡單的一個工作,在日常的生產環境中,會被廣泛使用的一個組件。通過設置時間、執行的腳本等內容,能夠讓系統自動的執行相關任務,很是方便。
cron定時任務,在系統中能夠執行,需要有一個依賴的服務,也就是crond定時任務服務,該服務默認情況下是開機自啟動的,通過命令chkconfig 可以查看,設置開機啟動的命令,chkconfig crond on。
在為系統用戶創建定時任務時,默認會在/var/spool/cron/目錄下,創建以系統用戶用戶名為名稱的文件,在該文件中記錄了用戶設置的定時任務。定時任務的執行,該用戶必須存在於系統中。
通過命令crontab -l,可以查看當前用戶設置的定時任務,如果要查看其它用戶設置的定時任務,可以是crontab -lu username,crontab -e是用來設置用戶的定時任務,實際上也就是編輯/var/spool/cron/下的文件。
cron定時任務,在編寫定時任務時,也是有固定格式的,時間+執行的命令。具體可以看看cron的幫助信息,或者查看crontab文件內容。
1 [bobo@localhost ~]$ cat /etc/crontab 2 SHELL=/bin/bash 3 PATH=/sbin:/bin:/usr/sbin:/usr/bin 4 MAILTO=root 5 HOME=/ 6 7 # For details see man 4 crontabs 8 9 # Example of job definition: 10 # .---------------- minute (0 - 59) 11 # | .------------- hour (0 - 23) 12 # | | .---------- day of month (1 - 31) 13 # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... 14 # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat 15 # | | | | | 16 # * * * * * user-name command to be executed
這里詳細說明了定時任務的寫法,分鍾、小時、日期、月份、星期,定義了5個時間參數之后,后面是要執行的用戶命令,默認情況下,系統會每分鍾檢查定時任務是否要執行,執行后會給該定時任務的屬主發送mail。在日期填寫中,有特殊字符,比如*表示任意的某個時間點,在5個時間設置位上,表示任意分鍾、任意小時等等,也就是任意,如果是*/n,表示每n個單位,比如每5分鍾,*/5。下面,我們寫幾個定時任務,測試一下。
使用普通用戶,創建定時任務,每分鍾向自己家目錄下的文件中增加一條日志記錄。
首先,先測試一下命令是否可用,看是否能正常執行
1 [bobo@localhost ~]$ echo this is a cron task >>$HOME/crontask 2 [bobo@localhost ~]$ cat /home/bobo/crontask 3 this is a cron task 4 [bobo@localhost ~]$ echo `date ` this is a cron task 5 Thu Mar 15 09:04:08 CST 2018 this is a cron task 6 [bobo@localhost ~]$ echo `date ` this is a cron task >> $HOME/crontask 7 [bobo@localhost ~]$ cat ~/crontask 8 this is a cron task 9 Thu Mar 15 09:06:11 CST 2018 this is a cron task 10 [bobo@localhost ~]$
然后將命令寫入文件中,可以通過crontab -e或者vim /var/spool/cron/username,進行編輯,然后通過crontab -l進行查看
1 [bobo@localhost ~]$ crontab -l 2 */1 * * * * echo `date` crontask runing >>$HOME/crontask
我們可以通過tail -f 查看該文件的變化,每隔1分鍾,會增加一行內容記錄
這樣,就可以說明,定時任務在正常執行。
定時任務書寫規范
1、在編寫定時任務時,需要為定時任務增加注釋,讓其他人知道,這個定時任務是誰寫的,作用是什么。在crontab -e中,注釋以#開頭
2、在編寫定時任務時,盡量用命令去執行,把要執行的命令寫入到shell腳本中,然后通過sh執行,然后將輸出結果寫入空設備,將錯誤結果輸出到空設備中,具體寫法是 1>/dev/null 2>&1,如果不這么寫,由於系統每次運行一次定時任務,就會給root用戶發送一封郵件,當系統沒有開啟郵件服務的時候,會在郵件maildrops目錄中生產大量的小文件,這樣的小文件,雖然不會占用系統多大的容量,但是會占用系統大量的inode,當系統的inode耗盡時,系統將無法再次寫入文件。
當啟用了postfix應用之后,改目錄會迅速發送完成,不再占用。
所以,對於之前寫的那個定時任務,優化下,建立一個sh文件,將要執行的命令,寫入到sh文件中,然后在cron定時任務中,寫入注釋。