為什么選用美食做網(wǎng)站主頁百度競價排名什么意思
十六、 計劃任務(wù)
在很多時候為了自動化管理系統(tǒng),我們都會用到計劃任務(wù),比如關(guān)機(jī),管理,備份之類的操作,我
們都可以使用計劃任務(wù)來完成,這樣可以是管理員的工作量大大降低,而且可靠度更好。
linux 系統(tǒng)支持一些能夠自動執(zhí)行任務(wù)的服務(wù),我們稱為計劃任務(wù)。
LINUX 有如下三種計劃任務(wù):
at:指定一個時間執(zhí)行一個任務(wù) (適用一個或多個任務(wù),執(zhí)行一次后就不用)
cron:根據(jù)一個時間表自動執(zhí)行任務(wù) (使用一個或多個任務(wù),周期性執(zhí)行)
系統(tǒng)級別的計劃任務(wù)及其擴(kuò)展 anacron:在一個指定時間間隔錯過后自動執(zhí)行任務(wù)
1 、 at: 安排一個任務(wù)在未來執(zhí)行,需要一個 atd 的系統(tǒng)后臺進(jìn)程
檢查 atd 進(jìn)程是否啟動
[root@centos61 桌面 ]# service atd status
atd (pid 2274) 正在運(yùn)行 ...
[root@centos61 桌面 ]# chkconfig |grep atd
atd
0: 關(guān)閉 1: 關(guān)閉 2: 關(guān)閉 3: 啟用 4: 啟用 5: 啟用 6: 關(guān)閉
如果未啟動,可以使用如下命令:
[root@centos61 桌面 ]# service atd start
正在啟動 atd : [ 確定 ]
[root@centos61 桌面 ]# chkconfig atd on
常用指令: at:安排延時任務(wù)
具體使用方法:
例 1:
#at now+2 minutes 回車
>輸入要執(zhí)行的命令 >ctrl+d 結(jié)束輸入
[root@test ~]# at now+2 minutes
at> wall Aixi
at> <EOT>
job 2 at 2010-06-18 16:36
<EOT>是 ctrl+d 中斷輸入,這個命令意思是發(fā)送一個廣播內(nèi)容是 Hello Aixi.具體時間可以改,單位可以改,可以用 hours,months,years,weeks 等.
例 2 我們還可以跟具體時間
[root@test ~]# at 16:39 dec 10
at> Hello Aixi
at> <EOT> ctrl+d 結(jié)束輸入
job 3 at 2010-12-10 16:39
意思是在今年的 12 月 10 日 16:39 運(yùn)行這個命令.如果不加月和日,默認(rèn)就是今天.
Atq:查詢當(dāng)前的等待任務(wù)
用 atq 來查詢,已經(jīng)運(yùn)行的任務(wù),就消失了。這就是 at 計劃任務(wù)的重點,只運(yùn)行一次
atrm:刪除等待任務(wù)
啟動計劃任務(wù)后,如果不想啟動設(shè)定好的計劃任務(wù)可以使用 atrm 命令刪除。
格式:atrm 任務(wù)號
命令后面跟計劃任務(wù)編號,如果不跟,就會刪除這個用戶所有的計劃任務(wù)。
例 3
atrm 10 //刪除計劃任務(wù) 10
atq //查看計劃任務(wù)是否刪除
at 將要運(yùn)行的命令以文本形式寫入/var/spool/at/目錄內(nèi),等待 atd 服務(wù)的取用和執(zhí)行。
還可以進(jìn)入到/var/spool/at 目錄里把計劃任務(wù)刪除,計劃任務(wù)的文件都保存在該目錄里,可以用 rm -f
文件名來刪除(以文件的形式刪除計劃任務(wù),因為計劃任務(wù)是以文件形式保存在該目錄中)
例 4:
#cd /var/spool/at //進(jìn)入到/var/spool/at 目錄中
ls //顯示目錄中所有文件
rm -f a0000b0138b19c //刪除計劃任務(wù)
在通常情況下,超級用戶都可以使用這個命令。對于其他用戶來說,能否可以使用就取決于兩個文
件:/etc/at.allow 和/etc/at.deny。
at 命令是可以基于用戶來控制的,我們可以明確指定哪些用戶可以使用 at 計劃任務(wù),哪些用戶不可以使用 at 計劃任務(wù)。
at 的控制文件
/etc/at.allow
/etc/at.deny
系統(tǒng)默認(rèn)是有 at.deny 文件,如果某個用戶名在這個文件里,他就不能使用 at 計劃任務(wù)。如果有
at.allow 文件,allow 文件先行,檢查了 allow 明確允許,就不會檢查 deny。
如果你要讓哪個用戶不能使用計劃任務(wù),就直接把他的用戶名寫進(jìn)去就可以了,一排只能寫一個。 2 、 cron 服務(wù) ( 參考網(wǎng)址: http://www.linuxsir.org/main/?q=node/209)
相對與 at,cron 的優(yōu)點就是能夠周期性的執(zhí)行某個命令,at 卻只能執(zhí)行一次,cron 的后臺進(jìn)程名字
是 crond ,cron 也是 system V 的服務(wù),所以我們可以 service crond start|stop 來啟動和關(guān)閉此服
務(wù),也可以使用 chkconfig 或者 ntsysv 來選擇 cron 服務(wù)的默認(rèn)開啟,這些命令在以前我們都講過的
命令:
#crontab -e 編輯當(dāng)前用戶的 cron 表
#crontab -l 查看當(dāng)前用戶的 cron 表
#crontab -r 刪除當(dāng)前用戶的 cron 進(jìn)程
#crontab -u 用戶名 以某用戶的身份來控制 cron 表
還有個重要的知識點,就是當(dāng)用戶的計劃任務(wù)建立后是存放在 var/spool/cron 這個目錄
當(dāng)使用 crontab -e 編輯當(dāng)前用戶的 cron 表后,會出現(xiàn)一個 vi 文件,cron 的格式是這樣的。分成兩
列,左邊是時間,右邊是運(yùn)行的命令。時間是由 5 個部分組成。
例:
* * * * * wall hello everyone
5 個星號分別代表:minute hour day-of-month month-of-year day-of-week ,而 wall hello
everyone 這是命令內(nèi)容。上面的意識是每分每小時每天每月每周廣播 hello everyone。具體時間大家可以自己定義。如果要每兩分鐘發(fā)送就用*/2 代替第一個*。也可以是用具體時間來表示。
我們使用 crontab -e 編輯當(dāng)前用戶的 cron 表
這里的 5 個星號就代表的時間和日期:
第一個*星號代表個小時的第幾分鐘:minute 范圍是從 0-59
第二個*星號代表每天的第幾個小時:hour 范圍是從 0-23
第三個*星號代表每月的第幾個日:day-of-month 范圍從 1-31
第四個*星號代表沒年的第幾個月:month-of-year 范圍從 1-12
第五個*星號代表每周的星期幾:day-of-week 范圍從 0-6,其中 0 表示星期日
用戶名:也就是執(zhí)行程序要通過哪個用戶來執(zhí)行,這個一般可以省略;
命令:執(zhí)行的命令和參數(shù)。
時程表的格式如下 :
f1 f2 f3 f4 f5 program
其中 f1 是表示分鐘,f2 表示小時,f3 表示一個月份中的第幾日,f4 表示月份,f5 表示一個星期
中的第幾天。program 表 示要執(zhí)行的程序。
當(dāng) f1 為 * 時表示每分鐘都要執(zhí)行 program,f2 為 * 時表示每小時都要執(zhí)行程序,其余以此類推
當(dāng) f1 為 a-b 時表示從第 a 分鐘到第 b 分鐘這段時間內(nèi)要執(zhí)行,f2 為 a-b 時表示從第 a 到第 b小時都要執(zhí)行,其余以此類推
當(dāng) f1 為 */n 時表示每 n 分鐘個時間間隔執(zhí)行一次,f2 為 */n 表示每 n 小時個時間間隔執(zhí)行一次,其余以此類推
當(dāng) f1 為 a, b, c,... 時表示第 a, b, c,... 分鐘要執(zhí)行,f2 為 a, b, c,... 時表示第 a, b, c... 個小時要執(zhí)行,其余以此類推
使用者也可以將所有的設(shè)定先存放在檔案 file 中,用 crontab file 的方式來設(shè)定時程表。
例 1:如果我要表示 9 月 10 日 25 分執(zhí)行 ls var/spool/cron 任務(wù)怎么表示?
25 * 10 9 * ls var/spool/cron
由于我沒表示小時,所以就只能里面為每小時
例 2:我要在每周日,每分鐘執(zhí)行 wall Hello redking.blog.51cto.com 這個命令,時間怎么表示?
*/1 * * * 0 wall Hello redking.blog.51cto.com
*/ 表示每多少分鐘執(zhí)行一次 例 3:每晚的 21:30 重啟 apache。
30 21 * * * /usr/local/etc/rc.d/lighttpd restart
例 4:每月 1、10、22 日的 4 : 45 重啟 apache
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
例 5:每周六、周日的 1 : 10 重啟 apache
10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
例 6:在每天 18 : 00 至 23 : 00 之間每隔 30 分鐘重啟 apache
0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
例 7:每一小時重啟 apache
* */1 * * * /usr/local/etc/rc.d/lighttpd restart
例 8:晚上 11 點到早上 7 點之間,每隔一小時重啟 apache
* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
例 9:每月的 4 號與每周一到周三的 11 點重啟 apache
0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
例 10:一月一號的 4 點重啟 apache
0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
例 11:在 12 月內(nèi), 每天的早上 6 點到 12 點中,每隔 3 個小時執(zhí)行一次 /usr/bin/backup
0 6-12/3 * 12 * /usr/bin/backup
例 12:每月每天的午夜 0 點 20 分, 2 點 20 分, 4 點 20 分....執(zhí)行 echo "haha"
20 0-23/2 * * * echo "haha"
3 、系統(tǒng)級別的計劃任務(wù)及其擴(kuò)展 anacrontab
這個是系統(tǒng)設(shè)置好了,清理系統(tǒng)垃圾或者是自動執(zhí)行某些腳本的系統(tǒng)任務(wù),一般我們做了解就行了, 不要更改配置文件是/etc/conrtab

SHELL:就是運(yùn)行計劃任務(wù)的解釋器,默認(rèn)是 bash
PATH:執(zhí)行命令的環(huán)境變量
MAILTO:計劃任務(wù)的出發(fā)者用戶
HOME:家目錄為/
run-parts 是一個腳本,在/usr/bin/run-parts,作用是執(zhí)行一個目錄下的所有腳本/程序。
run-parts /etc/cron.hourly 執(zhí)行目錄/etc/cron.hourly/之下的所有腳本/程序.
run-parts 下面就是運(yùn)行的命令
vim /etc/crontab 與 crontab -e 寫入的定時運(yùn)行的區(qū)別?
vim /etc/crontab:是系統(tǒng)級別定義的 crontab,/etc/crontab 的所有者和組都是 root
crontab -e :是用戶自定義的 crontab,是所有的用戶都可以寫入的 兩種方法記錄的位置不一樣,一個在/etc/ 另一個在/var/ 里面。都被 cron 服務(wù)調(diào)用
如果系統(tǒng)在以上說的時間沒有開機(jī)怎么辦?那么這個腳本不就是不能執(zhí)行了?設(shè)計者早就想到了這個問題,所以就有了 cron 服務(wù)的擴(kuò)展,目的就是為了防止非 24 小時開機(jī)的計算機(jī)遺漏的守護(hù)任務(wù),anacr
ontab 就是系統(tǒng)計劃任務(wù)的擴(kuò)展文件:在一個指定時間間隔錯過后自動執(zhí)行任務(wù)
格式是這樣的:
period delay job-identifier command
period — 命令執(zhí)行的頻率(天數(shù))
delay — 延遲時間(分鐘)
job-identifier — 任務(wù)的描述,用在 anacron 的消息中,并作為作業(yè)時間戳文件的名稱,只能包括
非空白的字符(除斜線外)。
command — 要執(zhí)行的命令

第一行的意思是:每天開機(jī) 65 分鐘后就檢查 cron.daily 文件是否被執(zhí)行了,如果今天沒有被執(zhí)行就執(zhí)行他
第二行的意思是:每隔 7 天開機(jī)后 70 分鐘檢查 cron.weekly 文件是否被執(zhí)行了,如果一周內(nèi)沒有被執(zhí)行就執(zhí)行他
第三行的意思也差不多
下面說說關(guān)于 cron 服務(wù)的控制,和 at 差不多,就是/etc/cron.deny 這個配置文件來控制,里面寫入要禁止使用 cron 用戶的名字,一行一個就 OK 了