检查进程是否正在运行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
当工作在cron
被执行时,它有一个不同的环境。最有可能的是,您的.bashrc
未被加载。并且通常在该文件中设置CLASSPATH
。因此,CLASSPATH
可能不正确。
各种方法来设置cron
环境,请参阅:
但是在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
你可以在Java中创建一个测试程序来打印它的类路径,并查看它是否在'cron'内部和外部是不同的。 – 2013-04-29 11:01:47
而不是运行管道命令我会建议使用这么长的列表pgrep:
[ $(pgrep -f testjava) ] && && echo "running"
这是真的,但可能不是他的问题的原因。 – 2013-04-29 08:17:04
我怀疑当调用mytest.sh时,路径不正确;你没有找到源文件。确保在你的shell脚本中明确地设置了必要的环境变量。 – Floris 2013-04-29 05:35:20
我有文件在这个路径下运行/root/folder.And我给了cd/root /文件夹。在那个cron中给cd命令有什么错误 – ashu 2013-04-29 06:00:03
它是否有正确的权限来运行你的可执行文件? Cron以用户身份运行?我会阅读@spaceknarf发布的链接 - 他们的标题看起来很有希望。 – Floris 2013-04-29 06:03:38