1. 程式人生 > >Ubuntu下用crontab 部署定時任務shell指令碼

Ubuntu下用crontab 部署定時任務shell指令碼

1、首先建立一個定時任務:每分鐘向螢幕輸出"Hello world!"。

有兩種實現方式:

1)輸入crontab -e命令,根據提示直接在當前cron task文字最後面插入如下命令(記得回車):

* * * * * echo "Hello world!"

2)由於每個使用者的定時任務都在/var/spool/cron/crontabs目錄下有個與使用者名稱一致的任務檔案,因此也可以通過vim直接編輯:

sudo vim /var/spool/cron/crontabs/waterfronter             #注:waterfronter為當前使用者名稱

同樣在檔案末行插入:

* * * * * echo "Hello world!"

儲存退出,並通過crontab -l檢視定時任務建立成功。

2、然後等待,若干分鐘後發現螢幕並未輸出"Hello world!"怎麼回事?!

1)剛開始懷疑是cron服務沒有啟動,遂執行:

sudo service cron status

發現cron服務是running的,排除;

2)繼而懷疑是任務檔案建立後未能被系統及時get到,因而執行:

sudo service cron restart

重啟cron後問題依舊,排除;

3)於是進一步檢視cron執行日誌(/var/log/cron.log

,但是並未找到相關檔案,原因是ubuntu預設沒有開cron日誌,執行命令:

sudo vim /etc/rsyslog.d/50-default.conf

找到cron.log相關行,將前面註釋符#去掉,儲存退出,重啟rsyslog:

sudo  service rsyslog  restart

執行less -10 /var/log/cron.log再次檢視cron執行日誌,log出來了,提示如下資訊:

No MTA installed, discarding output

原因是cron把螢幕輸出都發送到email了,而當前環境並未安裝email server,於是系統報錯,解決方面就是不要直接向螢幕輸出內容,而是重定向到一個檔案。

3、修改任務檔案

sudo vim /var/spool/cron/crontabs/waterfronter

將末行改為:

* * * * * echo "Hello world!" >> /tmp/cron_log.txt

儲存退出,同時reload cron服務:

sudo service cron reload

若干分鐘後檢視/tmp/cron_log.txt,“Hello world!”每隔一分鐘輸出一次,問題解決。

命令總結:

用以下的方法啟動、關閉這個cron服務: 
service cron start //啟動服務 
service cron stop //關閉服務 
service cron restart //重啟服務 
service cron reload //重新載入配置

檢視crontab服務狀態:service cron status 
手動啟動crontab服務:service cron start 

新增排程任務可用兩種方法: 
1)、在命令列輸入: crontab -e 然後新增相應的任務,wq存檔退出。 
2)、直接編輯/etc/crontab 檔案,即vi /etc/crontab,新增相應的任務。 
crontab -e配置是針對某個使用者的,而編輯/etc/crontab是針對系統的任務 
檢視排程任務 
crontab -l //列出當前的所有排程任務 
crontab -l -u jp //列出使用者jp的所有排程任務 
刪除任務排程工作 
crontab -r //刪除所有任務排程工作 

* * * * * echo "Hello world!" 中“*”的解釋:

minute - 從0到59的整數 

hour - 從0到23的整數  day - 從1到31的整數 (必須是指定月份的有效日期) month - 從1到12的整數 (或如Jan或Feb簡寫的月份) dayofweek - 從0到7的整數,0或7用來描述週日 (或用Sun或Mon簡寫來表示) command - 需要執行的命令(可用as ls /proc >> /tmp/proc或 執行自定義指令碼的命令) 

除了數字還有幾個特殊的符號:"*"、"/"和"-"、","

  • *代表所有的取值範圍內的數字
  • "/"代表每的意思,"/5"表示每5個單位
  • "-"代表從某個數字到某個數字
  • ","分開幾個離散的數字
例子:

15,30,45,59 * * * * echo "xgmtest....."     表示,每隔15分鐘,執行一次列印命令 

每天早上6 0 6 * * * echo "Good morning." >> /tmp/test.txt //注意單純echo,從螢幕上看不到任何輸出,因為cron把任何輸出都email到root的信箱了。 每兩個小時(第一個為15,指明沒兩個小時的第15min中執行一次) 15 */2 * * * echo "Have a break now." >> /tmp/test.txt  晚上11點到早上8點之間每兩個小時和早上八點 0 23-7/28 * * * echo "Have a good dream" >> /tmp/test.txt 每個月的4號和每個禮拜的禮拜一到禮拜三的早上11 0 11 4 1-3 command line 11日早上4 0 4 1 1 * command line 每小時(第一分鐘)執行/etc/cron.hourly內的指令碼 01 * * * * root run-parts /etc/cron.hourly 每天(凌晨