Ubuntu 使用crontab定時任務
自從伺服器遷移以後,自定義的程式碼倉庫備份指令碼一直沒有執行過,可是原來機器的環境已經不存在了,只能自己摸索。雖然知道cron是用來實現定時任務的,但是一直不知道怎麼做,今天終於出了結果,下面是我實現的方法(環境Ubuntu8.04)。
1. 使用crontab -e命令
這個命令的使用比較簡單。直接輸入
~# crontab -e
就會開啟一個編輯視窗,第一行會有內容格式的提示:
# m h dom mon dow command
具體意義表示:分鐘 小時 日期 月份 星期 命令,在某月(mon)的某天(dom)或者星期幾(dow)的幾點(h,24小時制)幾分(m)執行某個命令(command),*
3 * * * * /home/meng/hello.sh
就是:每小時的03時執行/home/meng/下的hello.sh指令碼。
在儲存之後,根據螢幕下面的提示輸入Ctrl+X退出,此時會提示是否儲存,輸入Y;提示輸入檔名,並且有一個臨時的檔名,由於只是測試,直接回車儲存。
注意:在完成編輯以後,要重新啟動cron程序:
~# /etc/init.d/cron restart
觀察執行結果,會發現hello.sh會每隔一小時,在03分時被執行一次。
在使用這個命令時,最大的擔心就是在系統重啟以後是否還能順利執行呢?我重啟系統以後發現一切正常,於是打消了這個顧慮。但是,仍然有一個問題,一般情況下,伺服器都是在重啟後處於登入狀態下,並沒有使用者登入。那麼如果我在執行crontab -e命令時,不是使用root賬戶,那麼在系統重啟之後是否還會順利執行呢?
2. 編輯crontab檔案
開啟crontab檔案,如果沒有編輯過可以看到如下類似的內容:
- # /etc/crontab: system-wide crontab
- # Unlike any other crontab you don't have to run the `crontab'
- # command to install the new version when you edit this file
- # and files in /etc/cron.d. These files also have username fields,
- # that none of the other crontabs
- SHELL=/bin/sh
- PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
- # m h dom mon dow user command
- 17 * * * * root cd / && run-parts --report /etc/cron.hourly
- 256 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
- 476 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
- 5261 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
由於對指令碼的認知有限,不能詳細解釋每個命令的含義。在第10行,同樣定義了檔案內容的格式。可以看到比使用crontab -e命令時,多了一個user。它表示了執行命令的使用者,如果是root,就表明是系統使用者。於是,我加了如下一行:
3 * * * * root /home/meng/hello.sh
然後儲存檔案。
這時需要的注意是,要重新啟動系統,修改才能起作用。(只重啟cron守護程序可以嗎?)如果以前使用crontab -e進行了修改,建議先註釋掉,不然就不知道是哪個方法在起作用了。
當然,結果也在意料之中,指令碼定時順利執行。
雖然解決了問題,但是還有一個疑問:
在一篇文章中看到,run-parts引數是表示執行資料夾下的所有檔案,也就是說,上面的內容可以寫成:
3 * * * * root run-parts /home/meng
不過,我在測試中好像並沒有達到預想結果,也許是我測試步驟出了問題。這裡做個記號。