在LINUX中,我們通過crontab和at這兩個東西來實現
at:它是一個可以處理僅執行一次就結束的指令
crontab:它是會把你指定的工作或任務,比如:腳本等,按照你設定的周期一直循環執行下去
1.at計劃任務的使用
語法格式: at 時間
服務:atd
開啟atd服務
對應的查看atd服務,如果沒有啟動則啟動
rpm -q at #查看at包有沒有安裝
yum install at -y #安裝at包
#這里可以先查詢一下,如果沒有at命令的話,則可以直接用yum命令安裝
使用at創建計劃任務
at 20:48 --注意語法,如果是上午的時間,后面要加am如[10:25 am]
at> mkdir /root/test ---輸入要執行的命令或腳本at> <EOT> --按ctrl+d結束job 1 at Fri Oct 28 20:48:00 2016
at -l 查看計劃任務
atq 查看計劃任務
at計劃任務的特殊寫法
# at 20:00 2016-10-1 在某天
# at now +10min 在 10分鐘后執行
# at 17:00 tomorrow 明天下午5點執行
# at 6:00 pm +3 days 在3天以后的下午6點執行
對于系統來說 :計劃任務 就是在某個特定的時刻 執行一個腳本文件
創建成功的at計劃任務會在/var/spool/at/目錄下成生一個可執行的腳本文件
每一個腳本都對應一個at計劃任務
刪除at計劃任務
atrm 命令
atrm + 計劃任務的編號
2.crontab定時任務的使用
crond命令定期檢查是否有要執行的工作,如果有要執行的工作便會自動執行該工作
cron是一個linux下的定時執行工具,可以在無需人工干預的情況下運行作業。
linux任務調度的工作主要分為以下兩類:
.系統執行的工作:系統周期性所要執行的工作,如備份系統數據、清理緩存. 例如/tmp 臨時目錄
.個人執行的工作:某個用戶定期要做的工作,由每個用戶自行設置。
啟動服務
systemctl status crond # (查看crond服務的狀態)systemctl restart crond # 重啟 systemctl enable crond # 開機自啟
cron命令參數介紹:
crontab的參數:
crontab -u #指定某個用戶的cron服務
crontab -l #列出cron服務的詳細內容
crontab -r #刪除cron服務
crontab -e #編輯cron服務
例如:
crontab -u root -l # root查看自己的cron計劃任務
crontab -u san -r # root想刪除san的cron計劃任務
特殊符號的含義
符號 | 含義 | 示例 |
---|---|---|
* | 代表取值范圍內的數字 | (任意) |
/ | 代表”每” | */10 |
- | 代表從某個數字到某個數字 | 6-18 |
, | 分開幾個離散的數字 | 6,18 |
我們可用crontab -e命令來編輯計劃任務
編輯的是/var/spool/cron下對應用戶的cron文件
crontab的計劃任務內容保存在目錄/var/spool/cron下面
編輯計劃任務
crontab -u root -e
也可以直接在/etc/crontab中添加計劃任務
cron服務每分鐘不僅要讀一次/var/spool/cron內的所有文件,還需要讀一次/etc/crontab
因此我們配置這個文件也能運用cron服務做一些事情。
用crontab配置是針對某個用戶的,而編輯/etc/crontab是針對系統的任務
編輯/etc/crontab 配置文件 (說明)
vi /etc/crontab
SHELL=/bin/bash #變量的值指定shell 環境(此處默認為 bash shell);
PATH=/sbin:/bin:/usr/sbin:/usr/bin # PATH 變量定義用來執行命令的程序路徑;
MAILTO=root //如果出現錯誤,或者有數據輸出,數據作為郵件發給這個帳號
系統級別的計劃任務
對于系統級別的計劃任務,需要執行的命令和腳本都放在這里:
/etc/cron.* 按兩次tab
ls /etc/cron
cron.d/ cron.deny cron.monthly/ cron.weekly/
cron.daily/ cron.hourly/ crontab
目錄作用解釋:
cron.d/ #是系統自動定期需要做的任務,但是又不是按小時,按天,按星期,按月來執行的,那么就放在這個目錄下面。
cron.deny #控制用戶是否能做計劃任務的文件;
cron.monthly/ #每月執行的腳本;
cron.weekly/ #每周執行的腳本;
cron.daily/ #每天執行的腳本;
cron.hourly/ #每小時執行的腳本;
crontab #主配置文件 也可添加任務;
計劃任務案例
1)每天晚上21:30 重啟apache30 21 * * * /etc/init.d/httpd restart
2)每月1、10、22日的4 : 45重啟apache。45 4 1,10,22 * * /etc/init.d/httpd restart
3)每月1到10日的4 : 45重啟apache。45 4 1-10 * * /etc/init.d/httpd restart
4)每隔兩天的上午8點到11點的第3和第15分鐘執行apach3,15 8-11 */2 * * etc/init.d/httpd restart
5)晚上11點到早上7點之間,每隔一小時重啟apach* 23-7/1 * * * /etc/init.d/apach restart
6)周一到周五每天晚上 21:15 寄一封信給 root@xuegod72:15 21 * * 1-5 mail -s "hi" root@xuegod72 < /etc/fstab
anacron
cron用控制循環執行例行性工作。如果我要設定機器每早8點進行備份服務。除非我機器保證在8點這個時間點不會關機,如果關機了,cron中的腳本,在下次開機將不會被執行。
anacron并沒有取代cron的意思,anacron用于機器重啟后,會偵測停機期間,有沒有cron沒有執行的計劃任務,如果有,會立即執行一下沒有執行的任務。
注意事項
每條任務調度執行完畢,系統都會將任務輸出信息通過電子郵件的形式發送給當前系統用戶,這樣日積月累,日志信息會非常大,可能會影響系統的正常運行,因此,將每條任務進行重定向處理非常重要
當crontab突然失效時,可以嘗試/etc/init.d/crond restart解決問題。或者查看日志看某個job有沒有執行/報錯tail -f /var/log/cron。
在crontab中%是有特殊含義的,表示換行的意思。如果要用的話必須進行轉義\%,如經常用的date ‘+%Y%m%d’在crontab里是不會執行的,應該換成date ‘+\%Y\%m\%d’
?
將一個月中10天的日志歸檔
#!/usr/bin/env bash #[-d $PWD/file] && mkdir -p $PWD/file &&exit 1 data='/usr/local/src/log' cd $data date_d=`date +%d` result=$[date_d/10] result=0 date_m=`date +%Y%m` if [ $result -eq 0 ] thennum=01nowdate=`date +%Y-%m-01` #本月第一天enddate=`date -d "last day $nowdate" +%Y-%m-%d` #上個月最后一天startdate=`date -d "$enddate" +%Y-%m-21`end_day=`date -d "$enddate" +%d`start_day=`date -d "$startdate" +%d`dayDiff=$[end_day-start_day+1] fiif [ $result -eq 1 ] thennum=02startdate=`date +%Y-%m-01`dayDiff=10fiif [ $result -eq 2 ] thennum=03dayDiff=10startdate=`date +%Y-%m-11` fitargit_dir=${date_m}${num} echo $targit_dir if [ ! -d $targit_dir ];thenmkdir $targit_dir fi for i in `seq $dayDiff` dofind /usr/local/src -name "access.log-$startdate-*" 2> /dev/null -exec mv {} $data/$targit_dir \; # find /usr/local/src -name "access.log-$startdate-*"startdate=`date -d "+1 day $startdate" +%Y-%m-%d` done tar jcf $targit_dir.tar.bz2 $targit_dir if [ $? -eq 0 ];thenrm -fr $targit_dir fi
?
?