当前位置: 首页 > news >正文

linux系统之jar启动脚本

编辑linux启动脚本

  执行 vi run_blog 按i 进入编辑,复制以下代码,并根据当前环境修改三个参数。以下是详细完整脚本代码:

#!/bin/bash# 配置部分
JAR_PATH="/path/to/your/app.jar"             # 替换为你的 JAR 文件的实际路径
LOG_FILE="/var/log/app.log"                  # 日志文件路径
JAVA_OPTS="-Xms512m -Xmx1024m"               # Java 启动参数,可根据需要调整# 获取应用的 PID
get_pid() {# 使用 pgrep 查找运行指定 JAR 的 Java 进程pgrep -f "java .* -jar $JAR_PATH"
}# 启动函数
start() {PID=$(get_pid)if [ -n "$PID" ]; thenecho "应用已在运行,PID=$PID"exit 1fiecho "启动应用..."nohup java $JAVA_OPTS -jar "$JAR_PATH" > "$LOG_FILE" 2>&1 &sleep 1  # 确保进程有时间启动PID=$(get_pid)if [ -n "$PID" ]; thenecho "应用已启动,PID=$PID"elseecho "启动失败,请检查日志文件:$LOG_FILE"exit 1fi
}# 停止函数
stop() {PID=$(get_pid)if [ -z "$PID" ]; thenecho "应用未运行"exit 1fiecho "停止应用,PID=$PID"kill $PID# 等待进程结束for i in {1..10}; doif ! ps -p $PID > /dev/null 2>&1; thenbreakfisleep 1doneif ps -p $PID > /dev/null 2>&1; thenecho "进程未正常停止,强制杀死进程"kill -9 $PIDfiecho "应用已停止"
}# 重启函数
restart() {stopstart
}# 状态检查函数
status() {PID=$(get_pid)if [ -n "$PID" ]; thenecho "应用正在运行,PID=$PID"exit 0elseecho "应用未运行"exit 1fi
}# 主逻辑,根据传入的参数执行相应的函数
case "$1" instart)start;;stop)stop;;restart)restart;;status)status;;*)echo "用法: $0 {start|stop|restart|status}"exit 1;;
esac
使用说明
  1. 配置脚本

    • 修改 JAR_PATH:将 /path/to/your/app.jar 替换为你的 JAR 文件的实际路径,例如 /home/user/myapp/app.jar
    • 修改 LOG_FILE:设置日志文件的路径,例如 /var/log/app.log
    • 调整 JAVA_OPTS:根据需要调整 Java 启动参数,例如内存设置等。
  2. 赋予执行权限

chmod +x app_control.sh

使用脚本

  • 启动应用

    ./run_blog.sh start
  • 停止应用

    ./run_blog.sh stop
  • 重启应用

    ./run_blog.sh restart
  • 检查应用状态

    ./run_blog.sh status
详细说明
  • 获取 PID

    脚本通过 pgrep -f "java .* -jar $JAR_PATH" 来查找运行指定 JAR 文件的 Java 进程。这种方法避免了使用 PID 文件,确保脚本能够准确定位到对应的进程。

  • 启动应用

    使用 nohup& 将应用在后台运行,并将输出重定向到指定的日志文件。启动后,脚本会等待一秒钟以确保进程已启动,并再次检查 PID。

  • 停止应用

    脚本首先查找应用的 PID,然后发送 SIGTERM 信号请求进程优雅退出。如果进程在 10 秒内未停止,脚本将发送 SIGKILL 信号强制终止进程。

  • 状态检查

    通过检查 PID 是否存在,判断应用是否正在运行,并输出相应的信息。

执行脚本如下图: 

 

自动启动(可选)

如果希望应用在系统启动时自动运行,可以将脚本添加到 systemd 服务中。以下是创建 systemd 服务单元文件的步骤:

  1. 创建服务单元文件

    创建一个 app.service 文件在 /etc/systemd/system/ 目录下:

    [Unit]
    Description=My Java Application
    After=network.target[Service]
    User=your_username
    ExecStart=/path/to/app_control.sh start
    ExecStop=/path/to/app_control.sh stop
    Restart=always[Install]
    WantedBy=multi-user.target
    

    注意

  •  将 your_username 替换为运行应用的实际用户名。
  • /path/to/app_control.sh 替换为脚本的实际路径。

启用并启动服务

sudo systemctl daemon-reload
sudo systemctl enable app.service
sudo systemctl start app.service
  1. 管理服务

    使用 systemctl 命令来管理应用:

    • 查看状态

      sudo systemctl status app.service
    • 停止服务

      sudo systemctl stop app.service
    • 重启服务

      sudo systemctl restart app.service

日志查看

应用的输出被重定向到指定的日志文件。你可以使用以下命令实时查看日志:

tail -f /var/log/app.log

注意事项

  • 权限问题:确保脚本和日志文件的路径对运行脚本的用户具有适当的读写权限。如果选择将日志文件存放在 /var/log,可能需要使用 sudo 或调整权限。
  • 唯一性:如果服务器上有多个相同 JAR 文件运行,pgrep 可能会匹配多个进程。确保 JAR_PATH 唯一,或者根据需要调整 pgrep 的匹配模式。
  • 安全性:确保脚本的执行权限和文件权限设置合理,避免未经授权的用户修改或执行脚本。
http://www.lryc.cn/news/463085.html

相关文章:

  • 简单认识Maven 2-Maven坐标
  • Xilinx UltraScale系列FPGA纯verilog图像缩放,工程项目解决方案,提供2套工程源码和技术支持
  • React(二) JSX中的this绑定问题;事件对象参数传递;条件渲染;列表渲染;JSX本质;购物车案例
  • 前端开发攻略---取消已经发出但是还未响应的网络请求
  • 韩信走马分油c++
  • 【Linux】Anaconda下载安装配置Pytorch安装配置(保姆级)
  • 渗透测试导论
  • 鸿蒙学习笔记--搭建开发环境及Hello World
  • 【ArcGIS风暴】ArcGIS字段计算器公式汇总
  • 探索秘境:如何使用智能体插件打造专属的小众旅游助手『小众旅游探险家』
  • 机械臂力控方法概述(一)
  • 1971. 寻找图中是否存在路径
  • FLINK SQL语法(1)
  • 【Fargo】1:基于libuv的udp收发程序
  • WebSocket介绍和入门案例
  • k8s集群版本升级
  • XML 和 SimpleXML 简介
  • MySQL 中 LIKE 语句的 `%` 和 `_` 以及 BLOB 和 TEXT 的详细解析和案例示范
  • git clone卡在Receiving objects
  • vue+ant 弹窗可以拖动
  • (42)MATLAB中使用fftshift绘制以零为中心的功率谱
  • Windows本地部署中文羊驼模型(Chinese-Alpaca-Pro-7B)(通俗易懂版)
  • Web3的挑战与机遇:技术发展的现状分析
  • LangGraph - Hierarchical Agent Teams
  • 2021-04-14 proteus中仿真时74HC245三态双向端口扩展输出
  • 解决UNSPSC商品分类的层级不足的方法
  • Pytest基于fixture的参数化及解决乱码问题
  • 使用excel.js(layui-excel)进行layui多级表头导出,根据单元格内容设置背景颜色,并将导出函数添加到toolbar
  • Mysql 5.7 安装与卸载(非常详细)
  • 030 elasticsearch查询、聚合