第1章 定時任務介紹
1.1 什麼是定時任務?
crond是linux系統中用來定期執行命令或指定程序任務的一種服務或軟件。一般情況下,我們按裝完操作系統後,默認遍會啓動crond服務調度服務,在我們面前的系統安裝及開機啓動優化設置中,我們也設置保留了crond開機啓動。crond服務會定期(默認每分鐘檢查一次)檢查系統中是否有要執行的任務工作。如果有。變會根據埼玉縣設定的定時任務規則執行該定時任務。這個crond定時任務就相當於我們平時早起使用的鬧鐘一樣。
特殊需求:crond服務搞不定了(如任務精確到秒),一般工作中寫腳本守護進程執行。
這裏要求理解進程、程序、守護進程之前的關係。
1.2 linux系統crond的定時任務
linux系統中定時任務調度工作可以分爲以下兩種情況:
1.2.1 linux系統自身定期執行的任務工作:
系統週期性自行執行的任務工作,如輪詢系統日誌、備份系統數據、清理系統緩存等,這些任務無需我們認爲干預。如:
[root@oldboy ~]# ll /var/log/messages*
-rw------- 1root root 838513 Sep 8 23:52 /var/log/messages
-rw-------. 1 root root 496687 Aug 14 19:59/var/log/messages-20160814
-rw-------. 1 root root 1614991 Aug 21 12:14/var/log/messages-20160821
-rw------- 1root root 1419878 Aug 28 08:45 /var/log/messages-20160828
-rw------- 1root root 1104533 Sep 4 11:22/var/log/messages-20160904
1.2.2 用戶執行的任務工作:
某個用戶或系統管理員定期要做的任務工作,例如每隔5分鐘和互聯網上時間服務同步(這是安裝系統基礎優化部分的內容),每天晚上0點備份網站站點數據及數據庫數據,一般這些工作需要由每個用戶自行設置才行。所謂的用戶就是讀者或者在做的小夥伴。
例如:服務器時間同步
[root@oldboy ~]# crontab -l
#time sync by hz at 2016-8-19
*/5 * * * * /usr/sbin/ntpdate pool.ntp.org>/dev/null 2>&1
linux系統下定時任務軟件種類
1.3 linux系統下定時任務軟件
at,crontab,anacron.
at定時任務,是一種臨時性的定時軟件,在命令行設置at定時任務,只會執行一次,然後失效。跟windows裏cmd中的at定時任務類似。(不常用)
anacron定時任務,該定時任務可以在系統關機後,將關機期間的沒有執行的定時任務在開機的時候自動都執行一遍。然而在生產環境中,服務器是不允許停機的,所以該服務基本上也不會用到。(幾乎不用)
crond定時任務,該服務是生產環境普遍用到的定時任務,可以精確到分鐘。在系統優化中的精簡開機服務啓動項中將該服務保留,開機啓動。
第2章 定時任務crond使用說明
2.1 指令語法
crond定時任務的命令爲crondtab,常用選項:
crontab [-u user] file
crontab [-u user] [-l | -r | -e] [-i] [-s]
-u(user)執行該定時任務的用戶
-l(list)查看定時任務列表
-e(edit)編輯定時任務
2.2 定時任務的文件
定時任務的執行是由系統每隔一分鐘,系統自動掃描一次定時任務的定時文件,如果存在定時任務,就執行相應的命令。
2.2.1 系統定時任務文件:
[root@oldboy ~]# cat /etc/crontab
SHELL=/bin/bash #默認編輯器
PATH=/sbin:/bin:/usr/sbin:/usr/bin #定時任務中的PATH黃金變量
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 beexecuted
系統定時任務有七部分組成:分、時、日、月、周、用戶和命令。
2.2.2 用戶的定時任務文件
用戶定時任務文件在/var/spool/cron/下,
如系統的定時任務文件:
cat /var/spool/cron/root
#time sync by hz at 2016-8-19
*/5 * * * * /usr/sbin/ntpdate pool.ntp.org >/dev/null2>&1
用戶的定時任務由六部分組成:分、時、日、月、周、命令。
查看系統定時任務:
[root@oldboy ~]#crontab -l
#time sync by hz at 2016-8-19
*/5 * * * * /usr/sbin/ntpdate pool.ntp.org>/dev/null 2>&1
編輯系統定時任務:
[root@oldboy ~]# crontab -e
#time sync by hz at 2016-8-19
*/5 * * * * /usr/sbin/ntpdate pool.ntp.org>/dev/null 2>&1
crontab -e編輯定時任務實際上就是將定時任務寫到定時任務文件/var/spool/cron/root中,也可以直接將定時任務追加到該文件中。crontab -e的用法好處是系統自動檢測語法是否錯誤。所以初學者建議用此方法。
2.3 定時任務中的時間表示
定時任務中的時間是由一些特殊的字符和數字以特殊的排序組成的。
符號 | 用法 |
* | *代表“每”的意思,在什麼位置上就代表沒多長時間。 如:* * * * * 表示每分鐘 00 * * * * 表示每小時的整點 |
, | “,”表示間隔的時間,當時間不連續時,可以用逗號分隔開 如:15,30,45 * * * * 表示每小時的第15、30、45分鐘時執行命令。 |
- | “-”可以用來表示連續的時間段,從某一時間開始到某一時間結束。 如:00 23,01-07 * * * 表示每天的晚上23點到第二天早上的7點的整點執行命令。 |
/ | “/”表示每隔的意思,就是每隔多長時間。 如*/5 * * * * 表示每隔5分鐘執行一次命令 注意與*的區別 |
第3章 定時任務案例練習
實例3-1
每隔五分鐘同步一次系統的時間
/5 * * * * /usr/sbin/ntpdate pool.ntp.org>/dev/null 2>&1
實例3-2
每分鐘執行一次腳本/server/scripts/tar.sh
* * * * * /bin/sh /server/scripts/tar.sh>/dev/null 2>&1
實例3-3
每天晚上12點執行腳本/bin/sh/server/scripts/tar_html.sh
00 00 * * * /bin/sh /bin/sh/server/scripts/tar_html.sh >/dev/null 2>&1
實例3-4
每個月的4號和每週的週一至週三的上午11點整重啓Apache服務
00 11 4 * 1-3 /oldboy/weberber/apache/bin/apachectl restart
實例3-5
* 23,00-07/1 * * * /application/apache/bin/apachectlgraceful
以上不是表示每天晚上的23點到第二天的早上七點每小時重啓一次Apache服務。
實際表達的意思是每分鐘執行一次命令
若要表示每小時執行一次重啓服務的正確寫法是:
00 23,00-07/1 * * * /application/apache/bin/apachectl graceful
第4章 企業書寫定時任務規範
在生產環境中,操作正確的重要性是不言而喻的。爲了避免操作中的失誤,規範的操作流程是做到減少失誤的有效方法,下面以一個生產環境的案例來說明一下操作的正確流程。
4.1 實例演示規範操作
實例4-1規範定時任務案例:
每分鐘打包備份/etc/services文件一次到/tmp目錄下,要求打包文件不被覆蓋。
1、在命令行下測試成功
[root@oldboy ~]# cd /etc/
[root@oldboy /etc]# tar -zcf/tmp/services_backup$(date +%F-%H-%M).tar.gz services
[root@oldboy /etc]# ls/tmp/services_backup2016-09-09-22-37.tar.gz
/tmp/services_backup2016-09-09-22-37.tar.gz
2、將執行命令寫入腳本
[root@oldboy ~]# mkdir -p /server/scripts/
[root@oldboy /etc]# vim/server/scripts/backup_services.sh
1#!/bin/bash
2 cd /etc/&&\
3 /bin/tar-zcf /tmp/services_backup$(date +%F-%H-%M).tar.gz services
將前面執行成功的命令複製到腳本中,防止手動敲錯。
3、測試腳本
[root@oldboy /etc]# /bin/sh/server/scripts/backup_services.sh
[root@oldboy /etc]# ls/tmp/services_backup2016-09-09-22-*
/tmp/services_backup2016-09-09-22-37.tar.gz
/tmp/services_backup2016-09-09-22-43.tar.gz
測試腳本時要用全路徑,測試完成注意查看測試結果
4、編寫定時任務
[root@oldboy /etc]# crontab -l |tail -2
#backup services by crh at 2016-09-09
* * * * * /bin/sh/server/scripts/backup_services.sh >/dev/null 2>&1
注意定時任務的時間書寫格式,以及業務要求中的時間;
定時任務的命令要執行直接複製命令行中執行腳本的命令;
定時任務中執行腳本後結果記得定向到/dev/null中;
寫完定時任務注意查看是否正確。
5、查看定時任務執行效果
[root@oldboy /etc]# ls/tmp/services_backup2016-09-09-22-*
/tmp/services_backup2016-09-09-22-49.tar.gz
/tmp/services_backup2016-09-09-22-50.tar.gz
/tmp/services_backup2016-09-09-22-51.tar.gz
/tmp/services_backup2016-09-09-22-52.tar.gz
/tmp/services_backup2016-09-09-22-53.tar.gz
[root@oldboy /etc]# tail -f /var/log/cron
…………
Sep 922:50:01 oldboy CROND[1542]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Sep 922:51:01 oldboy CROND[1551]: (root) CMD (/bin/sh/server/scripts/backup_services.sh >/dev/null 2>&1)
Sep 922:52:01 oldboy CROND[1557]: (root) CMD (/bin/sh/server/scripts/backup_services.sh >/dev/null 2>&1)
Sep 922:53:01 oldboy CROND[1563]: (root) CMD (/bin/sh/server/scripts/backup_services.sh >/dev/null 2>&1)
查看執行的結果是否正確;
跟蹤定時任務日誌tail -f /var/log/cron 查看狀態。
6、儘量多環境測試後在上產線。
個人的虛擬機測試à辦公室環境測試àIDC機房測試àIDC正式環境
4.2 定時任務規範操作步驟:
1、在命令行下測試成功
2、將執行命令寫入腳本
3、測試腳本
4、編寫定時任務
5、查看定時任務執行效果
6、儘量多環境測試後在上產線。
4.3 定時任務規範習慣
1、註釋【規範和習慣】
2、命令放腳本文件裏
3、進入目標的上級目錄打包
4、命令在命令行測試好,然後複製後放入腳本
5、腳本文件要放在固定的規範的目錄/server/scripts
6、取消tar命令及腳本的無用輸出
7、腳本名字用.sh結尾
8、腳本前面要用/bin/sh執行腳本,並且腳本也要全路徑
9、複製執行的全路徑的腳本到定時任務裏配置,或者配置好定時任務後,複製定時任務命令到命令行測試。
10、 定時任務的結尾要加上>/dev/null 2>&1
第5章 企業案例
5.1 企業案例:inode被填滿的企業案例子。
郵件消息隊列文件
CentOS5 /var/spool/clientmquenue/
CentOS6 /var/spool/postfix/maildrop/
和定時任務相關的原因:
在定時任務中,定時任務執行出現錯誤,但是有沒有講錯誤輸出定向到/dev/null中,而且系統中的郵件服務有沒有開啓,導致系統報錯小文件堆積在郵件消息隊列文件下,佔用完系統的inode。
解決辦法:
1、將郵件服務打開,
2、將定時任務的結果定向到/dev/null
5.2 linux定時任務生產java服務無法執行問題羣友案例
http://oldboy.blog.51cto.com/2561410/1541515
分析:
conrd定時任務中的環境變量只包含了系統中的小部分,在執行命令的時候如果沒有加全路徑或將環境變量加入到腳本中,就會導致定時任務執行失敗。所以在定時任務中執行的命令要加上全路徑。在特殊情況下(Java)要將環境變量導入到執行的腳本中。使得定時任務能夠正確執行。