計劃任務管理
一次性執行進程atd
at
一次性執行進程atd
/var/spool/at下
系統服務:必須啟動方可生效
etc/init.d.atd
格式:
at [HH:MM] [yyyy-mm-dd]
按Ctrl+d鍵提交計劃
例子:設置定時/延後執行的任務
#at 21:30 at>shutdown -r now //定於21:30重啟系統 at<EOT>
atq
查詢at任務
atrm
刪除at任務
atrm 2//刪除指定的計劃
周期性任務服務名crond
Crond是linux系統中用來定期執行命令或指定程序任務的服務。一般情況下,安裝完操作系統之後,默認便會啟動此任務調度服務。Crond服務會定期檢查系統中是否有要執行的任務工作,如果有,便會根據預先默認的規則自動執行該任務工作。
Linux任務調度的工作可以分為以下兩類:
1.系統自身執行的工作
系統周期行執行的任務工作,如輪詢系統日誌、備份系統數據數據、清理緩存等。
2.用戶執行的工作
某個用戶定期要做的任務工作:例如每隔10分鐘和互聯網上時間服務器進行時間同步,每天晚上0點備份站點數據,一般此類工作需要由每個用戶自行設置。
通過crontab,我們可以在固定的時間間隔執行指定的系統指令或shell腳本。時間間隔的單位可以是分鐘、小時、日、月、周及以上的任意組合。這個命令非常適合周期性的日誌分析或數據備份等工作。
使用者權限文件:
用戶計劃:
默認情況下,用戶所建立的crontab文件存於/var/spool/cron中,其crontab對應的文件名於用戶名一致
/var/spool/cron/用戶名
系統服務
/etc/init.d/crond
必須啟動方可生效
軟件包
vixie-cron crontabs
語法:
crontab
-l: 列出當前用戶的所有cron任務
-e: 編輯
-r: 移除所有任務
-u USERNAME: 管理其用戶的cron任務
anacron:
最多監控每天的任務
或者:
1、編輯cron計劃任務
-格式:crontab -e [-u 用戶名]
2、查看cron計劃任務
-格式:crontab -l [-u 用戶名]
3、刪除cron計劃任務
-格式:crontab -r [-u 用戶名]
默認的計劃任務
全局配置:/etc/crontab
系統計劃
/etc/cron.hourly/* /etc/cron.dialy/* /etc/cron.weekly/* /etc/cron.monthly/*
格式分為七段,前五段為時間設定段,第六段以那個用戶執行crontab(默認是當前用戶),第七段為所要執行的命令段。
系統cron任務:
/etc/crontab
分鐘 小時 天 月 周 用戶 任務
用戶cron任務:
/var/spool/cron/USERNAME
分鐘 小時 天 月 周 任務
格式:
分 時 日 月 周 命令
* 表示該範圍內的任意時間
, 表示間隔的多個不連續時間點
- 表示一個連續的時間範圍
/n 指定間隔的時間頻率,指定時間頻率,每n.
crontab記錄格式
執行周期、可執行語句
執行周期 設置說明
分鐘: 從0到59之間的整數
小時: 從0到23之間的整數
日期: 從1到31之間的整數
月份: 從1到12之間的整數
星期: 從0到7之間的整數,0或7代表星期日
時間的有效取值:
分鐘:0-59
小時:0-23
天:1-31
月:1-12
周:0-7,0和7都表示周日
執行周期示例
0 17 * * 1-5 周一到周五每天17:00
30 8 * * 1,3,5 每周一/三/五 的8點30分
0 8-18/2 * * * 8點到18點之間的每2小時
0 * */3 * * 每3天
crontab依賴的服務
[root@localhost ~]# chkconfig --list |grep crond crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off [root@localhost ~]# /etc/init.d/crond status crond (pid 2062) is running... [root@localhost ~]# /etc/init.d/crond restart Stopping crond: [ OK ] Starting crond: [ OK ]
cron的環境變量
cron執行所有命令都去PATH環境變量指定的路徑下去找
PATH /bin:/sbin:/usr/bin:/usr/sbin
crontab命令生產環境專業寫法
例1:每分鐘打印一次自己的名字到/server/log/自己的名字命名的文件中。
#print char task by zgy for rogrammer A at 2010-12-12 */1 * * * * echo "test" >>/server/log/zgy.log 2>&1
寫定時任務的註意事項:
1.寫定時任務要寫請註釋是個好習慣 2.執行任務時可以省略用戶,在執行腳本時,盡量帶上/bin/bash,否則有可能因為腳本沒有執行權限而無法執行 3.需要root權限執行的任務可以登錄到root用戶下,如果不需要root權限,可以登陸到普通用戶下設置。
這裏要特別註意不同用戶的環境變量問題,如果是調用了環境變量(如生產場景java腳本),此時,最好在腳本中將環境變量重新export下。 4.定時任務命令的結尾最好>/dev/null 2&>1等內容,如果需要打出日誌,可以追加到指定的日誌裏,不推薦留空這種不專業的做法
5.在開發定時任務程序或腳本時,在調試好腳本程序後,應盡量把DEBUG及屏幕輸出的內容的內容去掉,如果還需要,可定向到日誌裏。
說明:
其中,/dev/null為特殊的設備,表示黑洞設備或空設備。2>&1 使標準錯誤和標準輸出一樣,本命令內容即把腳本的輸出重定向到/dev/null,即不記錄任何輸出,也不給系統發郵件。 如果定時任務不加>/dev/null 2>&1等命令配置,時間長了,可能由於系統未開啟郵件服務而導致郵件臨時目錄/var/spool/clientmqueue文件數猛增,
占用大量磁盤inode節點。提示:上面的寫法也可寫成1>/dev/null 2>&1。
crontab 生產解決案例
案例1:No space left on device故障1
在設置crontab時提示No Space left on device,用df -k檢查還有空間,用df -i顯示/var/已占用100%,如果inode耗盡,則系統上將不能創建文件。
在/var/spool/clientmqueue/下有超多的文件ls半天沒反應,用rm -rf *會自動跳出root,然後xargs來配合解決。
cd /var/spool/clientmqueue && ls | xargs rm -f 最後清理了該目錄中的內容。當然,如果文件數超多,執行ls | xargs rm -f 也會長時間無反應,此時,
也可以直接
cd /var/spool && rm -fr clientmqueue,
然後
mkdir clientmqueue && chmod 770 clientmqueue && chown smmsp smmsp -R /var/spool/clientmqueue。
系統中/var/spool/clientmqueue目錄權限為:
[root@localhost ~]# ls -ld /var/spool/clientmqueue/ drwxrwx--- 2 smmsp smmsp 4096 May 5 19:44 /var/spool/clientmqueue/
原因分析
系統中cron執行的程序有輸出內容,輸出內容會以郵件形式發給cron的用戶,而sendmail沒有啟動所以就產生了這些文件。 解決方法:開啟郵件服務,並把crontab裏面的命令後面加上>/dev/null 2>&1,在做定時執行腳本時,把屏幕輸出定向到日誌中。
計劃任務授權
at任務控制
/etc/at.allow、/etc/at.deny
crond任務控制
/etc/cron.allow、/etc/cron.deny
註意:
如果allow文件存在,則僅允許指定的用戶
否則檢查deny文件,除指定用戶外其余都允許
如果兩個文件都不存在,則只允許root使用
cron計劃中斷與補救
anacron
cron的補充,能夠實現讓cron因為各種原因在過去的時間該執行而未執行的任務在恢復正常執行一次;
anacron也要隨時在線執行(在經常關機的系統上開啟)
計劃任務管理