本節索引:
一、同步服務器時間
二、執行一次性計劃任務—— ? at
三、執行周期性計劃任務—— crond
在生活、生產環境中,我們可能遇到這樣的場景,想在某個時刻,或者固定某個時間周期的在Linux系統中
執行某項任務,例如,定時關機,定期自動清理垃圾文件等,at,crontab等命令就是幫你實現這樣功能
的。
一、同步服務器時間
在進行計劃任務之前,一定要確保服務器的時間是準確無誤的,否則將造成計劃任務失敗或者無法達到
預期效果,尤其是在大規模的集群環境中,更顯得尤為重要,所以我們首先要學會的就是同步服務器時
間。
CentOS6:
ntpdata 172.x.x.x ? ? ? ? ? ? ? ? ? ? ? ? ? ?將時間與服務器同步
vim /etc/ntp.conf ? ? ? ? ? ? ? ? ? ? ? ? ? 修改此文件
server 172.x.x.x iburst ? ? ? ? ? ? ? ? ?加上此行
chkconfig ntpd on ? ? ? ? ? ? ? ? ? ? ? ? ? 下次啟動自動打開ntpd服務
service ntpd start ? ? ? ? ? ? ? ? ? ? ? ? ? 打開ntpd服務
service ntpd status ? ? ? ? ? ? ? ? ? ? ? ?檢查ntpd服務狀態
CentOS7:
ntpdata 172.x.x.x ? ? ? ? ? ? ? ? ? ? ? ? ? ?將時間與服務器時間同步
vim /etc/chrony.conf ? ? ? ? ? ? ? ? ? ? 修改此文件
server 172.x.x.x iburst ? ? ? ? ? ? ? ? ? 加上此行
systemctl enable chronyd ? ? ? ? ? ? ?下次啟動自動打開chronyd服務
systemctl start chronyd ? ? ? ? ? ? ? ? 打開chronyd服務
systemctl status chronyd ? ? ? ? ? ? ? 檢查chronyd服務狀態
至此,服務器時間同步就算是完成了!
二、執行一次性計劃任務——at
Linux任務計劃、周期性任務執行
未來的某時間點執行一次任務
?? at
batch:系統自行選擇空閑時間去執行此處指定的任務
周期性運行某任務
?? cron
使用at命令前,先確認at服務是否處于運行狀態
Centos6:
確認當前運行級別處于on狀態
run level
chkconfig –list atd
如果服務未開啟,請開啟atd服務
service atd start??????????????
centos7:
確認處于active(running)狀態
systemctl status atd
如果服務未開啟,請開啟atd服務
systemctl start atd
at
格式:at [options] TIME?? 最后Ctrl+d結束輸出
options:
-l????? 顯示所有計劃任務列表,同atq命令
-d #? 刪除第#個計劃任務,同atrm命令
-c #? 查看具體作用任務
-m??? 強制發郵件
-f /path/from/somefile? 草叢指定文件中讀取任務
TIME:
HH:MM [YYYY-mm-dd]
noon,midnight,teatime (4pm)
tomorrow
now+#{minute,hours,days,weeks}
HH:MM? 02:00
? 在今日HH:MM進行,若該時刻已過,則明天此時執行任務
HH:MM YYYY-mm-dd
? 規定在某年某月某一天的某時刻執行任務
HH:MM[am|pm][month][date]
04pm March 17
17:20 tomorrow
HH:MM[am|pm]+number[minutes|hours|days|weeks]
在某個時間點再加幾個時間后才執行任務
now + 5minutes
02pm + 3days
注意:計劃任務中的標準輸出不顯示在終端,將會以郵件方式發送至郵箱,所以執行計劃任務最好
將標準輸出全部重定向到/dev/null,否則會產生大量垃圾郵件
at執行方式:
方法1:交互式
例:at
at 15:00? 創建一個15:00的計劃任務
poweroff????????????????? 輸入計劃命令
Ctrl+d?????????????? 結束輸出
方法2:輸入重定向
例:at 18:00 << EOF
shutdown
EOF
方法3:at -f 文件
例:echo “hello” > /data/f1
at 19:00 -f /data/f1
at任務隊列存放在/var/spool/at目錄中,任務執行后消失。
at任務的黑名單(deny)、白名單(allow)文件:
系統默認只有黑名單文件/etc/at.deny,沒有白名單文件/etc/at.allow
/etc/at.deny??? 黑名單文件,放入文件中的用戶將不能執行at任務計劃
/etc/at.allow? 白名單文件,當白名單文件存在時,只有白名單中的用戶才能使用at。
白名單文件需手動創建,優先級高于黑名單
如果黑、白名單文件包含同一用戶,將優先看白名單,可以使用at計劃任務
如果黑、白名單文件都刪除,將只有root賬號可以使用at計劃任務。
三、執行周期性的計劃任務——crond
使用crond周期任務計劃前,先確認crond服務是否處于運行狀態
Centos6:
確認處于active(running)狀態
service crond status?????????
如果服務未開啟,請開啟crond服務
service crond start????????
centos7:
確認處于active(running)狀態
systemctl status crond
如果服務未開啟,請開啟crond服務
systemctl start crond?????
相關文件:
/etc/crontab ???????? 系統周期性任務計劃文件(root only)
/var/spool/cron/?? ????? 給用戶創建周期計劃的目錄
/etc/cron.d/ ????????? 給存儲系統創建周期計劃的目錄
/var/log/cron????????? 日志文件,可利用日志中的信息恢復誤操作內容
注意:
(1)在/etc/crontab和/etc/cron.d/的文件中剛創建周期計劃任務時,需要比普通用戶周期計劃目
錄的格式多添加一個用戶名,位于時間和命令之間。
(2)周期計劃任務中的標準輸出不顯示在終端,將會以郵件方式發送至郵箱,所以執行計劃任務建議
將標準輸出全部重定向到/dev/null,否則會產生大量垃圾郵件
crontab
格式:
crontab [options] file
crontab [options]
options:
-u <user>? ???? 指定一個用戶
-e???????? ? 創建計劃任務
-l???????? ??? 列出計劃任務列表
-r???????? ?? 刪除計劃任務
-i???????? ??? 刪除前進行交互式提示
例:
crontab -l -u wang ? ???查看wang用戶的計劃任務
crontab -r -u wang ? ? 刪除wang用戶的計劃任務
crontab計劃任務同at命令一樣,也有自己的黑、白名單文件,并且他們的作用是相類似的:
/etc/cron.deny??? 黑名單文件,放入文件中的用戶將不能執行周期任務計劃
/etc/cron.allow????? 白名單文件,只有白名單中的用戶才能使用cron,需手動創建,優先級高于黑名單
如果黑、白名單文件都刪除,將只有root賬號可以使用周期計劃任務。
創建周期任務的兩種方法:
第一種方法:修改/etc/crontab? (rootonly)
/etc/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表示每10分鐘執行一次
例如:
# run five minutes after midnight, every day
每五分鐘執行一次:
5 0 * * *?????? $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
# run at 2:15pm on the first of every month — output mailed to paul
每個月第一天的14:15分執行一次,并發送郵件
15 14 1 * *???? $HOME/bin/monthly
# run at 10 pm on weekdays, annoy Joe
每個工作日晚上22:00,發送郵件給Joe
0 22 * * 1-5??? mail -s “It’s 10pm” joe%Joe,%%Where are your kids?%
每間隔2小時的23分鐘,打印一次,am0:23,am2:23,am4:23…,每天
23 0-23/2 * * * echo “run 23 minutes after midn, 2am, 4am …, everyday”
每個星期日的04:05,打印一次
5 4 * * sun???? echo “run at 5 after 4 every sunday”
注意:
30 4 1,15 * 5 ????表示每月1,15日加每周五執行,或關系
若想執行且關系,加腳本判斷
特殊的時間格式:
這些特殊的時間規范可以用來代替一些時段和日期,用@字符作為前綴
@reboot ??????? Run once after reboot?? 下次啟動會執行,包括poweroff
@yearly ???????? 0 0 1 1 *?????????? 每年執行一次
@annually ???? 0 0 1 1 *?????????? 每年執行一次
@monthly ???? 0 0 1 * *?????????? 每月執行一次
@weekly ?????? 0 0 * * 0?????????? 每周執行一次
@daily ??????????? 0 0 * * *?????????? 每天執行一次
@hourly ???????? 0 * * * *?????????? 每小時執行一次
第二種方法:crontab命令創建
crontab -e?????? 將以vi打開一個空白文件
# 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
# |? |? |? |? |
# *? *? *? *? *?? command to be executed
不需寫用戶名,將以當前用戶執行周期計劃任務
創建成功后周期計劃文件自動放入/var/spool/cron目錄
at和crontab對比:
一次性作業使用at
重復性作業使用crontab
at?????????????????????? crontab
創建任務:??? at time????????????????? crontab -e
任務列表:??? at -l ? ? ? ? ? ? ? ? ? ? ? crontab -l
查看信息:??? at -c #??????????????????? N/A
刪除任務:??? at -d #????????????????? crontab -r
修改任務: ? ? N/A ? ? ? ? ? ? ? ? ? ? crontab -e
注意:(1)默認不顯示標準輸出和標準錯誤,會以郵件方式郵寄給用戶
a.COMMAND > /dev/null
b.COMMAND &> /dev/null
(2)根用戶能夠修改其他用戶的作業
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/97641