一直寫定時任務的時候,都是直接用crontab命令,但是對cron定時任務這個東西有時候會混淆,所有就好好總結一下。
一、cron
crond:
計划任務的守護進程
1)以前經典的sysvinit方式使用/etc/rc.d/init.d或者/etc/init.d 啟動,現在的systemd方式,安裝了system服務啟動的文件/lib/systemd/system/crond.service,進程啟動方式為systemctl start crond.service,啟動后會立即返回,因此不需要在啟動的時候加&參數
2)cron進程會搜索/var/spool/cron目錄下以/etc/passwd中的賬戶名命名的定時任務文件,搜索到定時任務后會加載到內存。cron也會搜索/etc/anacrontab目錄與/etc/cron.d目錄下定時任務文件。cron會檢查所有找到的定時任務並檢查每一條定時任務看有沒有當前時間執行的。當執行命令時,任何的輸出都會以郵件的方式通知crontab的所屬者,或者通過crontab的環境變量里的MAILTO指定特定的郵件接收者,執行的定時任務的任何輸出也可以發送給系統日志通過-s選項
3)一共有兩種方式檢測到crontabs的變化,第一種方式是檢查文件的修改時間modtimes,第二種方式是使用inotify檢測。使用inotify的方式的話,在進程啟動的時候就開始inotify日志文件/var/log/cron
4)當使用第一種方式檢查文件的修改時間時,cron會每分鍾檢查一次modtime,任何的改變都會重新加載。當你改變了定時任務的時候,不需要重啟crond。modtime這種方式被用在inotify沒有被初始化時。
與cron相關的目錄和文件:
/etc/crontab:系統定時任務,只能root用戶使用,格式與crontab也不一樣。
/var/spool/cron 目錄 :通過crontab命令添加的定時任務會以添加的賬號命名放在此目錄下
/etc/cron.d:這個目錄里包含不同的用戶的定時任務
/etc/
cron.deny:禁止使用cron的用戶列表文件
/etc/
cron.allow:允許使用cron的用戶列表文件
/etc/cron.daily:存放每天執行一次的腳本
/etc/cron.hourly:存放每個小時執行一個的腳本
/etc/cron.monthly:存放每個月執行一次的腳本
/etc/cron.weekly:存放每個星期執行一個的腳本
二、使用crontab
crontab是cron的一個工具
1、crontab參數的使用
crontab -u:指定用戶進行操作,如crontab -u lile -e 那么編輯的就是lile用戶的crontab文件
crontab -l:輸出當前crontab添加的定時任務
crontab -r:刪除定時任務(慎用,或者做備份,刪除就沒了,存放的文件位置為/var/spool/cron目錄下,以所屬者命名)
crontab -e:編輯,添加定時任務
crontab -i:與-r參數一起使用,crontab -ri 的話會詢問是否刪除
1)root賬號通過crontab -e添加一條定時任務
然后在/var/spool/cron目錄下可以看到以root命名的定時任務文件
2)用戶lile通過crontab -l添加一條定時任務
然后在/var/spool/cron目錄下可以看到以lile命名的定時任務文件
3)
/var/log/cron日志:記錄cron執行定時任務的日志,哪個時間執行了什么任務
2、crontab的白名單與黑名單
crontab定時任務可以對不同的用戶進行設置是否允許使用定時任務。實現方式通過/etc/cron.allow與/etc/cron.deny。如果cron.allow文件存在,那么用戶必須存在此文件才能使用crontab;如果cron.allow不存在,cron.deny存在,那么用戶必須不存在cron.deny才能執行crontab。如果這兩個文件都不存在,那么只有超級用戶才能執行crontab。其他更加嚴格的認證方式可以通過/etc/security/access.conf來限制。
1)只有cron.deny時,默認都能使用crontab
,只有在cron.deny文件存在的禁止使用
把lile用戶添加到cron.deny,那么久禁止lile使用crontab了
2)當cron.deny與cron.allow都存在時,那么允許使用的用戶必須添加在cron.allow里,要不然一樣不能使用crontab(除了root)
3)
當cron.deny與cron.allow都不存在時,那么只有root能使用
3、crontab的格式
field allowed values ----- -------------- minute 0-59 hour 0-23 day of month 1-31 month 1-12 (or names, see below) day of week 0-7 (0 or 7 is Sunday, or use names)
例1:每天的十點五分執行腳本/home/lile/a.sh
5 10 * * * sh /home/lile/a.sh
例2:每天的10點到12點的5分,25分,35分打印test
5,25,35 10-12 * * * echo "test"
三、cron的發送郵件功能
crond的sendmail功能:
1:安裝sendmail
yum -y install sendmail sendmail-cf m4
2:測試
sendmail,報錯
解決辦法:
vim /etc/postfix/main.cf
inet_interfaces = localhost
改為
inet_interfaces = all
3:查看日志,cat /var/log/maillog
解決辦法:
vim /etc/hosts,再后面添加主機名
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 iZj6c5dly2y6k9y0thzjoqZ ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 iZj6c5dly2y6k9y0thzjoqZ
4:測試
使用root用戶crontab -e添加一條定時任務
28 16 * * * echo "test mail"
查看
日志 cat /var/log/cron,可以看到這個定時任務執行了
然后查看是否發送了郵件給指定的用戶,/var/spool/mail/root,可以看到郵件發過來了
5:通常會將這個發送郵件功能給關閉,因為當機器的定時任務多的時候會使得/var/spool/mail產生大量的文件,導致磁盤空間不足和inode用完,在添加定時任務的時候,最后每條后面添加一條 >/dev/null 2>&1
28 16 * * * echo "test mail" >/dev/null 2>&1
或者,在開始的時候添加MAILTO=""
MAILTO="" 28 16 * * * echo "test mail"
