需求描述:
设计一个脚本,通过Linux定时任务,每分钟执行一次,监控jar包进程是否存在,存在则不做动作,不存在则重新拉起jar包程序。
定时任务配置:
*/1 * * * * bash -x /root/myfile/jars/check_status_job.sh
脚本内容:
#!/bin/env bash
#重新加载环境变量,解决java命令不存在的问题。
. /etc/profile
val="springboot-8053.jar";
ids=`ps -ef | grep "$val" | grep -v "grep" | awk '{print $2}'`;
echo $ids;
if [[ -z $ids ]];then
echo "进程不存在,已被重新拉起!";
nohup java -jar -Xmx256m -Xms256m /root/myfile/jars/$val > /root/myfile/jars/default.out 2>&1 &
nohup java -jar -Xmx256m -Xms256m /root/myfile/jarsxxxx/$val > /root/myfile/jarsxxxx/default.out 2>&1 &
else
echo "进程存在,无须拉起!";
fi
通过以上配置,就可以实现需求。
遇到的问题及排查过程:
1、java命令不存在问题
排查:
首先,确认自己是root账号配置的cron,并且,执行了命令检查java是否存在
发现是存在的,java环境变量也是配置了的。
郁闷了,那为什么cron会无法识别到了?
于是,请教了大佬,排查过程如下:
首先,这个问题的本质是,cron执行shell脚本时,环境变量没加载,cron会清空环境。
通过一下命令排查:
cat ~/.bashrc
cat ~/.bash_profile
which java
grep -r jdk /etc/profile*
以上命令执行结果截图:
从而确定,是cron没有读取到自己配置的java环境变量。
于是,在脚本最开始,加载一下环境变量,解决该问题。
#重新加载配置的环境变量
. /etc/profile
2、程序日志输出到default的问题。
输出到日志的方法有很多种,大致思路就是,nohup重定向到default文件。
类似命令:
nohup java -jar -Xmx256m -Xms256m /root/myfile/jars/springboot.jar > default.out 2>&1 &
但是,我的cron命令是:
bash -x /root/myfile/jars/check_status_job.sh
这样,可以看到shell脚本的运行步骤,方便排查脚本问题。
于是日志输出如下:
你会发现, > 重定向后的部分,没有构建到命令里。
这让初学者的我,傻眼了,我以为,日志打印的命令没构建全,那么,default肯定没法生成。
然后去脚本目录/root/myfile/jars/
查看default.out文件,也确实没创建。
于是,我错误的认为,命令构建出错,导致default.out没能生成。
排查:
召唤大佬:
1、default 默认生成在 /root 下
2、ls ~root 查看该目录下的文件有哪些
3、想要指定目录,就加绝对路径
发现,确实生成了default.out日志文件。
于是,重新构建我的nohup启动命令:
nohup java -jar -Xmx256m -Xms256m /root/myfile/jars/$val > /root/myfile/jarsxxxx/default.out 2>&1 &
这样,就可以在我指定的目录中生成日志文件了。
另外这里是覆盖重定向>
,这样,每次重启后,default.out都是重新覆盖。从而,保证日志不会无限扩大。并且,shell脚本的日志,不会输出到default.out中。
补充:
另外一种日志输出的方法是,通过cron配置,把脚本日志全部输出到default.out里面
命令如下:
*/1 * * * * bash -x /root/myfile/jars/check_status_job.sh >> /root/myfile/jars/default.out
这个办法不太好,会把shell脚本的日志和jar程序的日志都输出到default.out中,另外,这里只能用追加重定向>>
,会导致日志文件无限扩大,不方便排查。