检查进程是否正在运行linux shell不能正常工作

问题描述:

我有一个需要始终运行的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

当工作在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

而不是运行管道命令我会建议使用这么长的列表pgrep:

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

这是真的,但可能不是他的问题的原因。 – 2013-04-29 08:17:04