1. 程式人生 > >Ubuntu 使用crontab定時任務

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檔案,如果沒有編輯過可以看到如下類似的內容:

  1. # /etc/crontab: system-wide crontab
  2. # Unlike any other crontab you don't have to run the `crontab'
  3. # command to install the new version when you edit this file
  4. and files in /etc/cron.d. These files also have username fields,
  5. # that none of the other crontabs 
    do.
  6. SHELL=/bin/sh
  7. PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
  8. # m h dom mon dow user  command
  9. 17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
  10. 256    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
  11. 476    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
  12. 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

不過,我在測試中好像並沒有達到預想結果,也許是我測試步驟出了問題。這裡做個記號。