2013-04-29 5 views
2

У меня есть процесс java, который должен быть всегда запущен. Я написал следующую оболочку в программе хрон, чтобы проверить, что процесс 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, который должен быть запущен.

Когда я выполняю файл оболочки отдельно, он выполняется хорошо. Но когда я выполняю вышеуказанный 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) 

Где я иду не так.

Edit:

я запускаю файл 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' путь неправильный; вы не находите исходный файл. Убедитесь, что необходимые переменные среды заданы явно внутри вашего сценария оболочки. – Floris

+0

У меня есть файл для запуска в этом пути /root/folder.And я дал cd/root/folder. Есть ли что-то неправильное в предоставлении команды cd в этом cron – ashu

+0

Имеет ли он правильные разрешения для запуска ваших исполняемых файлов ? Cron работает как пользователь? Я бы прочитал ссылки, которые опубликовал @spaceknarf - их названия выглядят очень многообещающими. – Floris

ответ

1

Когда задание выполняется в 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

+1

Вы можете создать тестовую программу на Java, которая печатает свой путь класса, и посмотреть, не отличается ли она внутри и снаружи 'cron'. –

1

Вместо запуска такого длинного списка централизованных команд я предложил бы использовать pgrep:

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

Это правда, но, вероятно, не причина его проблемы. –

Смежные вопросы