linux計劃任務
功能:指定未來的某以特定的時間點執行一次任務
命令:at、bathc
at命令:
選項:
-V:顯示版本信息
-l:列出指定隊列中等待運行的作業;相當于atq
-d +作業編號:刪除指定的作業;相當于atrm
-c:+作業編號:查看指定的作業任務
-f:/path/from/somefile:從指定的文件中讀取任務
at now + 3 minutes -f /testdir/qipan.sh
-m:當任務完成后,給用戶發送郵件,即使沒有標準輸出
注意:作業執行的結果中的標準輸出和錯誤以郵件通知給相關用戶,例如echo命令執行結果不會再屏幕顯示
Time:定義出什么時候進行at這項任務的時間
HH:MM [yyyy-mm-dd]
noon(12),midnight(0),teatime(16),tomorrow,now+#{minutes,hours,days,OR weeks}
例如: 04pm March 17
04:00 2016-09-20
17:20 tomorrow
now + 5 minutes
04pm + 3 days
root@cenots6.8 ~ # at 9:00 2016-10-10 at> wall Are you OK? at> <EOT> ##########ctrl + d 退出 job 6 at 2016-10-10 09:00
root@cenots6.8 ~ # at 11:00 <<EOF > what? > where? > EOF #####此處輸入結束符EOF即可 job 10 at 2016-09-10 11:00
權限:普通用戶也可以執行at計劃任務權限,也可以把用戶放到/etc/at.deny這個黑名單中,直接在名單中寫用戶名即可,在該名單的用戶則在at計劃任務時,提示沒有權限,當然也有白名單/etc/at.allow(默認不存在,需要手動創建),當白名單存在時,則白名單的優先級高于黑名單,且只有添加到白名單的用戶才具有at命令,即使你不在黑名單里,如果兩個文件都不存在則只有root有at權限。
注意:在使用該命令之前要確定atd服務是否啟動,service atd status,也可通過chkconfig –list atq 查看特定運行級別下是否開機啟動。
linux周期性任務
周期性計劃任務:cron
相關的程序包:
cronie:主程序包,提供crond守護進程及相關輔助工具
cronie-anacron:cronie的補充程序,用戶監控cronie任務執行狀況,如cronie中的任務在過去該運行的時間點未能正常運行,則anacron會隨后啟動一次此任務。
crontabs:包含Cenots提供系統維護任務
確保crond守護處于運行狀態:
centos 7 systemctl status crond
centos 6 service crond status
計劃周期性執行的任務提交給crond,到指定的時間會自動運行
系統cron任務,系統維護作業
/etc/crontab
系統cron任務:/etc/crontab 注釋行以 # 開頭 詳情參見 man 5 crontab # 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 10 21 * * * centos /bin/echo "Howdy!" 晚上9點10分運行echo命令; 應用舉例: 3 * * * *:每小時的第三分鐘 3 4 * * 5:每周五的4點三分 5 6 7 * *:每月的7號6點5分 7 8 9 10 *:每年的10月9號8點7分 9 8 * * 3,7:每周三和周日 * 8,20 * * 3,7 每周三周日的早八點晚八點的每分鐘執行一次任務 08,20 * * 3,7 每周三周日的早八點晚八點的每分鐘執行一次任務 09-18 * * 1-8 工作時間內的每小時 */5 * * * * 每5分鐘執行一次
時間表示法:
(1) 特定值;
給定時間點有效取值范圍內的值
(2) *
給定時間點上有效取值范圍內的所有值表示“每…”
(3) 離散取值:
#,#,#
(4) 連續取值: –
#-#
(5) 在指定時間范圍上,定義步長:
/#: #即為步長 每。。。
0 */3 * * * centos /bin/echo "howdy!" 每3小時echo命令;
時間格式:
@reboot Run once after reboot.
@yearly 0 0 1 1 *
@annually 0 0 1 1 *
@monthly 0 0 1 * *
@weekly 0 0 * * 0
@daily 0 0 * * *
@hourly 0 * * * *
計任務:
通過run-parts命令每隔固定的時間執行目錄中的腳本,因此如果我們有哪些腳本需要周期性執行的可放到指定的目錄
/etc/crontab
/etc/cron.d/ 配置文件
/etc/cron.hourly/ 腳本 每隔一小時執行目錄中的腳本
/etc/cron.daily/ 腳本
/etc/cron.weekly/ 腳本
/etc/cron.monthly/腳本
anacron系統:
功能:當我們計劃執行某一任務時,如果系統關機會導致計劃任務不能執行,因此,可以通過配置/etc/anacrontab來進行開機后多長時間之內,執行計劃任務。
配置文件: /etc/anacrontab,負責執行/etc/cron.daily /etc/cron.weekly /etc/cron.monthly中系統任務。 /etc/cron.hourly/由/cron.d/0hourly執行
? 字段1:如果在這些日子里沒有運行這些任務……
? 字段2:在重新引導后等待這么多分鐘后運行它
? 字段3:任務識別器,在日志文件中標識
? 字段4:要執行的任務
root@centos7.2 /etc/cron.daily # cat /etc/anacrontab # /etc/anacrontab: configuration file for anacron SHELL=/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # the maximal random delay added to the base delay of the jobs RANDOM_DELAY=45 ###最大延遲時間45min # the jobs will be started during the following hours only START_HOURS_RANGE=3-22 #period in days delay in minutes job-identifier command 1 5 cron.daily nice run-parts /etc/cron.daily 7 25 cron.weekly nice run-parts /etc/cron.weekly @monthly 45 cron.monthly nice run-parts /etc/cron.monthly
用戶cron任務:
crontab命令定義:每個用戶都有專業的cron任務文件;/var/spool/cron/USERNAME(crontab -e 后自動生成,里面存儲計劃任務的內容,且與系統計劃任務的區別是不用寫用戶名)
crontab命令:
crontab [-u user] [-l | -r | -e] [-i]
-l:列出所有任務
-e:編輯任務
-r:移除任務
-i:同-r一同使用,以交互式模式移除指定任務
-u user:僅root可運行,指定用戶
控制用戶執行計劃任務:/etc/cron.{allow,deny}等同于前面提到at權限問題。
日志:/var/log/cron
注意:運行結果的標準輸出和錯誤輸出會以郵件通知給相關用戶相關用戶,導致大量垃圾郵件占用磁盤空間,所以可采取如下措施:
1、command > /dev/null
2、command &> /dev/null
對于cron任務來講,%有特殊用戶,如果命令中要使用%,則需要轉義,不過,如果把%放置于單引號中,也可以不用轉義
例如:如何實現秒級別運行任務?
* * * * * for min in 0 1 2;do echo "hi";sleep 20;done 每隔20秒執行一次echo hi
如何實現每7分鐘運行一次任務?
sleep命令:
sleep #[suffix]
suffix:s,秒,默認
m,分,
h,小時
d,天
usleep:微妙 usleep 1000000:1s
練習:
1、每4小時備份一次/etc目錄至/backup目錄中,保存的文件名稱格式為“ etc-yyyy-mm-dd-HH.tar.xz”
0 4 * * * tar Jcf /backup/etc-`date +\%F-\%H`.tar.xz /etc/ &> /dev/null
2、每周2, 4, 7備份/var/log/messages文件至/logs目錄中,文件名形如“ messages-yyyymmdd”
* * * * 2,4,7 cp -a /var/log/messages /logs/messages-`date +\%Y\%m\%d`
3、每兩小時取出當前系統/proc/meminfo文件中以S或M開頭的信息追加至/tmp/meminfo.txt文件中
* */2 * * * grep "^[SM]" /proc/meminfo >> /tmp/meminfo.txt
4、工作日時間,每10分鐘執行一次磁盤空間檢查,一旦發現任何分區利用率高于80%,就執行wall警報
*/10 * * * * /root/bin/disk.sh #!/bin/bash DISK=`df|grep "^/dev/sd.*" | tr -s " "|cut -d" " -f5 | tr -d %|sort -n|tail -1` [ $DISK -gt 80 ] && wall "disk will be full"
原創文章,作者:Naruto,如若轉載,請注明出處:http://www.www58058.com/45082