linux計劃任務有兩類
- at:未來某個時間點僅執行一次任務就結束的指令,at指令執行時必須要有atd這個服務支持。
- crontab:可以以時間單位為分鐘,小時,每天,每周,每月,每年等循環執行某任務。
單一任務at介紹:
語法格式:at -[lfdcq] TIME
常用選項:
-l 查看作業隊列,相當于atq
-f 從某個指定文件文件中讀取作業任務,不通過交互式輸入。
-d 刪除指定的作業任務,相當于atrm。
-c 查看指定作業具體內容。
-q QUEUE指明隊列。
TIME時間格式有:
HH:MM 小時:分鐘 例如04:00
HH:MM YYYY-MM-DD 小時:分鐘 年-月-日 例如15:00 2017-11-25
HH:MM[am|pm] [Month] [Date] 例如:04pm July 30
HH:MM[am|pm] + number [minutes|hours|days|weeks]在某個時間點再加幾個時間后執行
例如:now + 5minutes 5分鐘后執行
04pm + days三天后下午4點執行
[root@dxlcentOS ~]# at 15:55 2017-11-25 在15點55分執行:切換到tmp目錄,執行ls命令
at> /usr/bin/cd /tmp
at> /usr/bin/ls
at> <EOT>
job 3 at Sat Nov 25 15:55:00 2017
注意:輸入結束后按ctrl+d,任務輸入結束at> <EOT>,執行結果屏幕不會顯示,會以郵件形式發送到郵箱。要是沒有mail命令,進行yum -y install mailx安裝。
batch命令:系統空閑時才進行的背景任務,他是通過at下達的。
周期性任務計劃cron
執行周期性任務要確保crond守護進程在運行。
執行pstree,要是crond運行起來可以看到。
或者執行:~]# systemctl status crond (centos7)
Active: active (running) … …
centos6:~]# service crond status
… is running
有時候為了安全起見,可以將不允許某些用戶執行周期性任務的用戶名添加到/etc/cron.deny文件里面即可。
cron任務分類:分系統cron任務和用戶cron任務
系統cron任務:主要用于維護系統自身。 可以手動編輯/etc/crontab文件實現。 系統cron任務格式 1 SHELL=/bin/bash 使用哪種shell接口 2 PATH=/sbin:/bin:/usr/sbin:/usr/bin 執行文件搜索路徑 3 MAILTO=root 以email將數據發給誰 4 5 # For details see man 4 crontabs 6 7 # Example of job definition: 8 # .---------------- minute (0 - 59) 9 # | .------------- hour (0 - 23) 10 # | | .---------- day of month (1 - 31) 11 # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... 12 # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat 13 # | | | | | 14 # * * * * * user-name command to be executed (1) 每一行定義一個周期性任務,共7個字段。 * * * * * : 定義周期性時間。 user-name : 運行任務的用戶身份。 command to be executed:要執行的任務。 (2) 此處的環境變量不同于用戶登錄后獲得的環境,因此,建議命令使用絕對路徑,或者自定義PATH環境變量; (3) 執行結果以郵件形式發送給MAILTO指定的用戶。
用戶cron任務: 當用戶使用crontab命令來建立周期任務后,這項工就會被記錄到/var/spool/cron/USERNAME這個文件中去, 他們以用戶名來區分。 crontab [-u username] [-l|-e|-r] -u 只要有root用戶才能進行這個任務,即為其他用戶建立或刪除crontab任務。 -l 列出所有任務。 -e 編輯任務。 -r 刪除所有crondtab任務,即刪除/var/spool/cron/USERNAME文件,若要刪除一項,可以用-e選項去編輯。 用戶周期性任務定義格式: * * * * * command to be executed 對應意義為:分 時 日 月 周 用戶指令 每行定義一個任務,共六個字段。任務執行后的結果以郵件發給用戶。
周期任務時間表示法: 分(0-59) 時(0-23) 日(1-31) 月(1-12) 周 (0-7 0和7都代表星期天) 星號* :表示任何時刻意思 逗號",":b表示時段分隔,指定多個時間點做某事,例如當我要下達的任務是在每天3:00月6:00時, 0 3,6 * * * COMMAND 時間參數還是5欄 減號“-”:表示一段時間范圍,例如我要在8點到12點之間的每小時20分進行一 項工作, 20 8-12 * * * COMMAND /n :n代表數字,即是每隔n個時間單位意思,例如每5分鐘進行一次。 */5 * * * * COMMAND 常見實例: 示例: (1) 3 * * * *:每小時執行一次;每小時的第3分鐘; (2) 3 4 * * 5:每周執行一次;每周5的4點3分; (3) 5 6 7 * *:每月執行一次;每月的7號的6點5分; (4) 7 8 9 10 *:每年執行一次;每年的10月9號8點7分; (5) 9 8 * * 3,7:每周三和周日8點09分; (6) 0 8,20 * * 3,7:每周三和周日8點和20 (7) 0 9-18 * * 1-5:每周一到周五9點到18點 (8) */5 * * * *:每5分鐘執行一次某任務;
應用實例: 1.每4小時執行一次對/etc目錄的備份,備份至/backup目錄中,保存的目錄名為形如etc-201504020202 [centos@dxlcentOS ~]$ crontab -e 進入編輯界面 0 */4 * * * /usr/bin/cp -a /etc /backup/etc-$(date +\%Y\%m\%d\%H\%M) 2.每周2,4,6備份/var/log/messages文件至 /backup/messages_logs/目錄中,保存的文件名形如messages-20150402 [centos@dxlcentOS ~]$ crontab -e 0 0 * * 2,4,6 /usr/bin/cp -a /var/log/messages /backup/messages-$(date +\%Y\%m\%d) 3.每天每兩小時取當前系統/proc/meminfo文件中的所有以S開頭的信息至/stats/memory.txt文件中 [centos@dxlcentOS ~]$ crontab -e 0 */2 * * * /usr/bin/cat /proc/meminfo | grep "^S" >> /stats/memory.txt 4.工作日的工作時間內,每兩小時執行一次echo ”howdy” [centos@dxlcentOS ~]$ crontab -e 0 9-18/2 * * 1-5 /usr/bin/echo “howdy”
總結:1.cron周期任務最小時間單位是分鐘。
2.定義COMMAND時,如果命令需要用到%,需要對其轉義;但放置于單引號中的%不用轉義亦可。
3.某任務在指定的時間因關機未能執行,下次開機不會自動執行。
4.當修改之前定好的任務或新增循環任務時最好執行一下systemctl restart crond。
5.如果是系統管理使用的循環任務最好寫入/etc/crontab。
6.避免系統資源分配不均,周與日月不可以同時并存。
7.為了避免計劃任務不執行,計劃任務中的命令最好使用絕對路徑。
anacron可換醒停機期間的工作任務
cron循環任務設定后,要是服務器因意外關機,那么在停機期間,cron設定的循環任務是不會運行的,當服務器開機后,也不會執行過去到達時間點的循環任務,只能等待下個時間點到來才執行。要想重新執行,anacron就可以解決這個問題。
anacron 是一個程序不是一個服務,當centos進入crontab排程時,anacron 會主動每一小時運行一次。
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/88965
你的計劃任務都執行過嗎,我覺得你應該是沒有執行過,所有應用實例可能都有問題。注意全路徑。
@馬哥教育:在centos7.2 有執行過,為了保證計劃的執行,命令最好使用絕對路徑。已經記住了。