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

我有一个java进程,需要始终运行。 我在cron程序中写了下面的shell来检查java进程:

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文件,path为$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设置环境的方法,请参阅:

  • 我在哪里可以设置crontab将使用的环境变量?
  • 如何模拟环境cron执行脚本?
  • 我如何用现有的环境变量运行cron命令?

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

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