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 守護程序死掉了。這種情況是極少發生的,但也不排除,當我們實在是找不到其他原因的時候可以用。解決方案:重啟該程序。
寫到這才發現,我之前遇到的坑,在我介紹的時候就已經避過了...尷尬! 那錯誤的地方我就不一一說明了。如果有任何其他的問題都可以去查看回執
郵件的內容,以報錯資訊來排錯,就簡單的多了。
最後,祝大家編碼順利!