伺服器需要定時處理一些任務,一般是可以利用linux系統的crontab來處理,可以精確到分鐘。windows下面也有計劃任務,但是以前網管就說這個有漏洞,win2003的伺服器都不給啟用。
引用crond 是linux用來定期執行程式的命令。當安裝完成作業系統之後,預設便會啟動此任務調度命令。crond命令每分鍾會定期檢查是否有要執行的工作,如果有要執行的工作便會自動執行該工作。而linux任務調度的工作主要分為以下兩類:
1、系統執行的工作:系統周期性所要執行的工作,如備份系統資料、清理緩衝
2、個人執行的工作:某個使用者定期要做的工作,例如每隔10分鐘檢查郵件伺服器是否有新信,這些工作可由每個使用者自行設定。
在crontab裡面,有幾個點內容而已:
執行時間、執行使用者、執行內容
1 執行時間
分 時 日 月 天每星期
如果不需要指定的地方,可以用 * 來代表,否則就是指定的
也可以使用 */10 指定每10個單位
比如 */10 * * * * 表示每10分鐘執行一次
引用
任務調度設定檔案的寫法
其格式如下:
Minute Hour Day Month Dayofweek command
分鐘 小時 天 月 天每星期 命令
每個欄位代表的含義如下:
Minute 每個小時的第幾分鐘執行該任務
Hour 每天的第幾個小時執行該任務
Day 每月的第幾天執行該任務
Month 每年的第幾個月執行該任務
DayOfWeek 每周的第幾天執行該任務
Command 指定要執行的程式
在這些欄位裡,除了“Command”是每次都必須指定的欄位以外,其它欄位皆為可選欄位,可視需要決定。對於不指定的欄位,要用“*”來填補其位置。
舉例如下:
1、指定每小時的第5分鐘執行一次ls命令
5 * * * * ls
2、指定每天的 5:30 執行ls命令
30 5 * * * ls
3、指定每月8號的7:30分執行ls命令
30 7 8 * * ls
4、指定每年的6月8日5:30執行ls命令
30 5 8 6 * ls
5、指定每星期日的6:30執行ls命令
30 6 * * 0 ls
註:0表示星期天,1表示星期1,以此類推,也可以用英文來表示,sun表示星期天,mon表示星期一等。
6、每月10號及20號的3:30執行ls命令
30 3 10,20 * * ls
註:“,”用來串連多個不連續的時段
7、每天8-11點的第25分鐘執行ls命令
25 8-11 * * * ls
註:“-”用來串連連續的時段
8、每15分鐘執行一次ls命令
*/15 * * * * ls
即每個小時的第0 15 30 45 60分鐘執行ls命令
9、每個月中,每隔10天6:30執行一次ls命令
30 6 */10 * * ls
即每月的1、11、21、31日是的6:30執行一次ls命令。
10、每天7:50以root 身份執行/etc/cron.daily目錄中的所有可執行檔
50 7 * * * root run-parts /etc/cron.daily
註:run-parts參數表示,執行後面目錄中的所有可執行檔。
新增調度任務
新增調度任務可用兩種方法:
1、在命令列輸入: crontab -e 然後添加相應的任務,wq存檔退出。
2、直接編輯/etc/crontab 檔案,即vi /etc/crontab,添加相應的任務。
查看調度任務
crontab -l //列出當前的所有調度任務
crontab -l -u jp //列出使用者jp的所有調度任務
刪除任務調度工作
crontab -r //刪除所有任務調度工作
任務調度執行結果的轉向
例1:每天5:30執行ls命令,並把結果輸出到/jp/test檔案中
30 5 * * * ls >/jp/test 2>&1
註:2>&1 表示執行結果及錯誤資訊。
編輯/etc/crontab 檔案配置cron
cron服務每分鐘不僅要讀一次/var/spool/cron內的所有檔案,還需要讀一次/etc/crontab,因此我們配置這個檔案也
能運用cron服務做一些事情。用crontab配置是針對某個使用者的,而編輯/etc/crontab是針對系統的任務。此檔案的檔案格式是:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root //如果出現錯誤,或者有資料輸出,資料作為郵件發給這個帳號
HOME=/ //使用者啟動並執行路徑,這裡是根目錄
# run-parts
01 * * * * root run-parts /etc/cron.hourly //每小時執行/etc/cron.hourly內的指令碼
02 4 * * * root run-parts /etc/cron.daily //每天執行/etc/cron.daily內的指令碼
22 4 * * 0 root run-parts /etc/cron.weekly //每星期執行/etc/cron.weekly內的指令碼
42 4 1 * * root run-parts /etc/cron.monthly //每月去執行/etc/cron.monthly內的指令碼
大家注意"run-parts"這個參數了,如果去掉這個參數的話,後面就可以寫要啟動並執行某個指令碼名,而不是檔案夾名了。
以上內容主要參考文章:http://blog.donews.com/shanxueyi/archive/2006/09/26/1047406.aspx
crontab檔案有六個域,每個域之間用空格或者Tab鍵分開,前五個域都是整數或者*,格式如下(括弧裡面是取值範圍):
分鐘(0-59) 小時(0-23) 日(1-31) 月(1-12) 星期(0-6) 要執行的命令
其中星期取值0指星期日,其它取值遞推。前面五個域,每個域都可以用*表示所有合法的值,或者用一個列表列出合法的值,各值之間用“,”隔開,也可以用“-”表示一個範圍。下面的命令示範每個星期,星期日到星期四晚上執行/home/wuxp/backup.sh。
30 23 * * 0-4 /home/wuxp/backup.sh
下面的例子示出每星期星期一到星期五3:15分清除使用者目錄下的core檔案
15 3 * * 1-5 find $HOME -name core 2>/dev/null |xargs rm -f
重新啟動OS的定時服務,使新添加的任務生效。
Sun Solaris
#/etc/rc2.d/S75cron stop
#/etc/rc2.d/S75cron start
Linux
#/etc/rc.d/init.d/crond restart
這樣系統就會定時執行計畫任務。