crond是linux系統中用來按期執行命令或指定程序的一種服務或軟件。
特殊要求:(秒級別)crond服務就沒法搞定了,通常工做中寫腳本用守護進程執行html
[root@shellbiancheng jiaobenlianxi]# cat while1.sh #!/bin/sh while true do uptime sleep 2 done
(1)linux系統自身按期執行的任務操做,如輪詢系統日誌、備份系統數據、清理系統緩存等,這些任務無需咱們人爲干預。例如:java
[root@linzhongniao ~]# ls -l /var/log/messages* -rw-------. 1 root root 206776 Aug 2 17:43 /var/log/messages -rw-------. 1 root root 448307 Jul 8 08:54 /var/log/messages-20180708 -rw-------. 1 root root 742560 Jul 16 04:05 /var/log/messages-20180716 -rw-------. 1 root root 1293433 Jul 22 15:15 /var/log/messages-20180722 -rw-------. 1 root root 622193 Jul 30 20:14 /var/log/messages-20180730 [root@linzhongniao ~]# ll /etc/|grep cron -rw-------. 1 root root541 Aug 24 2016 anacrontab drwxr-xr-x. 2 root root 4096 Jul 16 14:19 cron.d drwxr-xr-x. 2 root root 4096 Jul 16 14:18 cron.daily -rw-------. 1 root root 0 Aug 24 2016 cron.deny drwxr-xr-x. 2 root root 4096 Jul 16 14:19 cron.hourly drwxr-xr-x. 2 root root 4096 Jun 14 05:01 cron.monthly -rw-r--r--. 1 root root457 Sep 27 2011 crontab drwxr-xr-x. 2 root root 4096 Sep 27 2011 cron.weekly
2)用戶執行的任務操做:某個用戶或系統管理員按期要作的任務工做,例如每隔5分鐘和互聯網上時間服務器進行同步,天天晚上0點備份站點數據及數據庫數據,通常這些工做須要由每一個用戶自行設置才行。
用戶執行的任務工做,也就是運維管理員執行的任務工做,所以這個用戶執行的任務是咱們的重點。node
linux系統下的定時任務還真很多,例如:at,crontab,anacronlinux
at:適合僅執行一次就結束的調度任務命令,例如:某天晚上須要處理一個任務,僅僅是這一天的晚上,屬於突發性任務,要執行at命令,還須要啓動atd的服務才行shell
[root@linzhongniao ~]# chkconfig --list|grep atd atd 0:off 1:off 2:off 3:off 4:off 5:off 6:off [root@linzhongniao ~]# chkconfig --list atd atd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@linzhongniao ~]# crontab --help crontab: invalid option -- '-' crontab: usage error: unrecognized option usage: crontab [-u user] file crontab [-u user] [ -e | -l | -r ] 《==指令語法 (default operation is replace, per 1003.2) -e (edit user's crontab) 《==編輯用戶的定時任務 -l (list user's crontab) 《==列出用戶的定時任務 -r (delete user's crontab) 《==刪除用戶的定時任務 -i (prompt before deleting user's crontab) 《==在刪除用戶的crontab以前提示 -s (selinux context)
命令格式數據庫
crontab –u (指定用戶默認是root)-[e|l|r]windows
經過crontab咱們能夠在固定的時間執行指定的系統指令或script腳本。時間間隔的單位是分鐘,小時,日,月,周及以上的任意組合(注意:日和周不要組合)。緩存
用戶所創建的crontab文件存於/var/spool/cron中如:root用戶的定時任務配置文件爲/var/spool/cron/root。bash
crontab用戶的定時任務通常分爲6段空格分隔。系統的定時任務則/etc/crontab分爲7段,前5段爲時間設定段,第六段以哪一個用戶執行crontab,第七段爲所要執行的命令段以下服務器
01 * * * * root run-parts /etc/cron.hourly 02 4 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly
系統的crontab文件是/etc/crontab
[root@linzhongniao ~]# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed 分 時 日 月 周 用戶 任務
提示:最後一次執行任務的時間是23:30
[root@linzhongniao ~]# chkconfig --list crond crond 0:off 1:off 2:on3:on4:on5:on6:off [root@linzhongniao ~]# /etc/init.d/crond status crond (pid 1837) is running... [root@linzhongniao ~]# ps -ef|grep crond|grep -v grep root 1837 1 0 21:58 ?00:00:00 crond [root@linzhongniao ~]# /etc/init.d/crond restart Stopping crond: [ OK ] Starting crond:[ OK ]
(1)編輯定時任務分鐘位上必須用00格式表示
例如,6月3日上午9:00去培訓,規則爲
00 09 03 06 *
(2)周和日不能同時使用
強調周和日儘可能不要同時用,不然可能達不到想要的效果
例如:
每週日上午9:30去上課
30 09 * * 7
或者 30 09 * * 0
(1)手動同步時間
[root@linzhongniao ~]# date Sat Aug 4 12:08:20 CST 2018 [root@linzhongniao ~]# date -s "23:00" Sat Aug 4 23:00:00 CST 2018 [root@linzhongniao ~]# date Sat Aug 4 23:00:03 CST 2018 [root@linzhongniao ~]# which ntpdate /usr/sbin/ntpdate [root@linzhongniao ~]# /usr/sbin/ntpdate ntp1.aliyun.com 4 Aug 12:10:21 ntpdate[1700]: step time server 52.163.118.68 offset -39052.961525 sec [root@linzhongniao ~]# date Sat Aug 4 12:10:30 CST 2018
(2)用定時任務自動同步
[root@linzhongniao ~]# crontab -l #sync sys time by linzhongniao at 2018-08-04 */2 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1 [root@linzhongniao ~]# /etc/init.d/crond restart Stopping crond: [ OK ] Starting crond:[ OK ] [root@linzhongniao ~]# date -s "23:00" Sat Aug 4 23:00:00 CST 2018 [root@linzhongniao ~]# date Sat Aug 4 23:00:06 CST 2018 [root@linzhongniao ~]# date Sat Aug 4 12:21:53 CST 2018
機器少還能夠和互聯網上時間同步,若是有不少服務器,能夠搭建一個內部的時間同步服務器ntp server。
提示:若是不加「>/dev/null 2>&1」會因產生垃圾文件致使磁盤inode耗盡的問題。
天天晚上12點打包站點目錄/var/www/html備份到/data目錄下(最好每次按時間生成不一樣的備份包)
[root@linzhongniao scripts]# cat httpd.sh #!/bin/bash cd /var/www/ tar zcfp /data/html_$(date +%Y%m%d%H%M).tar.gz ./html [root@linzhongniao scripts]# crontab -l|tail -2 #tar /var/www/html by shell scripts by linzhongniao at 201808 00 00 * * * /bin/bash /server/scripts/httpd.sh >/dev/null 2>&1
加必要註釋,寫定時任務規則時儘量加上註釋(最好是英文註釋),這是個好的習慣。
執行定時任務時,若是是執行腳本,請儘可能在腳本前面加上/bin/sh命令,不然有可能忘了給腳本加執行權限,而沒法完成任務。
須要root權限執行的任務能夠登陸到root用戶下而後設置,若是不須要root權限,能夠登陸到普通用戶下(也能夠直接在root下crontab –u linzhongniao –e的寫法直接設置)
切換到linzhongniao用戶
[linzhongniao@linzhongniao ~]$ whoami linzhongniao [linzhongniao@linzhongniao ~]$ crontab -l * * * * * /bin/sh tar.sh
不切換用戶直接查看定時任務
[root@linzhongniao ~]# crontab -u linzhongniao -l * * * * * /bin/sh tar.sh
看一下crond用戶的配置文件
[root@linzhongniao ~]# ll /var/spool/cron/ total 8 -rw-------. 1 root root 25 Aug 4 14:25 linzhongniao -rw-------. 1 root root 222 Aug 4 2018 root
平時工做中儘可能多用crontab –e和crontab –l去編輯和查看定時任務,由於會有語法錯誤檢查。
若是給1000臺服務器同時添加系統時間實時同步,不可能一個一個改,此時就須要批量分發工具或批量運維腳本。
/dev/null是特殊的設備,表示黑洞設備或空設備;2>&1表示標準錯誤輸出和標準輸出的輸出的路徑都同樣。>/dev/null 2>&1至關於1>/dev/null,2>/dev/null
系統定時任務分七段,若是某一臺服務器上的用crontab –l查看沒有定時任務,就上系統定時任務裏面用cat查看。
[root@linzhongniao ~]# cat /etc/crontab SHELL=/bin/bash shell解釋器 PATH=/sbin:/bin:/usr/sbin:/usr/bin PATH變量 MAILTO=root 定義若是任務有輸出,發給哪一個用戶默認是root用戶 HOME=/ # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed 分 時 日 月 周 用戶 腳本
經過run-parts使得系統能夠定時執行目錄下的全部可執行文件
按周執行的配置文件
[root@linzhongniao ~]# tree /etc/cron.weekly /etc/cron.weekly 0 directories, 0 files
按天執行的配置文件
[root@linzhongniao ~]# ll /etc/cron.daily/ total 24 -rwx------. 1 root root 180 Jul 10 2003 logrotate -rwx------. 1 root root 927 Mar 22 2017 makewhatis.cron -rwx------. 1 root root 189 Jan 26 2015 mlocate.cron -rwxr-xr-x. 1 root root 2126 Jul 19 2013 prelink -rwxr-xr-x. 1 root root 563 Nov 23 2013 readahead.cron -rwxr-xr-x. 1 root root 433 Nov 7 2015 tmpwatch
在調試時,把任務執行頻率調快一些。如:每分鐘、每5分鐘執行一次,或者比當前時間推遲5分鐘之後或者每2鍾執行。按己想象的去執行了,若是沒問題再改爲須要的任務執行的時間。
強調:有些任務是不容許頻繁執行的,例如:定時往數據庫裏插入數據,這樣的任務在測試機上測試好,而後正式線上出現問題的機會就少了。
用正確的執行任務的時間。設置完成後,能夠修改下當前時間,改爲任務執行時間的前幾分鐘來測試(或者重啓定時任務服務)如:定時任務9:00執行,咱們能夠把系統時間改爲8:55分,而後觀察是否是正確執行了,當前時間要比任務時間提早足夠長,只在測試服務器上操做,若是生產服務器不要這樣處理。
在腳本中加入日誌輸出,而後把輸出打到指定的日誌中,而後觀察日誌內容結果。看是否執行或正確執行,或向下面的內容把腳本結果重定向到一個log文件裏。好比 tar zcvf命令加-v參數,在把輸出放到日誌裏面,經過日誌就能夠查看腳本有沒有執行。
*/2 * * * * /usr/sbin/ntpdate time.windows.com >>/app/ntpdate.log
*/1 * * * * echo 「==」>>/tmp/oldboy.log >/dev/null 2>&1
這是隱蔽的沒法執行的任務配置,緣由是前面多了一個>>/tmp/oldboy.log,或者去掉>/dev/null 2>&1。
在調試java程序的時候,注意環境變量,要把環境變量的定義追加到腳本里,從新export一下。通常都放在全局變量/etc/profile裏面,可是用定時任務執行腳本還須要從新加載一下環境變量。
export PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"
[root@linzhongniao app]# tail -f /var/log/cron Aug 5 11:01:01 localhost run-parts(/etc/cron.hourly)[2054]: starting 0anacron Aug 5 11:01:02 localhost anacron[2068]: Anacron started on 2018-08-05 Aug 5 11:01:02 localhost run-parts(/etc/cron.hourly)[2070]: finished 0anacron Aug 5 11:01:02 localhost anacron[2068]: Will run job `cron.daily' in 34 min. Aug 5 11:01:02 localhost anacron[2068]: Jobs will be executed sequentially Aug 5 11:02:01 localhost CROND[2075]: (root) CMD (/usr/sbin/ntpdate time.windows.com >/app/ntpdate.log)
crontab執行shell時只能識別很少的系統環境變量,普通變量是沒法識別的。若是在編寫的腳本中須要使用變量,最好使用export從新聲明一下該變量,腳本才能正常執行。例如生產中和java相關的服務任務和腳本。也能夠在腳本中添加PATH環境變量加完PATH環境變量就不用寫執行命令全路徑了。例以下面的/bin/tar,就能夠不寫了。
[root@linzhongniao ~]# cat /server/scripts/tar.sh #!/bin/bash export PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin" cd /server/ /bin/tar zcf backup_$(date +%Y%m%d%H%M).tar.gz ./scripts
必定要用絕對路徑不要用相對路徑。推薦定時執行腳本。
要加/bin/sh執行,也能夠不在定時任務中用/bin/sh就要給腳本可執行權限。
「%」百分號在crontab任務中認爲是newline,須要用「\」轉義。crontab任務命令中,若是有「date +%Y%m%d%H%M」(或date +%Y-%m-%d-%H:%M),必須替換爲「date +\%Y\%m\%d\%H\%M」,但寫在腳本中的「%」百分號就不須要轉義了。
寫定時任務要加上註釋如:什麼人,什麼時間,由於誰,作了什麼事都要標記清楚如誰與2018-08-01日在http服務器上作了10分鐘同步的操做。
使用腳本執行任務能夠減小錯誤,提高效率,規範,是個好習慣。
定時任務腳本中的程序命令儘可能用全路徑。
企業inode被填滿的企業案例
問題:修改用戶密碼和添加用戶時出現下面錯誤,可是用df –h發現磁盤沒滿,請問爲何?
一、修改密碼時報錯 passwd: Authentication token manipulation error 二、添加用戶報錯:unable to lock password file
分析思路:查看/etc/passwd和/etc/shadow的文件權限沒有問題,再使用命令strace -f passwd 追蹤分析緣由,看到關鍵報錯信息:「No space left on device」。最後用df -hi查看發現根分區的inode滿了。
解決辦法:
(1 打開郵件服務,打開郵件服務就把郵件目錄清空了不要直接刪除文件,生產環境郵件服務是不開的。
(2 在定時任務最後加>/dev/null 2>&1將輸出內容定義到空。這樣就不會產生垃圾文件了。