Linux執行Cron Job失敗,在Shell sh下執行卻能成功 - 環境變量?

一、我們常常碰到在shell下執行某個命令能夠成功,比如執行一個java程序:

java -jar /home/opscoder/topo-audit.jar,但是在crontab下執行會失敗。

cornjob爲 0 10 * * * java -jar /home/opscoder/topo-audit.jar: 即每天10點去執行這個jar中的main方法

二、查找失敗的原因,即查看crotab的執行log, 有如下3種方法,我所用的是ubantu的機器,使用的是方法1、 mail任務(Linux UNIX)在 /var/spool/mail/root 文件中,有crontab執行日誌的記錄,用tail -f /var/spool/mail/root 即可查看最近的crontab執行情況。

 

2、針對UINX系統查詢方法(AIX、HP-UX)

在 /var/spool/cron/tmp文件中,有croutXXX00999的tmp文件,tail 這些文件就可以看到正在執行的任務了。

 

3、針對Linux系統的查詢方法(含Redhat、SUSE)

看 /var/log/cron這個文件就可以,可以用tail -f /var/log/cron觀察

配圖爲系統aix root用戶默認的crontab

 

三、針對我的情況,從log中可以看出是/bin/sh: java command not found

這就說明了cron使用的環境變量不是系統的環境變量,而是自己的環境變量,說白了,就是crontab不能讀取到/etc/profile下的信息。

 

四、解決方法:

1、修改crontab來調用一個腳本,而不是直接執行這個jar

即將:cornjob爲 0 10 * * * java -jar /home/opscoder/topo-audit.jar

修改爲:0 10 * * * /home/opscoder/topo-check.sh

 

2、創建topo-check.sh

touchtopo-check.sh   #創建topo-check.sh文件
vi topo-check.sh         #編輯topo-check.sh文件,並輸入如下內容


#!/bin/bash
source /etc/profile
java -jar /home/opscoder/topo-audit.jar


保存退出。
chmod +x topo-check.sh    #給topo-check.sh可執行權限

這樣就大功告成了,需要注意的是需要加上#!/bin/bash,不然crontab可能還是不能執行成功,使用如上的3中方法之一來查看crontab的log,你會發現類似: /bin/sh command /home/opscoder/topo-check.sh not found

 

附:如果當前用戶不能啓動crontab,可以使用具有sudo權限或者具有啓動權限(service)的用戶先啓動crontab(service cron status, service cron start, service cron start),然後再切回該用戶創建或者cron job(crontab -e)

 

 

發佈了59 篇原創文章 · 獲贊 13 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章