1. 程式人生 > >linux系統中的定時器crontab的使用攻略、常見錯誤問題和執行.jar檔案的具體例項。

linux系統中的定時器crontab的使用攻略、常見錯誤問題和執行.jar檔案的具體例項。

今天有個定時任務要從windows上部署到linux上,查了好多資料,總是有各種各樣的問題。雖然最後終於都一一解決了,不過感覺現有的那些詳細教程什麼的不夠詳細,或者說大神們想當然的事,像我這種小白就還是會跳坑。然後就把網上現有的許多的crontab的文章總結了一下,加上自己的經歷和體會,分享給大家。

首先基本介紹了一下crontab,然後說一些具體的列子,最後則是一些常用的命令和總結我遇到的一些問題。好了,待我一一說來吧。

首先,Linux下定時任務是有個程序的,crond,他的配置檔案是/etc/cron*檔案下。使用者如果想使用crontab任務(即定時任務),可以用

crontab  -e   (進入定時任務編輯介面,預設為VI編輯器,編輯器可配置。在此順帶說兩句VI編輯器的使用,簡單來說,進入編輯,可以用以下兩個命令直接編輯

 A:當前行的尾部追加內容    i:遊標前插入內容  l:遊標後插入內容

如果你之前沒有過定時任務的話,那麼crontab -e進去之後直接就是空白。然後就進行新增就行了,新增格式如下:

基本格式 :
*  *  *  *  *  command
分 時 
   日   月  周    命令 

第一個星號所在的列表示分鐘,範圍為1~59,*表示範圍內的所有值,即全選,*/1  表示每一分鐘,同樣,*/5表示整點開始,每5分鐘。

第二個星號所在的列表示小時,範圍1~23(0表示0點)。同樣適用於*/1 表示每小時。

第三個星號所在的列表示日期,範圍1~31。

第四個星號所在的列表示月份,範圍1~12.

第五個星號所在的列表示周,範圍0~6 (0表示週日)。

第六個星號所在的列表示命令,即你想要執行的命令。

(額外說一下VI的儲存命令,在填寫完成你要定時執行的任務後,用:wq或者:x儲存退出,:wq表示強制儲存退出,:x表示有更改時才會儲存退出,沒有直接退出,二者設計版本號的更新問題,在此不細說。)

下面具體給出幾個crontab運用時間的例子

*/1 * * * * /home/manager/ps.sh

表示每一分鐘執行一次,在路徑/home/manager/下的ps.sh檔案

45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart

表示每月1、10、22日的4 : 45重啟apache。

0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart

表示在每天18 : 00至23 : 00之間每隔30分鐘重啟apache。

0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart

每月的4號與每週一到週三的11點重啟apache

因為我是要用linux的定時任務定時執行.jar檔案,所以就以此詳細說一下。

首先我的crontab命令很簡單 13 * * * *  /home/RealDataPublish.sh 即每小時的13分鐘執行以下RealDataPublish.sh這個檔案。

然後就是在RealDataPublish.sh檔案中的編寫了,大家都知道,在JAVA環境中,執行jar檔案直接java -jar +檔名就可以了,然後我的

RealDataPublish.sh檔案一開始就是這麼寫的。。。然後錯誤提示   java:無法獲取的命令。(關於錯誤提示在哪下面會說。)

然後就是RealDataPublish.sh中的內容了,把我的寫法貼出來大家參考一下吧。

cd /usr/local/     (獲取.jar檔案的路徑)

/usr/java/jdk1.6.0_13/bin/java -jar RealDataPublish.jar -cp /usr/java/jdk1.6.0_13/lib/tools.jar:/usr/java/jdk1.6.0_13/lib/dt.jar:   (需要在java前加上

JDK安裝路徑,最後 -cp 獲取配置資訊)

就可以完成在linux中用定時器執行jar檔案的任務了。

最後說一下,定時器執行一次任務,每次都會有回執郵件,在/var/spool/mail/root 下 (如果你是root使用者登入的話

常用的命令:

crontab -l   檢視所有正在執行的所有crontab命令

crontab -r : 刪除目前的時程表

crontab file [-u user]-用指定的檔案替代目前的crontab

ps –ef|grep crond 檢視crontab是否已經啟動

如果沒有啟動則執行service crond start 即可啟動。(如果提示Redirecting to /bin/systemctl start  crond.service,則是因為版本的問題導致,可以使

/bin/systemctl start  crond.service進行啟動

如果是關於crontab不能執行的問題,初步總結了有以下幾個原因:

第一,指令碼的原因:大多數情況下,就是我們的指令碼的問題,這種問題導致crontab不能執行的概率佔到 70%以上。因為程式執行到某一步導致crontab終止執行。

第二,執行環境問題,當我們碰到第一情況下,一般都可以通過手動執行程式將問題扼殺在搖籃裡,一般情況下高手是不應該犯第一種錯誤的。問題是當我們 手動執行成功而crontab不能執行的時候,就是執行環境的問題,例如相關路徑的設定問題。解決方案:在程式碼最前面執行 source /home/user/.bash_profile

第三,系統時間不正確。這種問題最好理解,也是比較常見和隱蔽的問題,解決方案:date -s ********

第四,就是我們的指令碼是否有可執行許可權。必須保證執行指令碼的使用者有執行改檔案的許可權。

第五,crontab 守護程序死掉了。這種情況是極少發生的,但也不排除,當我們實在是找不到其他原因的時候可以用。解決方案:重啟該程序。


寫到這才發現,我之前遇到的坑,在我介紹的時候就已經避過了...尷尬! 那錯誤的地方我就不一一說明了。如果有任何其他的問題都可以去查看回執

郵件的內容,以報錯資訊來排錯,就簡單的多了。

最後,祝大家編碼順利!