Linux任務計劃主要分爲分爲兩種分別是一次性任務計劃和週期性任務計劃實現工具主要是at和crontab下面將詳細介紹任務計劃工具的使用。
1、at命令一次性任務計劃
at命令是由atd服務提供的其主程序包是atd在CentOS6上可以使用service atd start命令來啓動在CentOS7上需要使用systemctl start atd.service來啓動服務。
at命令常用方法
at TIME:最簡單的使用方法是at跟上時間以交互式的方法創建任務計劃最後以Ctrl+d結束。
at -f FILE TIME:從指定文件中讀取作業任務而不用再交互式輸入
at -l:相當與atq列出系統上的所有當前用戶的at隊列
at -d job:相當於atrm可以刪除一個指定的作業
at -c job:查看具體作業任務
at創建的任務都放在/var/spool/at目錄下並且at作業任務的執行結果中如果有標準輸出和錯誤輸出則都是以郵件的形式通知給相關用戶。
TIME的時間格式有:
HH:MM:當天時間的幾點幾分執行任務如果該時間已過則明天此時執行任務還可以使用下面定義好的時間格式
noon:中午12點
midnight:凌晨即零點
teatime:下午茶時間具體爲下午4點
HH:MM yyyy-mm-dd:某年某月某日的幾點幾分執行任務
HH:MM[am|pm] [Month] [Date]:同上也是指定具體某天的某時刻執行如04pm March 17
HH:MM tomorrow:明天的幾點幾分執行
now + # (minutes,hours,days,weeks):從現在時間起再加#分鐘或#小時或#天或#周後執行
默認情況下所有用戶都可以使用at命令創建一次性計劃任務如果管理員需要控制具體那些用戶可以使用at創建計劃任務則可以通過黑名單拒絕或白名單允許的方式控制並且默認情況下系統自帶有黑名單文件/etc/at.deny在其中填寫不允許使用at命令的用戶名單即可同理也可以手動創建白名單/etc/at.allow在其中填寫允許用戶的名單即可若黑名單和白名單同時存在則黑名單不生效只有白名單中的用戶可以使用at命令創建任務。
2、batch命令一次性任務計劃
batch創建的也是一次性任務計劃和at的用法幾乎一致但batch不需要指定時間batch會讓系統自行選擇空閒的時間去執行指定的任務。
3、crontab命令週期性任務計劃
crontab命令需要crond守護進程提供服務其主程序包是cronie。通過crontab命令向crond提交計劃任務與at不同它需要使用專用的配置文件且此文件具有固定格式。
cron任務分爲兩類一類是系統cron任務主要用於實現系統自身的維護而創建的週期性任務一般情況下系統任務是不需要手動添加的在安裝系統時會自動創建如果需要新增系統任務的話可以手動編輯/etc/crontab文件。一類是用戶cron任務根據用戶需求自定義的週期性任務其創建方式可以使用crontab命令創建crontab命令創建任務時會自動檢測語法錯誤且創建的任務配置文件會以用戶名的方式自動保存在/var/spool/cron/目錄下。
系統cron任務的格式爲
# .---------------- 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
共7個字段前5個字段表示時間第6個字段表示以某用戶身份運行第7個字段表示具體命令任務每一行表示一個週期性任務。
用戶cron任務的格式與系統cron任務格式基本一致但用戶cron任務不需要再指定以哪個用戶身份運行了直接跟具體命令任務即可所以用戶cron任務一共有6個字段。
cron任務的時間表示法
1)、特定值給定時間點有效值範圍內的值
2)、星號*表示特定時間點上有效值範圍內的所有值表示“每...”
如:每年10月1號的中午12點表示爲:0 12 1 10 *
每天的晚上18點表示爲:0 18 * * *
每週一的早上點表示爲:0 8 * * 1
3)、離散取值
如:每天的早上點和晚上18點表示爲:0 8,18 * * *
每月的1號和15號表示爲:0 0 1,15 * *
每週的週一和週五表示爲:0 0 * * 1,5
4)、連續取值
如:每天的8點到18點表示爲:0 8-18 * * *
每月的1號到15號表示爲:0 0 1-15 * *
每週的週一到週五表示爲:0 0 * * 1-5
5)、在指定時間範圍上定義步長
如:每3分鐘表示爲:*/3 * * * *
每隔3天表示爲:0 0 *3 * *
6)、系統定義好的時間
@reboot :每次重啓後執行一次
@yearly和annually : 都表示爲每年的1月1號:0 0 1 1 *
@monthly : 每月的1號 :0 0 1 * *
@weekly : 每週的週日 :0 0 * * 0
@daily :每天的凌晨:0 0 * * *
@hourly :每小時的整點:0 * * * *
crontab命令的常見用法有:
創建用戶週期性任務命令爲:crontab -e
列出所有用戶週期性任務命令爲:crontab -l
刪除所有用戶週期性任務命令爲:crontab -r
root用戶爲指定用戶創建或管理cron任務:crontab -u USER
cron任務也可以通過黑名單和白名單的方式控制用戶使用crontab命令創建任務的權限默認情況下系統自帶有黑名單/etc/cron.deny也可以手動創建白名單/etc/cron.allow當白名單和黑名單都存在時黑名單失效只有白名單中的用戶可以使用crontab命令創建任務。
需要注意:
1)建議定義cron任務時所用到命令使用絕對路徑或自定義一個擁有完整路徑的環境變量。
2)cron任務的運行結果的標準輸出和錯誤都是以郵件的形式通知給相關用戶如果不想以郵件的形式通知用戶則可以使用重定向的方式輸出給/dev/nullCOMMAND &> /dev/null。
3)對於cron任務來講%有特殊用途如果在命令中要使用%則需要轉義不過如果將%放置與單引號中也可以不用轉義。
練習:
1、每週2, 4, 7備份/var/log/messages文件至/logs目錄中文件名形如“messages-yyyymmdd”
#先創建/logs目錄 ]# mkdir /logs #使用crontab -e創建任務 ]# crontab -e 0 0 * * 2,4,7 /bin/cp /var/log/messages /logs/messages-$(date +\%Y\%m\%d) &> /dev/null
2、每兩小時取出當前系統/proc/meminfo文件中以S或M開頭的信息追加至/tmp/meminfo.txt文件中
]# crontab -e 0 */2 * * * /bin/grep "^[SM]" /proc/meminfo >> /tem/meminfo.txt