十六、
計划任務
在很多時候為了自動化管理系統,都會用到計划任務,比如關機,管理,備份之類的操作,
都可以使用計划任務來完成,這樣可以是管理員的工作量大大降低,而且可靠度更好。
linux 系統支持一些能夠自動執行任務的服務,稱為計划任務。
LINUX 有如下三種計划任務:
- at:指定一個時間執行一個任務 (適用一個或多個任務,執行一次后就不用)
- cron:根據一個時間表自動執行任務 (使用一個或多個任務,周期性執行)
- 系統級別的計划任務及其擴展anacron:在一個指定時間間隔錯過后自動執行任務
at:
安排一個任務在未來執行,需要一個
atd
的系統后台進程
檢查
atd
進程是否啟動
service atd status # atd (pid 2274) 正在運行... chkconfig |grep atd # atd # 0:關閉 1:關閉 2:關閉 3:啟用 4:啟用 5:啟用 6:關閉 # 如果未啟動,可以使用如下命令: service atd start # 正在啟動 atd: [確定] chkconfig atd on
常用指令
at:安排延時任務
具體使用方法:
例 1:
at now+2 minutes 回車 # >輸入要執行的命令>ctrl+d 結束輸入 at now+2 minutes at> wall Aixi at> <EOT> # job 2 at 2010-06-18 16:36 # <EOT>是 ctrl+d 中斷輸入,這個命令意思是發送一個廣播內容是 Hello Aixi.具體時間可以改,單位可以改,可以用 hours,months,years,weeks 等.
例 2 跟具體時間
at 16:39 dec 10 at> Hello Aixi at> <EOT> ctrl+d 結束輸入 # job 3 at 2010-12-10 16:39 # 意思是在今年的 12 月 10 日 16:39 運行這個命令.如果不加月和日,默認就是今天.
Atq——查詢當前的等待任務用 atq 來查詢,已經運行的任務,就消失了。這就是 at 計划任務的重點,只運行一次
atrm——刪除等待任務,啟動計划任務后,如果不想啟動設定好的計划任務可以使用 atrm 命令刪除。格式:atrm 任務號(命令后面跟計划任務編號,如果不跟,就會刪除這個用戶所有的計划任務。)
例 3
atrm 10 # 刪除計划任務 10 atq # 查看計划任務是否刪除
at 將要運行的命令以文本形式寫入/var/spool/at/目錄內,等待 atd 服務的取用和執行。
還可以進入到/var/spool/at 目錄里把計划任務刪除,計划任務的文件都保存在該目錄里,可以用 rm -f
文件名來刪除(以文件的形式刪除計划任務,因為計划任務是以文件形式保存在該目錄中)
cron服務
(
參考網址:
http://www.linuxsir.org/main/?q=node/209)
相對與 at,cron 的優點就是能夠周期性的執行某個命令,at 卻只能執行一次,cron 的后台進程名字
是 crond ,cron 也是 system V 的服務,所以我們可以 service crond start|stop 來啟動和關閉此服
務,也可以使用 chkconfig 或者 ntsysv 來選擇 cron 服務的默認開啟。
命令:
crontab -e # 編輯當前用戶的 cron 表 crontab -l # 查看當前用戶的 cron 表 crontab -r # 刪除當前用戶的 cron 進程 crontab -u # 用戶名 以某用戶的身份來控制 cron 表
還有個重要的知識點,當用戶的計划任務建立后是存放在 var/spool/cron 這個目錄
當使用 crontab -e 編輯當前用戶的 cron 表后,會出現一個 vi 文件,cron 的格式是這樣的。分成兩
列,左邊是時間,右邊是運行的命令。時間是由 5 個部分組成。
例:
# 每分每小時每天每月每周廣播 hello everyone * * * * * wall hello everyone # 5 個星號分別代表:minute hour day-of-month month-of-year day-of-week ,而 wall hello everyone 這是命令內容。如果要每兩分鍾發送就用*/2 代替第一個*。也可以是用具體時間來表示。 # 使用 crontab -e 編輯當前用戶的 cron 表 ''' 這里的 5 個星號就代表的時間和日期: 第一個*星號代表個小時的第幾分鍾:minute 范圍是從 0-59 第二個*星號代表每天的第幾個小時:hour 范圍是從 0-23 第三個*星號代表每月的第幾個日:day-of-month 范圍從 1-31 第四個*星號代表沒年的第幾個月:month-of-year 范圍從 1-12 第五個*星號代表每周的星期幾:day-of-week 范圍從 0-6,其中 0 表示星期日 用戶名:也就是執行程序要通過哪個用戶來執行,這個一般可以省略; '''
命令:執行的命令和參數。
時程表的格式如下 :
- f1 f2 f3 f4 f5 program
- f1 是表示分鍾,
- 為 * 時表示每分鍾都要執行 program,
- 為 a-b 時表示從第 a 分鍾到第 b 分鍾這段時間內要執行
- 為 */n 時表示每 n 分鍾個時間間隔執行一次
- 為 a, b, c,... 時表示第 a, b, c,... 分鍾要執行
- f2 表示小時,
- 為 * 時表示每小時都要執行程序,其余以此類推,
- 為 a-b 時表示從第 a 到第 b小時都要執行,其余以此類推
- 為 */n 表示每 n 小時個時間間隔執行一次,其余以此類推
- 為 a, b, c,... 時表示第 a, b, c...個小時要執行,其余以此類推
- f3 表示一個月份中的第幾日
- f4 表示月份
- f5 表示一個星期中的第幾天
- program 表 示要執行的程序。
使用者也可以將所有的設定先存放在檔案 file 中,用 crontab file 的方式來設定時程表。
例:
# 1. 9 月 10 日 25 分執行 ls var/spool/cron 任務 25 * 10 9 * ls var/spool/cron # 2. 每周日,每分鍾執行 wall Hello redking.blog.51cto.com 這個命令 */1 * * * 0 wall Hello redking.blog.51cto.com # */ 表示每多少分鍾執行一次 # 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 月內, 每天的早上 6 點到 12 點中,每隔 3 個小時執行一次 /usr/bin/backup 0 6-12/3 * 12 * /usr/bin/backup # 12. 每月每天的午夜 0 點 20 分, 2 點 20 分, 4 點 20 分....執行 echo "haha" 20 0-23/2 * * * echo "haha"
系統級別的計划任務及其擴展anacrontab
這個是系統設置好了,清理系統垃圾或者是自動執行某些腳本的系統任務,一般我們做了解就行了,
不要更改配置文件是/etc/conrtab
- SHELL:就是運行計划任務的解釋器,默認是 bash
- PATH:執行命令的環境變量
- MAILTO:計划任務的出發者用戶
- HOME:家目錄為/
- run-parts 是一個腳本,在/usr/bin/run-parts,作用是執行一個目錄下的所有腳本/程序。
- run-parts /etc/cron.hourly 執行目錄/etc/cron.hourly/之下的所有腳本/程序.
- run-parts 下面就是運行的命令
- vim /etc/crontab 與 crontab -e 寫入的定時運行的區別?
- vim /etc/crontab:是系統級別定義的 crontab,/etc/crontab 的所有者和組都是 root
- crontab -e :是用戶自定義的 crontab,是所有的用戶都可以寫入的 兩種方法記錄的位置不一樣,一個在/etc/ 另一個在/var/ 里面。都被 cron 服務調用
如果系統在以上說的時間沒有開機怎么辦?那么這個腳本不就是不能執行了?設計者早就想到了這個
問題,所以就有了 cron 服務的擴展,目的就是為了防止非 24 小時開機的計算機遺漏的守護任務,
anacr
ontab 就是系統計划任務的擴展文件:在一個指定時間間隔錯過后自動執行任務
格式是這樣的:
- period delay job-identifier command
- period — 命令執行的頻率(天數)
- delay — 延遲時間(分鍾)
- job-identifier — 任務的描述,用在 anacron 的消息中,並作為作業時間戳文件的名稱,只能包括非空白的字符(除斜線外)。
- command — 要執行的命令