【问题标题】:check if process is running linux shell not working检查进程是否正在运行 linux shell 不工作
【发布时间】:2013-04-22 17:07:51
【问题描述】:

我有一个需要始终运行的 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 文件,路径为$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

【问题讨论】:

  • 我怀疑调用mytest.sh时路径不对;您没有找到源文件。确保在你的 shell 脚本中明确设置了必要的环境变量。
  • 我有文件要在这个路径 /root/folder 中运行。我已经给出了 cd /root/folder .,在那个 cron 中给出 cd 命令有什么问题
  • 它是否具有运行可执行文件的正确权限? Cron 以什么用户身份运行?我会阅读@spaceknarf 发布的链接——它们的标题看起来很有前途。
  • 是的,它有适当的权限
  • 与其玩弄ps,不如在/var/run下维护一个.pid文件。要编写可靠的守护进程,您可以尝试 [commons.apache.org/proper/commons-daemon/] 和/或 [commons.apache.org/proper/commons-daemon/jsvc.html]

标签: java linux shell


【解决方案1】:

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

cron中设置环境的方法见:

【讨论】:

  • 但在 mytest.sh 文件本身的路径为 $JAVA_HOME/bin/java -cp .:/root/lib/* -Djava.rmi.server.codebase=file:/root/文件夹/ -Djava.rmi.server.hostname=hostnameip -Djava.security.policy=server.policy -Xmx512m -Xms512m mytest.mytestprog
  • 你可以用 Java 创建一个测试程序,打印它的类路径,看看它在 cron 的内部和外部是否不同。
【解决方案2】:

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

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

【讨论】:

  • 确实如此,但可能不是他的问题的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
  • 2013-07-21
相关资源
最近更新 更多