1.定時任務介紹
1.1 crond是什麼
crond是linux系統中用來定期執行指令或指定程式的一種服務或軟體。
特殊要求:(秒級别)crond服務就無法搞定了,一般工作中寫腳本用守護程序執行
[[email protected] jiaobenlianxi]# cat while1.sh #!/bin/shwhile true do uptime sleep 2 done
1.2 linux系統crond的定時任務
(1)linux系統自身定期執行的任務操作,如輪詢系統日志、備份系統資料、清理系統緩存等,這些任務無需我們人為幹預。例如:
[[email protected] ~]# 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[[email protected] ~]# ll /etc/|grep cron -rw-------. 1 root root541 Aug 24 2016 anacrontabdrwxr-xr-x. 2 root root 4096 Jul 16 14:19 cron.ddrwxr-xr-x. 2 root root 4096 Jul 16 14:18 cron.daily -rw-------. 1 root root 0 Aug 24 2016 cron.denydrwxr-xr-x. 2 root root 4096 Jul 16 14:19 cron.hourlydrwxr-xr-x. 2 root root 4096 Jun 14 05:01 cron.monthly -rw-r--r--. 1 root root457 Sep 27 2011 crontabdrwxr-xr-x. 2 root root 4096 Sep 27 2011 cron.weekly
2)使用者執行的任務操作:某個使用者或系統管理者定期要做的任務工作,例如每隔5分鐘和網際網路上時間伺服器進行同步,每天晚上0點備份站點資料及資料庫資料,一般這些工作需要由每個使用者自行設定才行。
使用者執行的任務工作,也就是運維管理者執行的任務工作,是以這個使用者執行的任務是我們的重點。
1.3 linux系統下定時任務軟體種類
linux系統下的定時任務還真不少,例如:at,crontab,anacron
at:适合僅執行一次就結束的排程任務指令,例如:某天晚上需要處理一個任務,僅僅是這一天的晚上,屬于突發性任務,要執行at指令,還需要啟動atd的服務才行
[[email protected] ~]# chkconfig --list|grep atdatd 0:off 1:off 2:off 3:off 4:off 5:off 6:off[[email protected] ~]# chkconfig --list atdatd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
2.定時任務使用說明
[[email protected] ~]# crontab --helpcrontab: invalid option -- '-'crontab: usage error: unrecognized optionusage: crontab [-u user] filecrontab [-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]
2.1 指令說明
通過crontab我們可以在固定的時間執行指定的系統指令或script腳本。時間間隔的機關是分鐘,小時,日,月,周及以上的任意組合(注意:日和周不要組合)。
2.2 使用者權限及定時任務檔案
2.3 指令選項說明表
2.4 指令的使用格式
使用者所建立的crontab檔案存于/var/spool/cron中如:root使用者的定時任務配置檔案為/var/spool/cron/root。
crontab使用者的定時任務一般分為6段空格分隔。系統的定時任務則/etc/crontab分為7段,前5段為時間設定段,第六段以哪個使用者執行crontab,第七段為所要執行的指令段如下
01 * * * * root run-parts /etc/cron.hourly02 4 * * * root run-parts /etc/cron.daily22 4 * * 0 root run-parts /etc/cron.weekly42 4 1 * * root run-parts /etc/cron.monthly
系統的crontab檔案是/etc/crontab
[[email protected] ~]# cat /etc/crontab SHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=rootHOME=/# 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 分 時 日 月 周 使用者 任務
2.5 crontab文法格式中時間段得含義
提示:最後一次執行任務的時間是23:30
2.6 crontab文法格式中特殊符号含義
2.7 開啟定時任務服務
[[email protected] ~]# chkconfig --list crondcrond 0:off 1:off 2:on3:on4:on5:on6:off[[email protected] ~]# /etc/init.d/crond statuscrond (pid 1837) is running...[[email protected] ~]# ps -ef|grep crond|grep -v greproot 1837 1 0 21:58 ?00:00:00 crond[[email protected] ~]# /etc/init.d/crond restartStopping crond: [ OK ]Starting crond:[ OK ]
2.8 編輯定時任務注意事項
(1)編輯定時任務分鐘位上必須用00格式表示
例如,6月3日上午9:00去教育訓練,規則為
00 09 03 06 *
(2)周和日不能同時使用
強調周和日盡量不要同時用,否則可能達不到想要的效果
例如:
每周日上午9:30去上課
30 09 * * 7或者 30 09 * * 0
2.9 伺服器時間同步
(1)手動同步時間
[[email protected] ~]# dateSat Aug 4 12:08:20 CST 2018[[email protected] ~]# date -s "23:00"Sat Aug 4 23:00:00 CST 2018[[email protected] ~]# dateSat Aug 4 23:00:03 CST 2018[[email protected] ~]# which ntpdate/usr/sbin/ntpdate[[email protected] ~]# /usr/sbin/ntpdate ntp1.aliyun.com 4 Aug 12:10:21 ntpdate[1700]: step time server 52.163.118.68 offset -39052.961525 sec[[email protected] ~]# dateSat Aug 4 12:10:30 CST 2018
(2)用定時任務自動同步
[[email protected] ~]# crontab -l#sync sys time by linzhongniao at 2018-08-04 */2 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1[[email protected] ~]# /etc/init.d/crond restartStopping crond: [ OK ]Starting crond:[ OK ][[email protected] ~]# date -s "23:00"Sat Aug 4 23:00:00 CST 2018[[email protected] ~]# dateSat Aug 4 23:00:06 CST 2018[[email protected] ~]# dateSat Aug 4 12:21:53 CST 2018
機器少還可以和網際網路上時間同步,如果有很多伺服器,可以搭建一個内部的時間同步伺服器ntp server。
提示:如果不加“>/dev/null 2>&1”會因産生垃圾檔案導緻磁盤inode耗盡的問題。
3.生産環境crontab專業案例
每天晚上12點打包站點目錄/var/www/html備份到/data目錄下(最好每次按時間生成不同的備份包)
[[email protected] scripts]# cat httpd.sh#!/bin/bashcd /var/www/tar zcfp /data/html_$(date +%Y%m%d%H%M).tar.gz ./html[[email protected] scripts]# crontab -l|tail -2#tar /var/www/html by shell scripts by linzhongniao at 20180800 00 * * * /bin/bash /server/scripts/httpd.sh >/dev/null 2>&1
4.書寫定時任務5個基本要領
4.1 為定時任務規則加必要的注釋
加必要注釋,寫定時任務規則時盡可能加上注釋(最好是英文注釋),這是個好的習慣。
4.2 執行腳本任務前加/bin/sh
執行定時任務時,如果是執行腳本,請盡量在腳本前面加上/bin/sh指令,否則有可能忘了給腳本加執行權限,而無法完成任務。
4.3 在指定使用者下執行相關的定時任務
需要root權限執行的任務可以登入到root使用者下然後設定,如果不需要root權限,可以登入到普通使用者下(也可以直接在root下crontab –u linzhongniao –e的寫法直接設定)
切換到linzhongniao使用者
[[email protected] ~]$ whoamilinzhongniao[[email protected] ~]$ crontab -l* * * * * /bin/sh tar.sh
不切換使用者直接檢視定時任務
[[email protected] ~]# crontab -u linzhongniao -l* * * * * /bin/sh tar.sh
看一下crond使用者的配置檔案
[[email protected] ~]# 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台伺服器同時添加系統時間實時同步,不可能一個一個改,此時就需要批量分發工具或批量運維腳本。
4.4 定時任務結尾加>/dev/null 2>&1
/dev/null是特殊的裝置,表示黑洞裝置或空裝置;2>&1表示标準錯誤輸出和标準輸出的輸出的路徑都一樣。>/dev/null 2>&1相當于1>/dev/null,2>/dev/null
5.系統定時任務配置檔案/etc/crontab
系統定時任務分七段,如果某一台伺服器上的用crontab –l檢視沒有定時任務,就上系統定時任務裡面用cat檢視。
[[email protected] ~]# 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使得系統可以定時執行目錄下的所有可執行檔案
按周執行的配置檔案
[[email protected] ~]# tree /etc/cron.weekly/etc/cron.weekly0 directories, 0 files
按天執行的配置檔案
[[email protected] ~]# 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
6.生産場景如何調試crontab定時任務
6.1 增加執行頻率調試任務
在調試時,把任務執行頻率調快一些。如:每分鐘、每5分鐘執行一次,或者比目前時間推遲5分鐘以後或者每2鐘執行。按己想象的去執行了,如果沒問題再改成需要的任務執行的時間。
強調:有些任務是不允許頻繁執行的,例如:定時往資料庫裡插入資料,這樣的任務在測試機上測試好,然後正式線上出現問題的機會就少了。
6.2 調整系統時間調适任務
用正确的執行任務的時間。設定完成後,可以修改下目前時間,改成任務執行時間的前幾分鐘來測試(或者重新開機定時任務服務)如:定時任務9:00執行,我們可以把系統時間改成8:55分,然後觀察是不是正确執行了,目前時間要比任務時間提前足夠長,隻在測試伺服器上操作,如果生産伺服器不要這樣處理。
6.3 通過日志輸出調試定時任務
在腳本中加入日志輸出,然後把輸出打到指定的日志中,然後觀察日志内容結果。看是否執行或正确執行,或向下面的内容把腳本結果重定向到一個log檔案裡。比如 tar zcvf指令加-v參數,在把輸出放到日志裡面,通過日志就可以檢視腳本有沒有執行。
*/2 * * * * /usr/sbin/ntpdate time.windows.com >>/app/ntpdate.log
6.4 注意一些任務執行帶來的問題
*/1 * * * * echo “==”>>/tmp/oldboy.log >/dev/null 2>&1
這是隐蔽的無法執行的任務配置,原因是前面多了一個>>/tmp/oldboy.log,或者去掉>/dev/null 2>&1。
6.5 注意環境變量導緻的定時任務故障
在調試java程式的時候,注意環境變量,要把環境變量的定義追加到腳本裡,重新export一下。一般都放在全局變量/etc/profile裡面,但是用定時任務執行腳本還需要重新加載一下環境變量。
export PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"
6.6 通過定時任務日志/var/log/cron調試定時任務
[[email protected] app]# tail -f /var/log/cronAug 5 11:01:01 localhost run-parts(/etc/cron.hourly)[2054]: starting 0anacronAug 5 11:01:02 localhost anacron[2068]: Anacron started on 2018-08-05Aug 5 11:01:02 localhost run-parts(/etc/cron.hourly)[2070]: finished 0anacronAug 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 sequentiallyAug 5 11:02:01 localhost CROND[2075]: (root) CMD (/usr/sbin/ntpdate time.windows.com >/app/ntpdate.log)
7.生産定時任務注意事項
7.1 export變量問題
crontab執行shell時隻能識别不多的系統環境變量,普通變量是無法識别的。如果在編寫的腳本中需要使用變量,最好使用export重新聲明一下該變量,腳本才能正常執行。例如生産中和java相關的服務任務和腳本。也可以在腳本中添加PATH環境變量加完PATH環境變量就不用寫執行指令全路徑了。例如下面的/bin/tar,就可以不寫了。
[[email protected] ~]# cat /server/scripts/tar.sh#!/bin/bashexport 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
7.2 任務路徑問題
一定要用絕對路徑不要用相對路徑。推薦定時執行腳本。
7.3 腳本權限問題
要加/bin/sh執行,也可以不在定時任務中用/bin/sh就要給腳本可執行權限。
7.4 時間變量問題
“%”百分号在crontab任務中認為是newline,需要用“”轉義。crontab任務指令中,如果有“date +%Y%m%d%H%M”(或date +%Y-%m-%d-%H:%M),必須替換為“date +%Y%m%d%H%M”,但寫在腳本中的“%”百分号就不需要轉義了。
7.5 定時任務加注釋
寫定時任務要加上注釋如:什麼人,什麼時間,因為誰,做了什麼事都要标記清楚如誰與2018-08-01日在http伺服器上做了10分鐘同步的操作。
7.6 使用腳本程式替代指令
使用腳本執行任務可以減少錯誤,提升效率,規範,是個好習慣。
7.7 定時任務腳本的問題
定時任務腳本中的程式指令盡量用全路徑。
8.生産環境定時任務重制生産no space left
企業inode被填滿的企業案例
問題:修改使用者密碼和添加使用者時出現下面錯誤,但是用df –h發現磁盤沒滿,請問為什麼?
1、修改密碼時報錯 passwd: Authentication token manipulation error 2、添加使用者報錯: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将輸出内容定義到空。這樣就不會産生垃圾檔案了。
轉載位址:https://blog.51cto.com/10642812/2280981
部落格作者海風掠過的原創作品