2

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

wheremytest.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

4

2 回答 2

1

当作业在 中执行时cron,它具有不同的环境。很可能,您.bashrc的未加载。并且通常CLASSPATH在该文件中设置。因此,CLASSPATH可能是不正确的。

有关在 中设置环境的方法cron,请参见:

于 2013-04-29T05:35:18.187 回答
1

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

[ $(pgrep -f testjava) ] &&  && echo "running"
于 2013-04-29T05:40:05.830 回答