在linux平台上如果需要實現任務調度功能可以編寫cron腳本來實現。
以某一頻率執行任務
linux缺省會啟動crond進程,crond進程不需要用戶啟動、關閉。
crond進程負責讀取調度任務並執行,用戶只需要將相應的調度腳本寫入cron的調度配置文件中。
cron的調度文件有以下幾個:
- crontab
- cron.d
- cron.daily
- cron.hourly
- cron.monthly
- cron.weekly
如果用的任務不是以hourly monthly weekly方式執行,則可以將相應的crontab寫入到crontab 或cron.d目錄中。
示例:
每隔一分鐘執行一次腳本 /opt/bin/test-cron.sh
可以在cron.d新建腳本 echo-date.sh
內容為
*/1 * * * * root /opt/bin/test-cron.sh
在指定的時間運行任務
也可以通過at命令來控制在指定的時間運行任務
如:
at -f test-cron.sh -v 10:25
其中-f 指定腳本文件, -v 指定運行時間
quote:ea946d690b="lophyxp"]首先用
contab -l >contabs.tmp
導出contab的配置。
然後編輯contabs.tmp文件。以一下格式添加一行:
分鐘 小時 天 月 星期 命令
比如
10 3 * * 0,6 hello
就是每周六、周日的3點10分執行hello程序。
15 4 * * 4-6 hello
就是從周四到周六的4點15點執行hello程序。
然後用
contab contabs.tmp
命令導入新的配置。
一般不建議直接修改/etc/下的相關配置文件。
啟動cron進程的方法
:/etc/init.d/crond start
開機就啟動cron進程的設置命令:chkconfig --add crond
方法二:
把cron加入到啟動腳本中:
# rc-update add vixie-cron default
crontab -l #查看你的任務
crontab-e#編輯你的任務
crontab-r#刪除用戶的crontab的內容
實例講解二:
系統cron設定:/etc/crontab
通過 /etc/crontab 文件,可以設定系統定期執行的任務,當然,要想編輯這個文件,得有root權限
0 7 * * * root mpg123 ~/wakeup.mp3
分 時 日 月 周
示例:
0 4 * * 0
root emerge --sync && emerge -uD world #每周日凌晨4點,更新系統
0 2 1 * * root
rm -f /tmp/* #每月1號凌晨2點,清理/tmp下的文件
0 8 6 5 * root
mail robin < /home/galeki/happy.txt #每年5月6日給robin發信祝他生日快樂
假如,我想每隔2分鐘就要執行某個命令,或者我想在每天的6點、12點、18點執行命令,諸如此類的周期,可以通過 “ / ” 和 “ , ” 來設置:
*/2 * * * * root ............... #每兩分鐘就執行........
0 6,12,18 * * * root ............... #每天6點、12點、18點執行........
每兩個小時
0 */2 * * *
echo "have a break now." >> /tmp/test.txt
晚上11點到早上8點之間每兩個小時,早上八點
0 23-7/2,8 * * * echo "have a good dream:)" >> /tmp/test.txt
每個月的4號與每個禮拜的禮拜一到禮拜三的早上11點
0 11 4 * 1-3 command line
1月1日早上4點
0 4 1 1 * command line
收獲:可以把經常要做的一些事放到其中,簡化工作量,如每周一檢查服務器的運行狀態,查看報告,殺掉一些進程等等……
關於 Crontab ,維基百科上的詞條 Crontab非常好。可惜這個地址在國內不用代理訪問不到。
雖然關於 Crontab 的介紹到處都是,詳細讀了一遍這個詞條,收獲還是有的。Crontab 這個名字來自 "chronos",一個古希臘語, “時間”的意思.
常見陷阱
每個SA、DBA 或者是普通的 Unix 用戶,在第一次使用 Crontab 的時候都會遇到問題. 運行 Crontab 的常見錯誤包括如下幾種:
1) 出於測試目的新創建了一條 Cron JOB, 時間間隔必須超過兩分鐘,否則 JOB 將調度不到。如果必須忽略這兩分鐘的載入配置時間差,可以通過重新啟動 Cron Daemon 做到。
2) 從 Crontab 中啟動 X Window 程序需要注意的事項:所以要麼在程序前初始化 "DISPLAY=:0.0", 要麼在應用程序後面追加參數 --display :0.0
3) 命令中的 % 必須做轉義處理: \% .我個人的意見是不要在命令行裡帶這個參數,干脆寫到腳本裡,然後調度該腳本即可。
其實我倒是認為使用 Crontab 最常見的一個問題往往是因為環境變量不對。經常會看到論壇裡有人問:為什麼我的 Crontab 創建了不執行? 准備創建一條 Cron JOB 的時候,很多人都喜歡在命令行下運行一遍,因為這個時候環境變量是隨著 Shell 自動帶進來,在 Crontab 中則可能因為找不到正確的環境變量,JOB 就不能執行。這個小問題就像出天花,一次教訓之後就都記得了。
必須使用的一則技巧
每條 JOB 執行完畢之後,系統會自動將輸出發送郵件給當前系統用戶。日積月累,非常的多,甚至會撐爆整個系統。所以每條 JOB 命令後面進行重定向處理是非常必要的: >/dev/null 2>&1 。前提是對 Job 中的命令需要正常輸出已經作了一定的處理, 比如追加到某個特定日志文件。
附: Crontab 的格式說明如下:
* 逗號(',') 指定列表值。如: "1,3,4,7,8"
* 中橫線('-') 指定范圍值 如 "1-6", 代表 "1,2,3,4,5,6"
* 星號 ('*') 代表所有可能的值
Linux(開源系統似乎都可以)下還有個 "/" 可以用. 在 Minute 字段上,*/15 表示每 15 分鐘執行一次. 而這個特性在商業 Unix ,比如 AIX 上就沒有.
# Use the hash sign to prefix a comment
# +---------------- minute (0 - 59)
# | +------------- hour (0 - 23)
# | | +---------- day of month (1 - 31)
# | | | +------- month (1 - 12)
# | | | | +---- day of week (0 - 7) (Sunday=0 or 7)
# | | | | | # * * * * * command to be executed