Linux服务器编写Shell脚本定时监控Java应用状态以及掉线后的自动重启

发布时间 2023-03-22 21:16:00作者: 安徒生敲代码

1. 编写Shell脚本

#! /bin/sh
export JAVA_HOME=/root/jdk1.8.0_361
export CLASSPATH=.:CLASSPATH:$JAVA_HOME/lib/
export PATH=$PATH:$JAVA_HOME/bin

proc_name=webssh-0.0.1-SNAPSHOT.jar        # 进程名称
boot_cmd="nohup java -jar /root/webssh-0.0.1-SNAPSHOT.jar &" #启动命令
log_file_name=/root/monitor_webssh.log      # 日志文件

num=`ps -ef | grep $proc_name | grep -v grep | wc -l` #获取被监控进程数量
# echo "查询到的进程数量为$num">> $log_file_name
if [ "$num" ==  "0" ];         # 判断进程是否存在
 then
  echo  "进程挂掉了,开始进行重启,重启开始时间为`date`" >> $log_file_name
  `$boot_cmd` # 重启进程的命令
  process_id=`ps -ef | grep $proc_name | grep -v grep | awk '{print $2}'` # 获取新进程号
  echo "进程已重新启动,重启完成时间为`date`,新的进程号为$process_id" >> $log_file_name  # 将新进程号和重启时间记录
 else
  process_id=`ps -ef | grep $proc_name | grep -v grep | awk '{print $2}'` # 获取当前进程号
  echo "进程正在运行中,当前时间为`date`,当前进程号为$process_id" >> $log_file_name
fi

脚本存放路径为:/root/monitor_webssh.sh,根据自己的实际情况自定义

2. 编辑定时器内容,指定Shell脚本的执行频率

crontab -e #执行该命令,会打开定时器的编辑页面
*/1 * * * * /root/monitor_webssh.sh #每分钟执行一次脚本
*/1 * * * * sleep 30; /root/monitor_webssh.sh #每分钟执行一次脚本,执行前休眠30秒

3. 踩坑

最大的一个坑就是使用crontab定时执行Shell脚本中的java -jar启动命令时,需要在Shell脚本文件的顶部执行JDK系统配置的导出操作,也就是如下的部分:

export JAVA_HOME=/root/jdk1.8.0_361
export CLASSPATH=.:CLASSPATH:$JAVA_HOME/lib/
export PATH=$PATH:$JAVA_HOME/bin

没有如上的配置,就无法执行启动命令.这一点比较迷惑,因为在Linux服务器上直接执行java -jar启动命令是可以正常启动的,而且Shell脚本的执行权限全都打开了.

4. 测试

查看日志文件:

手动停止应用程序

再次查看日志文件:

使用命令查看进程信息: