Я создал сценарий, чтобы проверить, работает ли мой сервер Glassfish, если это не так, он пытается убить Java-процесс, чтобы убедиться, что он не завис, а затем выдает начальный домен asadmin команда
Если этот сценарий запускается из командной строки, он успешен в 100% случаев. Когда он запускается из вкладки cron, выполняется каждая строка, но начальный домен asadmin строка не выполняется или, по крайней мере, не завершается, то есть сервер не работает после запуска этого сценария.
Для тех, кто не знаком с glassfish или утилитой asadmin, используемой для запуска сервера, я понимаю, что используется разветвленный процесс. могло ли это вызвать проблемы через cron?
Опять же, во всех моих сегодняшних тестах сценарий выполняется до завершения при запуске из командной строки. После выполнения через cron он не завершается.
заранее спасибо за любую помощь ... я выдергиваю волосы, пытаясь сделать эту работу!
#!/bin/bash
timevar=`date +%d-%m-%Y_%H.%M.%S`
process_name='java'
get_contents=`cat urls.txt`
for i in $get_contents
do
echo checking $i
statuscode=$(curl --connect-timeout 10 --write-out %{http_code} --silent --output /dev/null $i)
case $statuscode in
200)
echo "$timevar $i $statuscode okay" >> /usr/home/user1/logfile.txt
;;
*)
echo "$timevar $i $statuscode bad" >> /usr/home/user1/logfile.txt
echo "Status $statuscode found" | mail -s "Check of $i failed" some.address@mail.com
process_id=`ps acx | grep -i $process_name | awk {'print $1'}`
if [ -z "$process_id" ]
then
echo "java wasn't found in the process list"
else
echo "Killing java, currently process $process_id"
kill -9 $process_id
fi
/usr/home/user1/glassfish3/bin/asadmin start-domain domain1
;;
esac
done
Кроме того, для полноты, вот запись на вкладке cron:
*/2 * * * * /usr/home/user1/server.check.sh >> /usr/home/user1/cron.log
Возможно ли, что внутри cronjob ${JAVA_HOME}
не установлен?
Java всегда требует, чтобы в среде были установлены определенные переменные среды. Возможно, вы устанавливаете их автоматически, когда используете cli, но у cronjob их нет. Стараться сделать env
на вашем клиенте, чтобы узнать, есть ли что-то, связанное с Java, например ${JAVA_HOME}
и если да, убедитесь, что они также есть в cronjob. Например, добавив их в начало вашего скрипта.
Хорошо ... нашел ответ на этот вопрос на другом сайте, но я подумал, что добавлю ответ сюда для дальнейшего использования.
Проблема была в том, что путь !! несмотря на то, что java_home был установлен, сама java не была на пути для демона cron.
Чтобы быстро проверить, какой путь доступен вашему cron, добавьте эту строку:
*/2 * * * * env > /usr/home/user1/env.output
Насколько я могу судить, PATH, изначально доступный для cron, довольно минимален. Поскольку java находился в / usr / local / bin, я добавил это в путь прямо в crontab и kaboom! это сработало!
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
*/2 * * * * /usr/home/user1/server.check.sh >> /usr/home/user1/cron.log