2013-04-29 97 views
2

我有一個需要始終運行的java進程。我已經寫在cron程序以下shell來檢查Java進程:檢查進程是否正在運行linux shell不能正常工作

if [ `ps aux | grep testjava | grep -v grep | wc -l` -ne 1 ];then 
cd /root/folder 
sh mytest.sh >test.log 2>test-err.log & 
echo "mytest not running and restarted on "`date` >> /root/check-test.log 

其中mytest.sh包含有正在運行的Java類。

當我分別執行shell文件時,它執行得很好。但是當我執行上述cron時,它給了我以下例外:

Exception in thread "main" java.lang.NoClassDefFoundError: mytest/mytestprog 
Caused by: java.lang.ClassNotFoundException: mytest.mytestprog 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 

我在哪裏出錯了。

編輯:

我運行的路徑mytest.sh文件$JAVA_HOME/bin/java -cp .:/root/lib/* -Djava.rmi.server.codebase=file:/root/folder/ -Djava.rmi.server.hostname=hostnameip -Djava.security.policy=server.policy -Xmx512m -Xms512m mytest.mytestprog

+1

我懷疑當調用mytest.sh時,路徑不正確;你沒有找到源文件。確保在你的shell腳本中明確地設置了必要的環境變量。 – Floris 2013-04-29 05:35:20

+0

我有文件在這個路徑下運行/root/folder.And我給了cd/root /文件夾。在那個cron中給cd命令有什麼錯誤 – ashu 2013-04-29 06:00:03

+0

它是否有正確的權限來運行你的可執行文件? Cron以用戶身份運行?我會閱讀@spaceknarf發佈的鏈接 - 他們的標題看起來很有希望。 – Floris 2013-04-29 06:03:38

回答

1

當工作在cron被執行時,它有一個不同的環境。最有可能的是,您的.bashrc未被加載。並且通常在該文件中設置CLASSPATH。因此,CLASSPATH可能不正確。

各種方法來設置cron環境,請參閱:

+0

但是在mytest.sh文件中,我的路徑是$ JAVA_HOME/bin/java -cp。:/ root/lib/* -Djava.rmi.server.codebase = file:/ root/folder/-Djava.rmi。 server.hostname = hostnameip -Djava.security.policy = server.policy -Xmx512m -Xms512m mytest.mytestprog – ashu 2013-04-29 05:58:19

+1

你可以在Java中創建一個測試程序來打印它的類路徑,並查看它是否在'cron'內部和外部是不同的。 – 2013-04-29 11:01:47

1

而不是運行管道命令我會建議使用這麼長的列表pgrep:

[ $(pgrep -f testjava) ] && && echo "running" 
+0

這是真的,但可能不是他的問題的原因。 – 2013-04-29 08:17:04