L017-linux系統定時任務crond入門小節
oh my god!how old are you?
怎么老是你?沒錯,我又來了,哈哈哈,今天是我的生日呢,在這么重要的日子里,必須要更一篇學習小節,OK,直奔主題!
首先呢,可以想一下,什么是程序?
其實要非常准確的答出來不是非常的好答出來的。
那么簡單的說一下
答:我們使用的命令,就是程序,二進制程序。
基本特征:一堆代碼,一個文件,一個命令。
程序是靜態的,放在電腦里沒有被運行。
程序存在於磁盤中
那么,進程又是什么呢?
簡單的說把系統中的程序運行起來就是進程。
進程會存放在內存中
每個進程在啟動時,系統會指定一個唯一的數字給每個進程,這個數字稱為進程ID或者PID進程號
每個進程可能有兩種方式存在:一個是前台,一個是后台
一般的系統網絡服務都是以后台方式存在的,且都會常駐在系統中,直到關機或者主動殺死時才能停止(比如ssh遠程連接服務,常稱之為守護進程)
這時,crontab是時候出現了!
crond是什么?請往下慢慢看
crond是linux系統中用來定期執行命令或者指定程序任務的一種服務或者軟件。
一般我們在裝完C5/C6系統的時候,crond就會默認存在了。
我們優化開機自啟動服務的時候,第一個就是crond。
crond默認情況(每分鍾),會檢查系統中是否有需要執行的定時任務,如果有,就會根據事先定義好的規則來執行這個定時任務。就好比生活中的鬧鍾一樣。
但是需要注意的是crontab對於秒級的任務(以秒為單位定時任務)是無能為力的,如果需要可以自己嘗試寫守護進程(shell循環)或者使用Quartz,他可以實現秒級任務。
那么,為什么需要定時服務?
1.服務器:7*24小時開機提供服務是網站的基本特征。
2.有重要數據:1天備一次,5份以上
服務器上的數據一般最低1天備一次,每分鍾(實時備份)再增量備份。
半夜備份:我們每天爬起來備份,然后睡覺,假設一次備份持續5小時。
基於這種情況,定時任務就產生了。定時任務可以實現幫助我們自動哦那個備份數據。
crond服務====鬧鍾(某種意義上)
linux定時任務分類:
1.系統自身的定期執行的任務
2.用戶執行的任務
以下為系統管理的定時文件(可以了解一下,平時用的不多):
[root@moban logrotate.d]# ll /etc/ | grep cron* -rw------- 1 root root 541 Nov 23 2013 anacrontab drwxr-xr-x. 2 root root 4096 Mar 23 11:12 cron.d drwxr-xr-x. 2 root root 4096 Mar 17 14:41 cron.daily -rw------- 1 root root 0 Nov 23 2013 cron.deny drwxr-xr-x. 2 root root 4096 Mar 17 14:41 cron.hourly drwxr-xr-x. 2 root root 4096 Mar 17 14:41 cron.monthly -rw-r--r-- 1 root root 457 Sep 27 2011 crontab drwxr-xr-x. 2 root root 4096 Sep 27 2011 cron.weekly
查看我目前機器的定時任務(后面的5行都是我自己加的):
[root@moban logrotate.d]# crontab -l */5 * * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1 #######*/1 * * * * cat /root/123.txt #######*/1 * * * * for n in `seq 5`;do touch $n.txt;done #######*/1 * * * * ll *30 *9 * * *0 /root/oldboy.sh */5 * * * * ntpdate time.windows.com
linux下的定時任務分類:
1)at 適合執行一次就結束的調度任務,每天晚上。了解即可。
依賴服務:atd
[root@moban logrotate.d]# chkconfig --list atd //因為都是用crontab,所以都裝機完成后關掉 atd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
2)anacron 適合於非7*24小時的開機的服務器准備的。開機執行的,檢測停機期間沒有執行的任務,在開機后一次性執行一遍。(因為工作中大多數的服務器都是7*24小時開機,所以這個定時任務的作用意義不大)
3)crond,crond服務默認情況(每分鍾),會檢查系統中是否有需要執行的定時任務,如果有就會根據事先定義好的規則來執行這個定時任務。
依賴的服務:crond(開機自啟動)
提示:我們說的crond是一個定時任務的守護進程,而crontab是一個命令,是用戶用來設置定時任務規則的命令。幾乎每個服務器都會用到crond服務。
下面着重的了解一下crontab吧
crontab
參數:
-l 顯示列表
-e 編輯定時任務
-r 刪除,用的比較少
-i 出現確認信息
我們常用crontab -l來查看定時任務信息,那么crontab文件是存在哪里呢?
[root@moban cron]# cat /var/spool/cron/root */5 * * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1 #######*/1 * * * * cat /root/123.txt #######*/1 * * * * for n in `seq 5`;do touch $n.txt;done #######*/1 * * * * ll *30 *9 * * *0 /root/oldboy.sh */5 * * * * ntpdate time.windows.com
由上可以看出,其實就是在cron文件夾下,有一個用戶名稱的文件,每個賬號的定時任務就存在對應文件里面。同理,crontab -e編輯的也就是這個文件。
下面這兩個基本不用,因為本身系統權限的設置,超級用戶可以給他的命令本身就給了,不給的他用循環也一樣做不了。
/etc/cron.deny 該文件中所列用戶不允許使用crontab命令
/etc/cron.allow 該文件中所列用戶允許使用crontab命令,優先於/etc/cron.deny。
下面是定時任務的使用指定格式:
# 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
簡單點兒記就是分時日月周
*代表每的意思
這節課基本上就是這么多啦,內容其實跟前兩節課一樣,不多!
下面就是老師在課上出的題了。鞏固練習一下。
第一部分-練習定時格式:
①30 3,12 * * * /bin/sh /scripts/oldboy.sh 每天凌晨3點半和中午12點半的時刻執行/scripts/oldboy.sh腳本 ②30 */6 * * * /bin/sh /scripts/oldboy.sh 每6小時30分執行一次/scripts/oldboy.sh腳本 ③30 8-18/2 * * * /bin/sh /scripts/oldboy.sh 在每天的8點到18點之間,每隔2小時的 半點時刻執行/scripts/oldboy.sh ④30 21 * * * /application/apache/bin/apachectl graceful 每天晚上9點半重啟apache ⑤ 45 4 1,10,22 * * /application/apache/bin/apachectl graceful 每月1日10日22日的4點45分重啟apache ⑥ 10 1 * * 6,0 /application/apache/bin/apachectl graceful 每周六和周日的凌晨1點10分重啟apache ⑦ 0,30 18-23 * * * /application/apache/bin/apachectl graceful 每天的18點到23點每隔30分鍾重啟一次apache。 提示:最后一次執行任務時23:30分 ⑧ 0 */1 * * * /application/apache/bin/apachectl graceful 每小時重啟一次apache ####⑨ * 23,00-07/1 * * * /application/apache/bin/apachectl graceful 每天的23點與0-7點之間每分鍾重啟一次apache ⑩ 00 11 * 4 1-3 /application/apache/bin/apachectl graceful 每年的4月份每周的周1到周3每天的11點整重啟一次apache //一般周和日盡量不要同時用,否則可能達不到想要的效果
第二部分-實際練習:
1.5月5日上午9點去老男孩培訓上課。規則為: 00 9 5 5 * 去老男孩兒培訓上課 2.每周日,上午9:30 去老男孩培訓上課。規則為: 30 9 * * 0 去老男孩兒培訓上課 3.每分鍾打印一次自己的名字拼音全拼到“/server/log/自己的名字命名的文件”中。 答: 方法一: [root@moban log]# crontab -e */1 * * * * echo lichaoran >> /server/log/lcr.txt 方法二: * * * * * echo lichaoran >> /server/log/lcr.txt
4.每周六和周日 上午9點和下午14點來老男孩linux培訓學習(/server/scripts/oldboy.sh)。 答: [root@moban log]# echo "date +%F" > oldboy.sh [root@moban log]# crontab -e 0 9,14 * * 6,7 /bin/sh /server/log/oldboy.sh >/dev/null 2>&1 //腳本最好是復制命令行執行過的或者把定時任務的腳本再復制到命令行一遍。而且要用絕對路徑,防止出錯。 執行sh前加/bin/sh //定時任務(一般是腳本任務)規則的價位最好加上 >/dev/null 2>&1 等內容,如果需要打印紙,則可以追加到指定的日志文件里(此時不要和/dev/null同時存在),盡量不要留空 //超過兩行的命令,最好用腳本,而不是直接在定時任務里寫上命令。(非必須) [root@moban ~]# cat /var/log/cron //所有定時任務所執行的命令日志都在這里面
最后,老師留了幾道題,是課下的作業,已經做出來了,但是正確率不敢保證,先寫上,下節課老師講完了我再改錯。
簡答題:
1.每隔1分鍾,打印一個+號到oldboy.log,請給出crontab完整命令。
*/1 * * * * /bin/echo echo "+" >> /server/log/oldboy.log
2.每隔2個小時將/etc/service文件打包備份到/tmp下(最好每次備份成不同的備份包)
[root@moban ~]# tar -czvf /tmp/$(date +%T)services.zip /etc/services //先寫出程序測試是否有問題 [root@moban log]# echo "tar -czvf /server/log/$(date +%T)services.zip /etc/services" > beifen.sh //程序放到beifen.sh中 [root@moban log]# crontab -e 0 */2 * * * /bin/sh /server/log/beifen.sh
3.每天晚上12點,打包站點目錄/var/www/html 備份到/data目錄下(最好每次備份按時間生成不同的備份包)
這道題跟上題類似 [root@moban log]# tar -cvzf /root/$(date +%m-%d-%h)html.zip /var/www/html/. [root@moban log]# echo "tar -cvzf /root/$(date +%m-%d-%h)html.zip /var/www/html/" >> /root/beifen.sh [root@moban log]# crontab -e 0 0 * * * /bin/sh /root/beifen.sh
4.每周 六、日 上午9:00和下午14:00來老男孩兒這里學習(執行程序/server/script/oldboy.sh代替學習)
[root@moban log]# crontab -e 0 9,14 * * 6,7 /bin/sh /server/script/oldboy.sh /dev/null 2>&1
5.如果在莫用戶的crontab文件中有以下記錄,該行中的命令多久執行一次(RGCE考題)?()
30 4 * * 3 mycmd
A每小時。
B每周
C每年三月中每小時一次
答:這道題我選B
6.如果在某用戶的crontab文件中有以下記錄,該行中的命令多久執行一次(RHCE考試題)?()
*/5 * * * * mycmd
A每5分鍾一次
B每小時過5分鍾
C不會運行,格式無效
答:這道題我選A
最后的最后附一張神圖:
2016年6月2日15:36:07
補充:
昨天最后的簡答題是老師留的作業,然后呢發現錯誤是真是多啊,上面的很多地方都不對,現在就把標准答案,也就是我的筆記補充上吧。
1.每隔1分鍾,打印一個+號到oldboy.log,請給出crontab完整命令。
昨天的解答:
*/1 * * * * /bin/echo echo "+" >> /server/log/oldboy.log >/dev/null 2>&1
問題:
a.沒注釋。不規范。
b.定時任務規則如果是命令,並且已經有從定向或者追加符號,一般要測試好加與不加>>/dev/null 2>&1 到控設備
c.要用絕對路徑,也就是完整路徑,且確保目錄要存在才行,日志文件oldboy.log可以存在
d.要用>>追加,不是>覆蓋,否則就算過了一天也只有一行而已。
還有一點因為前面已經有從定向了,所以后面不能加>/dev/null 2>&1了,會失效。
標綠為我做的有問題的地方
規范化答案:
#print a "+" every min by oldboy 13:20 2016-06-02 */1 * * * * /bin/echo echo "+" >> /server/log/oldboy.log >/dev/null 2>&1
2.每隔2個小時將/etc/services文件打包備份到/tmp下(最好每次備份成不同的備份包)
昨天的解答:
[root@moban ~]# tar -czvf /tmp/$(date +%F-%H)services.zip /etc/services //先寫出程序測試是否有問題 [root@moban log]# echo "tar -czvf /server/log/$(date +%F-%H)services.zip /etc/services" > beifen.sh //程序放到beifen.sh中 [root@moban log]# crontab -e 0 */2 * * * /bin/sh /server/log/beifen.sh
問題:
1、不要在根目錄下打包。進入打包文件或目錄的上級目錄進行打包。
2、定時任務是按小時,打包里的日期也要精確到小時。
3、命令行操作成功是定時任務可以成功的大前提。把成功打包的命令放到文件腳本里執行。
4、tar的參數 -czvf中的v是輸出,在執行腳本時不要加v。
5、規范腳本存放的目錄
6、定時任務打包或者處理其他工作最好不要在屏幕輸出。
7、從命令行到腳本的過程盡量復制,不用手敲。
8、測試打包的腳本是否正常。
9、命令行測試好。要用定時任務使用的完整命令測試。
10、執行腳本前面要加/bin/sh
11、* */2 * * * 的寫法是每分,不是每兩小時,一定要注意第一個*要變成0
12、命令放定時任務里不能有%,需要用“\”轉義,所以都要放腳本里
規范化答案:
[root@moban ~]# tar -czvf /tmp/$(date +%F-%H)services.zip /etc/services //先寫出程序測試是否有問題 [root@moban log]# vi /cron/beifen.sh //程序放到beifen.sh中 cd /etc/ tar -czvf /tmp/$(date +%F-%H)services.zip ./services //保存退出 [root@moban log]# crontab -e 0 */2 * * * /bin/sh /cron/beifen.sh >/dev/null 2>&1
3.每天晚上12點,打包站點目錄/var/www/html 備份到/data目錄下(最好每次備份按時間生成不同的備份包)
昨天的解答:
[root@moban log]# tar -cvzf /root/$(date +%m-%d-%h)html.zip /var/www/html/. [root@moban log]# echo "tar -cvzf /root/$(date +%m-%d-%h)html.zip /var/www/html/" >> /root/beifen.sh [root@moban log]# crontab -e 0 0 * * * /bin/sh /root/beifen.sh
由於這個題跟上題類似,所以就直接貼出來答案:
[root@moban log]# tar -cvzf /root/$(date +%m-%d-%h)html.zip /var/www/html/ [root@moban log]# vi /cron/beifen2.sh cd /var/www/ tar -czf /data/$(date +%m-%d-%h)html.zip ./html/ [root@moban log]# crontab -e 0 0 * * * /bin/sh /cron/beifen2.sh >/dev/null 2>&1
第四題就不貼啦,因為沒什么問題,跟老師講的一致。OK,就這樣!