Linux重启Java进程的.sh脚本详解


前言

最近看到了项目中重启Java服务的.sh文件,对sh文件里面的命令产生了好奇,于是研究了一下脚本里面每一个命令的具体意义


一、.sh文件内容

.sh文件里面的内容如下:

ps-ef | grep plugins-web | grep -v grep | awk '{print "kill -9" $2}' | sh nohup java -javaagent:/apps/aaagent/apm-javaagent.jar -jar ./RESOURCE_NAME7--
appllo.env=sit--appllo.accesskey = 1111--appllo.bootstrap.namespaces=RDSystem.application  >.nohup-plugs.out 2>&1 &

这个脚本命令很长,具体的含义如下
1、ps -ef: 这个命令会列出所有正在运行的进程。

2、grep plugins-web: 这个命令会在上一步的输出结果中,查找包含 “plugins-web” 的进程。

3、grep -v grep: 这个命令会过滤掉上一步输出结果中包含 “grep” 的行,以防止误杀其他进程。

4、awk ‘{print “kill -9” $2}’: 这个命令会使用 awk 工具从上一步输出的进程信息中提取出进程的 PID(进程ID),并生成一个 kill 命令,以杀死该进程。其中 $2 表示第二个字段,即进程的 PID。

5、sh: 这个命令会将上一步生成的 kill 命令传递给 shell 执行。

6、nohup java -javaagent:/apps/aaagent/apm-javaagent.jar -jar ./RESOURCE_NAME7–appllo.env=sit–appllo.accesskey=1111–appllo.bootstrap.namespaces=RDSystem.application >.nohup-plugs.out 2>&1 &:这个命令会启动一个新的 Java 进程。其中:

6.1 nohup: 这个命令会使进程忽略挂起信号(SIGHUP),并将标准输出和标准错误输出重定向到文件 “.nohup-plugs.out” 中。这意味着即使用户退出了当前会话,该进程也会继续运行。

扫描二维码关注公众号,回复: 15423693 查看本文章

6.2 java: 这个命令会启动 Java 虚拟机。

6.3 -javaagent:/apps/aaagent/apm-javaagent.jar: 这个选项会指定 Java 应用程序监控代理的路径。

6.4 -jar ./RESOURCE_NAME7–appllo.env=sit–appllo.accesskey=1111–appllo.bootstrap.namespaces=RDSystem.application: 这个选项会指定要运行的 Java 应用程序的 JAR 文件和应用程序参数。

6.5 >.nohup-plugs.out 2>&1 &: 这个命令会将标准输出和标准错误输出重定向到文件 “.nohup-plugs.out” 中,并使进程在后台运行。

-javaagent的含义

-javaagent 是 Java 虚拟机启动参数之一,它用于指定一个 Java 应用程序监控代理(Java Agent)。Java Agent 是一个特殊的 Java 应用程序,它能够在 JVM 运行期间与应用程序一起运行,并可以访问和修改 JVM 的内部状态。Java Agent 可以用于实现各种功能,如性能分析、代码注入、错误监控、安全检查等。

使用 -javaagent 参数启动 Java 应用程序时,Java 虚拟机会在启动时加载指定的 Java Agent,并调用它的 premain 方法。premain 方法是 Java Agent 的入口方法,它可以用于初始化 Java Agent,注册钩子函数(Hook Function),或者在 JVM 启动时执行一些操作。当 Java 应用程序结束时,Java 虚拟机会调用 Java Agent 的 agentmain 方法,该方法可以用于执行一些清理操作或者监视应用程序运行期间的状态。

通常情况下,使用 Java Agent 可以帮助开发人员更好地了解和优化 Java 应用程序的性能,识别潜在的问题和瓶颈,并提供一些高级的功能和服务。在实际使用中,Java Agent 通常作为第三方库或工具的一部分提供,例如 Java 应用程序性能分析工具、代码注入框架、错误监控系统等。

二、自己编写重启Java进程的脚本

编写重启Java项目的Shell脚本,需要考虑以下几个方面:
1、检查Java进程是否存在,如果存在则需要杀掉进程。

2、检查日志文件是否存在,如果存在则需要备份。

3、启动Java进程。

4、检查Java进程是否启动成功,如果没有则需要进行相应处理。

示例

#!/bin/bash

# 定义Java进程的名称
APP_NAME=your-app-name.jar

# 定义Java进程的日志文件路径
LOG_PATH=/var/log/your-app-name.log

# 定义备份日志文件的目录
BACKUP_DIR=/var/log/backup

# 定义Java进程的启动参数
JAVA_OPTS="-Xmx1024m -Xms1024m -XX:MaxPermSize=256m"

# 检查Java进程是否存在
PID=$(ps -ef | grep ${APP_NAME} | grep -v grep | awk '{print $2}')
if [[ -n ${PID} ]]; then
  echo "Java process is running, PID is ${PID}. Killing..."
  kill -9 ${PID}
fi

# 检查日志文件是否存在
if [[ -f ${LOG_PATH} ]]; then
  echo "Log file exists. Backing up..."
  if [[ ! -d ${BACKUP_DIR} ]]; then
    mkdir ${BACKUP_DIR}
  fi
  cp ${LOG_PATH} ${BACKUP_DIR}/$(date +%Y%m%d%H%M%S).log
  echo "Log file backed up to ${BACKUP_DIR}."
fi

# 启动Java进程
nohup java ${JAVA_OPTS} -jar ${APP_NAME} > ${LOG_PATH} 2>&1 &

# 检查Java进程是否启动成功
sleep 10
PID=$(ps -ef | grep ${APP_NAME} | grep -v grep | awk '{print $2}')
if [[ -n ${PID} ]]; then
  echo "Java process started successfully, PID is ${PID}."
else
  echo "Failed to start Java process."
fi

该脚本中的APP_NAME、LOG_PATH和BACKUP_DIR需要根据实际情况进行修改。JAVA_OPTS可以根据需要添加或修改Java进程的启动参数。

总结

本篇博客介绍重启java进程的脚本以及如何编写重启Java项目的Shell脚本。

猜你喜欢

转载自blog.csdn.net/weixin_44821965/article/details/130039771