計劃任務shell
所謂的計劃任務是在將來某一特定的時間執行一次或屢次特定的做業(任務)。實現無需人工干預的狀況下執行做業。
bash
1、計劃任務的分類編輯器
根據計劃任務在將來被執行的次數,分爲一次性計劃任務和週期性計劃任務。
ide
一次性計劃任務:只在將來的某一時間執行一次。
oop
週期性計劃任務:在將來某一特定時間內循環執行屢次。
ui
2、一次性計劃任務url
一次性計劃任務經常使用的命令有at,batch。
spa
一、設定一次性計劃任務命令行
1)at命令設定一次性計劃任務,它是由atd後臺進程管理的。要想設置一次性任務需啓動atd服務進程。在CentOS中經過/etc/init.d/atd start 命令來啓動此服務。 server
在命令行下:
at TIME
at> COMMAND1
at> COMMAND2
...
at>
Ctrl+d:提交任務
TMIE支持的格式有:
格式 | 示例 |
HH:MM | 13:12 |
MMDDYY MM/DD/YY DD.MM.YY YYYY-MM-DD | 030914 03/09/14 09.03.14 2014-03-09 |
AM PM | 4am 3pm |
特定字符 + | now noon midnight teatime +{minutes|hours|days|weeks} |
組合使用 | now + 3min 4pm + 1days teatime + 3hours |
[root@server ~]# at now + 10min at> ls /etc/passwd at> cat /etc/issue at> date +%F-%D at> <EOT> job 4 at 2014-07-12 11:33 [root@server ~]# at 2pm at> ls /etc/passwd at> <EOT> job 5 at 2014-07-12 14:00 [root@server ~]# atq 4 2014-07-12 11:33 a root 5 2014-07-12 14:00 a root [root@server ~]# at 17:00 at> date at> <EOT> job 6 at 2014-07-12 17:00
at是經過做業隊列來管理的,經過at後者at -l命令查看做業隊列
[root@server ~]# atq 6 2014-07-12 17:00 a root #前面的數字是做業的ID號,刪除做業的時候能夠用到 8 2014-07-12 11:31 a root 5 2014-07-12 14:00 a root
刪除不想執行的任務 at -d 做業ID 或者 atrm 做業ID
[root@server ~]# atq 6 2014-07-12 17:00 a root 5 2014-07-12 14:00 a root [root@server ~]# atrm 6 [root@server ~]# atq 5 2014-07-12 14:00 a root [root@server ~]#
做業執行完之後,是以本地郵件的方式通知做業的提交者。
能夠經過/etc/at.allow和/etc/at.deny 2個文件來控制用戶是否可使用at來設置一次性任務。
2)batch功能同at,但相比於at而言,無需指定其特定的時間。系統會選擇系統資源比較空閒的時候執行指定的做業。
[root@server ~]# batch at> ls . at> <EOT> job 12 at 2014-07-12 11:42 You have mail in /var/spool/mail/root #它當即就執行了,由於如今就是系統空閒的時候。
2、週期性任務
週期性任務是在將來某一特定的時間內循環執行特定的做業。是經過cron機制來完成相應功能的。是由後臺進程crond一直在監控。
經過「/etc/init.d/crond status」命令語句來查看crond的狀態,若是狀態是「is stopped.」,須要啓動此服務,執行「/etc/init.d/crond start;chkconfig crond on」。
/etc/init.d/crond status 查看crond的狀態
/etc/init.d/crond stop 關閉crond服務
/etc/init.d/crond start 打開crond服務
一、cron任務分類
根據cron任務的執行者不一樣,將cron分爲兩類:
系統cron
定義在/etc/crontab中,每行定義一個獨立的任務,這是針對於系統級的。
用戶cron
定義在/var/spool/cron目錄中,每一個用戶都有一個與用戶名同名的文件,其功能相似於/etc/crontab,每行定義一個獨立的任務。這是針對於用戶級別的。
二、相關目錄和文件
/etc/cron.hourly/ 每一個小時要執行的腳本的目錄
/ect/cron.daily/ 每一個天要執行的腳本的目錄
/etc/cron.monthly/ 每月要執行的腳本的目錄
/etc/cron.weekly/ 每一個周要執行的腳本的目錄
/etc/cron.deny 只有cron.allow文件中列出的用戶才能使用cron服務,同時忽略cron.deny文件
/etc/cron.allow 若是cron.allow文件不存在,cron.deny文件中列出的用戶將被禁止使用cron服務
三、週期性任務的設定
週期性任務的環境變量和設定格式:
環境變量:
SHELL=/bin/bash #默認shell解釋器
PATH=/sbin:/bin:/usr/sbin:/usr/bin #默認環境PATH的路徑,因此在設定週期性任務的話有時要寫全腳本的路徑
MAILTO=root #若是出現錯誤,或者有數據輸出,數據做爲郵件發給這個賬號
HOME=/ #默認的家目錄
格式:
# .---------------- 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 #主要有3部分組成,第一部分 * * * * * 所表明的時間是:minute hour day month day # * * * * * 每分鐘 # 2 */2 * * * 每隔2小時 */#:在對應的時間位的有效取值上每#一次 # 3 4 * * 1,3,5 每週1,3,5 ','表明離散取值 # 3 9-17 * * * 天天9-17'-'某個時間位上的連續區間 #注意:在設置時間是,比它小單位通常都是肯定的 #第二部分是:user-name 用戶名,這一部分在編輯/etc/crontab設定週期性任務時,須要指定用戶名。其餘兩中方式不須要 #第三部分是 command to be executed 可執行的命令或者是腳本。若是有run-parts關鍵字,後面是腳本所在的目錄 #1 * * * * root run-parts /etc/cron.hourly/
設定週期性任務的方式有三種:
1)經過crontab命令
crontab [-u USER_NAME] -e
此時會打開一個編輯器,按照相應的格式就能夠設定。
2)經過編輯/var/soop/USER_NAME文件設定
3)經過編輯/etc/crontab文件設定
四、丟棄郵件通知:
使用輸出重定向:
&>/dev/null
>/dev/null
五、crontab命令其餘經常使用用法
-l: 列出已經定義的全部任務
-e: 打開編輯界面定義任務
-r: 移除全部任務 若是是要刪除某一條特定的任務,能夠經過設定週期任務的三種方式來刪除對應任務所在的那一行。
六、其餘
anacron: crontab的補充機制
檢查有沒有過去一個有效週期不曾執行的任務,若是有,在開機後的指定時間點執行一次;
實現秒級別的任務:
* * * * * for i in {1..5};do 腳本;sleep 10;done (每隔10秒)
七、練習
一、每個月執行一次對/目錄的備份,備份至/backup目錄中,保存的目錄名格式爲rootfs-2014-07;
# 0 4 1 * * [ -d /backup ] || mkdir /backup; /bin/cp -a / /backup/etc-$(date +'%Y-%m')
二、每週3,5,7備份/proc/cpuinfo文件至/backup/cpu.info/目錄中,保存的文件名爲cpu-2013081009;
# 3 1 * * 3,5,7 [ -d /backup/cpu.info/ ] || mkdir -p /backup/cpu.info/; /bin/cp -a /proc/cpuinfo /backup/cpu.info/cpu-$(date +'%Y%m%d%H')
三、天天每兩小時取當前系統/proc/meminfo中的以S開頭的信息保存至/stats/memory.txt中
# 2 */2 * * * grep -i "^S" /proc/meminfo >> /stats/memory.txt
四、工做日的工做時間內,每小時執行一次'echo "hello"'
# 1 9-17 * * 1-5 echo "hello"