Linux配置JAR包为服务实现自启动

本文详细描述了如何编写一个bash脚本来控制jar程序的启动和停止,以及如何将其集成到systemd服务中以实现自动管理和自启动。脚本涉及PID文件管理、服务状态检查和异常处理。
摘要由CSDN通过智能技术生成

一、实现bash脚本

1.1 绘图工具

绘图需安装idea的插件plantUML-Integration

只需要上图一个就可以,别的也不需要装。

启动服务的逻辑如下

关闭服务的逻辑如下

1.2 逻辑实现

在/root路径下创建entrance文件,实现逻辑如下

#!/usr/bin/env bash
# 2>&1的含义
# 1表示标准输出
# 2表示标准错误输出
# 2>&1表示将标准错误输出重定向到标准输出

# 配置jar程序的pid保存文件
jar_pid=/root/jar_pid
# 配置jar的绝对路径
jar=/root/http-proxy-boot.jar

if [ "$1" = "start" ]; then
    # 如果jar_pid文件存在
    if [ -f "$jar_pid" ]; then
        # 如果jar_pid文件有值
        if [ -s "$jar_pid" ]; then
            echo "Existing PID file found during start."
            # 如果jar_pid文件可读
            if [ -r "$jar_pid" ]; then
                PID=`cat "$jar_pid"`
                # 与直接执行命令相比, 这样可以抑制输出
                ps -p $PID >/dev/null 2>&1
                # 等于0
                if [ $? -eq 0 ] ; then
                    echo "$jar appears to still be running with PID $PID. Start aborted."
                    echo "If the following process is not a $jar process, remove the PID file and try again:"
                    ps -f -p $PID
                    exit 1
                else
                    echo "Removing/clearing stale PID file."
                    # 与直接执行命令相比, 这样可以抑制输出
                    rm -f "$jar_pid" >/dev/null 2>&1
                    if [ $? != 0 ]; then
                        # 可写权限
                        if [ -w "$jar_pid" ]; then
                            cat /dev/null > "$jar_pid"
                        else
                            echo "Unable to remove or clear stale PID file. Start aborted."
                            exit 1
                        fi
                    fi
                fi
            else
                echo "Unable to read PID file. Start aborted."
                exit 1
            fi
        else
            rm -f "$jar_pid" >/dev/null 2>&1
            if [ $? != 0 ]; then
                if [ ! -w "$jar_pid" ]; then
                    echo "Unable to remove or write to empty PID file. Start aborted."
                    exit 1
                fi
            fi
        fi
    fi
    # 将命令行参数往前移一个. 比如sh test.sh 1 2, 在shift前, $1=1 $2=2, 在shift后, $1=2
    shift
    # eval是将字符串解析为命令执行,如 eval "ls -l"就相当于直接运行性ls -l
    eval "nohup java -jar \$jar >/dev/null 2>&1 &"
    # 将pid写入到jar_pid文件中
    echo $! > "$jar_pid"
    echo "$jar started."
elif [ "$1" = "stop" ]; then
    sleep=5
    # 当force为1时, 执行kill -9
    force=0
    shift
    # 若文件存在
    if [ -f "$jar_pid" ]; then
        # 若jar_pid有值
        if [ -s "$jar_pid" ]; then
            # kill -0不影响进程执行,而是检查进程是否正在运行
            kill -0 `cat "$jar_pid"` >/dev/null 2>&1
            # 如果大于0表示异常
            if [ $? -gt 0 ]; then
              echo "PID file found but either no matching process was found or the current user does not have permission to stop the process. Stop aborted."
              exit 1
            fi
        else
            echo "PID file is empty and has been ignored."
        fi
    else
      echo "$jar_pid was set but the specified file does not exist. Is $jar running? Stop aborted."
      exit 1
    fi
    # 与直接kill -15相比, 这样可以抑制输出
    kill -15 `cat "$jar_pid"` >/dev/null 2>&1
    if [ -f "$jar_pid" ]; then
        while [ $sleep -ge 0 ]; do
            # kill -0不影响进程执行,而是检查进程是否正在运行
            kill -0 `cat "$jar_pid"` >/dev/null 2>&1
            # 如果大于0表示异常, 表示进程已被关闭
            if [ $? -gt 0 ]; then
                rm -f "$jar_pid" >/dev/null 2>&1
                # 如果删除失败
                if [ $? != 0 ]; then
                    if [ -w "$jar_pid" ]; then
                        cat /dev/null > "$jar_pid"
                        force=0
                    else
                        echo "The PID file could not be removed or cleared."
                    fi
                fi
                echo "$jar stopped."
                break
            fi
            if [ $sleep -gt 0 ]; then
                sleep 1
            fi
            if [ $sleep -eq 0 ]; then
              echo "$jar did not stop in time."
              if [ $force -eq 0 ]; then
                echo "PID file was not removed."
              fi
              echo "To aid diagnostics a thread dump has been written to standard out."
              # kill -3 与 kill -15 类似, 只是kill -3 会多了一步生成核心存储,用于后续调试。kill -3适用于程序无响应时
              kill -3 `cat "$jar_pid"`
            fi
            # 自减
            sleep=`expr $sleep - 1`
        done
    fi
    KILL_SLEEP_INTERVAL=5
    if [ $force -eq 1 ]; then
        if [ -f "$jar_pid" ]; then
            PID=`cat "$jar_pid"`
            echo "Killing $jar with the PID: $PID"
            kill -9 $PID
            while [ $KILL_SLEEP_INTERVAL -ge 0 ]; do
                kill -0 `cat "$jar_pid"` >/dev/null 2>&1
                if [ $? -gt 0 ]; then
                    rm -f "$jar_pid" >/dev/null 2>&1
                    if [ $? != 0 ]; then
                        if [ -w "$jar_pid" ]; then
                            cat /dev/null > "$jar_pid"
                        else
                            echo "The PID file could not be removed."
                        fi
                    fi
                    echo "The $jar process has been killed."
                    break
                fi
                if [ $KILL_SLEEP_INTERVAL -gt 0 ]; then
                    sleep 1
                fi
                KILL_SLEEP_INTERVAL=`expr $KILL_SLEEP_INTERVAL - 1 `
            done
            if [ $KILL_SLEEP_INTERVAL -lt 0 ]; then
                echo "$jar has not been killed completely yet. The process might be waiting on some system call or might be UNINTERRUPTIBLE."
            fi
        fi
    fi
else
    echo "commands:"
    echo " start      Start jar"
    echo " stop       Stop jar"
fi

启动和关闭命令如下

sh /root/entrance start
sh /root/entrance stop

二、配置systemd服务

使用systemd的好处时,他由系统管理,统一的管理命令,而且可以支持自启动等操作。

延用上面的bash脚本,创建systemd服务

cat > /usr/lib/systemd/system/http-proxy-boot.service <<EOF
[Unit]
Description=http-proxy-boot
After=network.target
[Service]
Type=forking
# restart时, 先执行ExecStop, 再执行ExecStart
ExecStart=/root/entrance start
ExecStop=/root/entrance stop
PrivateTmp=true
# kill按理说,应该返回状态0,但是java比较特殊,返回的是143
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
EOF

之后就可以进行操作啦

systemctl start|stop|restart|enable|disable http-proxy-boot

三、参考致谢

如何在统信UOS系统中设置tomcat开机启动_统信uos系统部署tomcat-CSDN博客

tomcat/bin/catalina.sh at main · apache/tomcat

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值