我创建了一个脚本来检查我的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" [email protected]
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
答案1
是否有可能 cronjob 内部${JAVA_HOME}
没有设置?
Java 总是需要在环境中设置某些环境变量。也许您在使用 cli 时会自动设置它们,但 cronjob 没有它们。尝试env
在您的 cli 上执行此操作,看看是否有一些与 java 相关的内容${JAVA_HOME}
,如果有,请确保 cronjob 也有它们。例如,将它们添加到脚本的顶部。
答案2
好的...在另一个网站上找到了这个问题的答案,但我想我会在这里添加答案以供将来参考。
问题在于路径!!尽管设置了 java_home,但 java 本身并不在 cron 守护程序的路径中。
快速测试一下你的 cron 有哪些路径可用,添加以下行:
*/2 * * * * env > /usr/home/user1/env.output
据我所知,cron 最初可用的 PATH 非常小。由于 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