linux定時任務crond服務應用指南
1、crond是什麼?
crond是linux系統中用來定期執行指令或者指定程式的程式(軟體)
2、秒級任務
(1)crond需要方式實作
(2)自己寫守護程序shell循環
(3)Quartz也可實作妙計任務
3、定時任務的作用
伺服器:7*24小時開機提供服務是網站的基本特征
有重要資料:提高備份周期和備份數量
linux系統中定時任務排程的工作可以分為一下兩種
(1)系統自身的定期執行的任務
系統周期性自行執行的任務工作。如輪詢系統日志、備份系統資料、清理系統緩存等
[root@ysolin ~]# ls -l /var/log/messages* 系統的日志
-rw-------. 1 root root 201123 6月 28 14:44 /var/log/messages
-rw-------. 1 root root 200796 6月 26 03:49 /var/log/messages-20160626
系統自動輪詢任務的設定配置路徑:
[root@ysolin ~]# ls -l /etc/ |grep cron
-rw-------. 1 root root 541 11月 23 2013 anacrontab
drwxr-xr-x. 2 root root 4096 6月 24 18:13 cron.d
drwxr-xr-x. 2 root root 4096 9月 27 2011 cron.daily
-rw-------. 1 root root 0 11月 23 2013 cron.deny
drwxr-xr-x. 2 root root 4096 9月 27 2011 cron.hourly
drwxr-xr-x. 2 root root 4096 9月 27 2011 cron.monthly
-rw-r--r--. 1 root root 457 9月 27 2011 crontab
drwxr-xr-x. 2 root root 4096 9月 27 2011 cron.weekly
(2)使用者執行的定時任務
某個使用者或系統管理者定期要做的任務工作,使用者執行放入任務工作,也就是我們運維管理人員執行的任務工作。
例如:伺服器時間同步
[root@ysolin ~]# crontab -l #檢視定時任務
time sync by solin
*/5 * * * * /sbin/ntpdate time.windows.com >/dev/null 2>&1
2、Linux系統下定時任務軟體種類
(1)at适合執行一次就結束的排程任務。依賴服務atd
(2)anacron适合于非7*24小時開機的服務準備。anacron并不能指定具體時間執行任務工作,而是以天為周期或者在系統每次開機後執行的任務工作,它會檢測伺服器停機期間應該執行,但沒有執行的任務工作,并将該任務執行一遍。
(3)crond,crond服務預設情況(每分鐘),會檢查系統中是否有需要執行的定時任務,若有會根據定義好的規則來執行這個定時任務。
注:
(1)crond服務是運作的程式,而crontab指令使用者用來設定定時規則的指令
(2)crond服務是企業生産工作中常用的重要服務,at和anacron很少使用,可以忽略。
1、文法指令
crontab [-u user] {-l | -e | -r |-i}
檢視幫助
[root@ysolin ~]# 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)
-s (selinux context)
2、指令說明
通過crontab我們可以在固定的間隔時間執行指定的系統指令或script腳本。時間間隔的機關是分、時、日、月、周及以上的任意組合。
3、使用者權限檔案
檔案 說明
/etc/cron.deny #該檔案中所列使用者不允許使用crontab指令
/etc/cron.allow #該檔案中所列使用者允許使用crontab指令,優先于/etc/cron.deny
/etc/spool/cron/ #所有使用者crontab配置檔案預設都存在此目錄,檔案名以使用者名指令
注:
crontab -e = vi /var/spool/cron/root
crontab -l = cat /var/spool/cron/root
4、指令選項說明含義表
-e (edit user's crontab) #編輯crontab檔案内容
-l (list user's crontab) #檢視crontab檔案内容
-r (delete user's crontab) #删除crontab檔案内容
-i (prompt before deleting user's crontab) #删除crontab檔案内容,删除前會提示。
-u #指定使用的使用者執行任務
5、指令的使用格式
(1)crond文法格式中時間段的含義
[root@ysolin ~]# 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
(2)crontab文法格式中特殊符号含義
* # *号,表示任意時間,如每分、每小時、每日、每月、每周
- # 減号,表示分隔符,表示一個範圍區間
, # 逗号,表示分割時間段的意思。
/n # n代表數字,即“每隔n機關時間”
(3)crontab依賴服務
[root@ysolin ~]# chkconfig --list crond
crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@ysolin ~]# /etc/init.d/crond status
crond (pid 1430) is running...
[root@ysolin ~]# ps -ef |grep crond | grep -v grep
root 1430 1 0 Jun28 ? 00:00:00 crond
[root@ysolin ~]# /etc/init.d/crond restart
Stopping crond: [ OK ]
Starting crond: [ OK ]
範例1:每五分鐘同步一次系統時間
[root@ysolin ~]# vi /var/spool/cron/root
[root@ysolin ~]# echo 'time sync by solin' >>/var/spool/cron/root
[root@ysolin ~]# echo '*/5 * * * * /sbin/ntpdate time.windows.com >/dev/null 2>&1' >>/var/spool/cron/root
[root@ysolin ~]# crontab -l
範例2:每個月1、10、20日的淩晨3:30分重新開機apache
30 3 1,10,20 * * /application/apache/bin/apachectl graceful
1、規範定時任務兩例(練習)
(1)每分鐘列印一次solil到/var/log/solin.log中
[root@ysolin ~]# crontab -e
添加任務
#print my name to log
* * * * * echo solil >>/var/log/solin.log
#time sync by solin
#print my name to log
* * * * * echo solil >>/var/log/solin.log
[root@ysolin ~]# cat /var/log/solin.log
solil
(2)周期任務使用腳本每周六、日上午九點和下午兩點(周期)列印時間(格式:****-**-**)
建立腳本
[root@ysolin ~]# date +%F
2016-06-29
[root@ysolin ~]# echo 'date +%F' >scripts/date.sh
[root@ysolin ~]# cat scripts/date.sh
date +%F
[root@ysolin ~]# sh scripts/date.sh
設定定時任務
[root@ysolin ~]# echo "#print date " >>/var/spool/cron/root
[root@ysolin ~]# echo "00 09,14 * * 6,7 /bin/sh /root/scripts/date.sh >/dev/null 2>&1" >>/var/spool/cron/root
[root@ysolin ~]# crontab -l |tail -2
#print date
00 09,14 * * 6,7 /bin/sh /root/scripts/date.sh >/dev/null 2>&1
注:確定調用的指令是可執行的;路徑需要絕對路徑
2、書寫crond定時任務基本要領
(1)為定時任務指令加必要的注釋
寫定時任務規則時盡可能的加上注釋(最好是英文英文注釋),友善後期更高改,其他運維人員了解定時任務的内容
(2)執行腳本任務前加/bin/sh
執行定時任務時,如果是執行腳本,請盡量在腳本後面帶上/bin.sh指令,防止腳本沒有執行權限而出錯
(3)定時任務指令或腳本結尾加>/dev/null 2>&1
2>&1表示讓标準錯誤和标準輸出一樣,即把腳本正常和錯誤輸出都都重定向到/dev/null,不記錄任何輸出。
>/dev/null 2>&1等價于1>/dev/null 2>/dev/null 等價于 &>dev/null
如果定時任務規則結尾不加>/dev/null 2>&1,很容易導緻inode磁盤空間被占滿,進而系統服務不正常。
(4)定時任務或層序最好在腳本裡執行
(5)在指令使用者下執行相關定時任務
需要root權限執行的任務可以登入到root使用者然後設定,如果不需要root權限,可以登入到普通使用者(也可以直接在root下c’ron’tab -u solin -e的方式直接設定)設定。不同使用者環境問題:如果調用了環境變量/etc/profile (如生産環境中java程式的定時任務),最好在程式腳本中,将用的到環境變量重新export下
(6)生産任務程式不要随意列印輸出資訊
在開發定時任務程式或腳本時,在調試好腳本程式後,應盡量把DEBUG及指令輸出的内容資訊屏蔽掉,如果确實需要輸出日志,可定向指定日志檔案,避免産生系統垃圾。
(7)定時任務執行的腳本要規範路徑/server/scripts
(8)配置定時任務規範操作過程,防止出錯。
首先要在指令行操作成功,然後複制成功的指令到腳本裡,減少配置定時任務錯誤;
然後測試腳本,測試成功後,複制腳本的規範路徑到定時任務裡;
現在測試環境下測試,然後正式環境規範部署。
3、系統定時任務配置
輪詢日志
[root@ysolin ~]# ll /var/log/messages* #系統報錯日志
-rw-------. 1 root root 201538 6月 29 19:48 /var/log/messages
[root@ysolin ~]# ll /var/log/secure* #安全資訊和系統登入與網絡連接配接的資訊
-rw-------. 1 root root 8562 6月 29 23:43 /var/log/secure
-rw-------. 1 root root 6490 6月 26 01:45 /var/log/secure-20160626
[root@ysolin ~]# ls /etc/cron.daily/
logrotate
[root@ysolin ~]# cat /etc/cron.daily/logrotate # logrotate 程式是一個日志檔案管理工具
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
[root@ysolin ~]# cat /etc/logrotate.conf # logrotate 的配置檔案
# see "man logrotate" for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# use date as a suffix of the rotated file
dateext
# uncomment this if you want your log files compressed
#compress
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
minsize 1M
rotate 1
}
/var/log/btmp {
missingok
create 0600 root utmp
# system-specific logs may be also be configured here.
4、企業生産環境如何調試crond定時任務(個人建議)
(1)增加執行頻率調試任務
在調試時,把任務執行周期縮短,測試出定時任務效果
規範的操作流程(開發和運維人員):
個人的開發配置環境è辦公室的測試環境èIDC機房的測試環境èIDC機房的正式環境
(2)調整系統時間調試任務(不能用于生産環境)
把系統的時間調整為定時任務執行的前五分鐘,確定定時任務能夠正确執行。
(3)通過日志輸出調試定時任務
在腳本中加入日志輸出,然後把輸出打到指定的日志中,然後觀察日志内容結果,看是否執行或正确執行。
(4)注意一些任務指令帶來的問題
如:*/1 * * * * * echo “Hello Word” >> /tmp/solin.log >/dev/null 2>&1
因前面已經有了重定向,後面要去掉/dev/null 2>&1
(5)注意環境變量導緻的定時任務故障
在調試java程式的時候,注意環境變量,把環境變量的定義加到腳本裡
(6)通過crond定時任務服務日志調試定時任務
[root@ysolin ~]# tail -f /var/log/cron
Jun 30 02:00:01 ysolin CROND[3537]: (root) CMD (/sbin/ntpdate time.windows.com >/dev/null 2>&1)
Jun 30 02:01:01 ysolin CROND[3541]: (root) CMD (run-parts /etc/cron.hourly)
Jun 30 02:01:01 ysolin run-parts(/etc/cron.hourly)[3541]: starting 0anacron
Jun 30 02:01:01 ysolin anacron[3550]: Anacron started on 2016-06-30
Jun 30 02:01:01 ysolin anacron[3550]: Jobs will be executed sequentially
Jun 30 02:01:01 ysolin anacron[3550]: Normal exit (0 jobs run)
Jun 30 02:01:01 ysolin run-parts(/etc/cron.hourly)[3552]: finished 0anacron
Jun 30 02:05:01 ysolin CROND[3555]: (root) CMD (/sbin/ntpdate time.windows.com >/dev/null 2>&1)
Jun 30 02:10:01 ysolin CROND[3559]: (root) CMD (/sbin/ntpdate time.windows.com >/dev/null 2>&1)
Jun 30 02:15:01 ysolin CROND[3563]: (root) CMD (/sbin/ntpdate time.windows.com >/dev/null 2>&1)
1、系統環境變量問題
2、定時任務絕對路徑
3、腳本權限問題加/bin/sh
4、時間變量問題用反斜線
5、>/dev/null 2>&1,防止磁盤空間(inode)被占滿
6、定時任務規則之前加注釋
7、使用腳本程式代替指令行定時任務
8、避免不必要的程式及指令輸出
9、切到目标目錄的上一級打包目标
10、定時任務腳本中的程式指令用全路徑
1、No space left on davice生産環境故障
問題描述:
工作中設定crontab定時任務時任務規則儲存時,提示“No space left on davice”,此時df -h檢查磁盤,發現磁盤有空餘空間,用df -i檢查則發現/var目錄已占用100%的inode數量。
最後檢查發現/var/spool/clientmqueue/下有大量的檔案,執行cd /var/spool/clientmqueue ;rm -f * 自動跳出,無法删除
故障分析:
當系統中crond定時任務執行的程式有輸出内容時,輸出的内容會以郵件的形式放送給crond的使用者(預設是root),而sendmail等服務沒有開啟的時,這些郵件内容就會在郵件隊列臨時目錄中産生檔案,導緻消耗inode數量,一旦indode數量耗盡就會導緻系統無法寫入檔案而報錯:No space left on davice
解決方式:
(1)删除目錄或檔案
[root@ysolin ~]# cd /var/spool/clientmqueue && ls |xargs rm -f
或者
[root@ysolin ~]# cd /var/spool && rm -rf clientmqueue
[root@ysolin ~]# mkdir clientmqueue && chmod 770 clientmqueue && chown smmsp.smmsp -R /var/spool/clientmqueue
(2)修改定時任務,添加 >/dev/null 2>&1
2、No space left on davice生産環境故障
理論:
inode譯成中文就是索引節點,每個儲存設備(例如硬碟)或儲存設備的分區被格式化為檔案系統後,應該有兩部份,一部份是inode,另一部份是Block,Block是用來存儲資料用的。
而inode,就是用來存儲這些資料的資訊,這些資訊包括檔案大小、屬主、歸屬的使用者組、讀寫權限等。inode為每個檔案進行資訊索引,是以就有了inode的數值。作業系統根據指令,能通過inode值最快的找到相對應的檔案。
常見問題:No space left on device
解決思路
(1)檢視分區使用情況:
[root@ysolin ~]# df -lk
檢視分區使用情況
(2)檢視inode使用資訊:
[root@ysolin ~]# df -i
#檢視inode使用資訊
(1)find鎖定占用空間最大的目錄(通常目錄大小越大,表示目錄下的檔案越多)
(2)删除多餘的inode節點。(find /xxx -type f -exec rm {} \;)
如:
檢視系統空間使用最多的檔案
find / -type f -size -1k | xargs -i dirname {} | sort -nr| uniq -c | sort -nr | tail
删除:(一定要确定是自己的站點,而且所删除的東西已經不重要)
find /路徑/路徑 -size -1k -type f | xargs rm -f
本文轉自 運維小當家 51CTO部落格,原文連結:http://blog.51cto.com/solin/1860317,如需轉載請自行聯系原作者