先在指定目录创建一个shell脚本

touch restart.sh

第一种方法,缺点是,这个restart.sh停了,就不会监测了

编辑

#这是针对于一个jar包的自启
#!/bin/bash
source /etc/profile
while true
do
ps -ef | grep "自己的jar包" | grep -v "grep"
if [ "$?" -eq 1 ];then
nohup java -jar 自己的jar包 >catalina.out 2>&1 &
fi
sleep 60
done
#这是针对于多个jar包的自启
#!/bin/bash
source /etc/profile

# 定义一个关联数组,包含所有的 JAR 包名称和对应的密钥
declare -A jar_packages=(
    ["student.jar"]="--mpw.key=1fcb6c790f19f9ex"
    ["rebuild.jar"]=""
)

while true
do
    for package in "${!jar_packages[@]}"
    do
        ps -ef | grep "$package" | grep -v "grep"
        if [ "$?" -eq 1 ]; then
            nohup java -jar "$package" "${jar_packages[$package]}" > "$package.out" &
        fi
    done

    sleep 60
done

给脚本授权

chmod 744 restart.sh

将shell脚本在后台运行起来

nohup ./restart.sh > restart.log &

第二种方法

#!/bin/bash

# JAR包和日志文件存放位置--根据自己的情况修改
dir=/root

# 定义一个数组,包含需要监控的JAR包和对应的密钥
declare -A processes=(
    ["student.jar"]="--mpw.key=1fcb6c790f19f9ex"
    ["rebuild.jar"]=""  
)

# 遍历JAR包数组
for process in "${!processes[@]}"
do
    # 查看JAR包运行进程的PID
    pid=$(ps -ef | grep "$dir/$process" | grep 'java' | grep -v grep | awk '{print $2}')

    # 如果进程不存在,重启JAR包服务
    if [ -z "$pid" ]; then
        # 从关联数组中获取对应的密钥
        key="${processes[$process]}"
        if [ -n "$key" ]; then
            # 使用密钥启动JAR包
            source /etc/profile
            nohup java -jar "$dir/$process" "$key" >> "$dir/$process.out" &
        else 
            # 不使用密钥启动JAR包
            source /etc/profile
            nohup java -jar "$dir/$process" >> "$dir/$process.out" &
        fi
        echo $(date +"%Y-%m-%d %T") "__程序 $process 宕机,自动重启" >> "$dir/info.log"
    fi
done

写入定时任务

crontab -e
#在定时任务中设定任务,5分钟检查一次
*/5 * * * * sh /xxx/xxx/restart.sh

 

posted on 2023-06-27 15:42  twm7512  阅读(1199)  评论(0编辑  收藏  举报