记录jvm进程号

日常开发中,相信大家会经常用到这么一行命令:

复制代码
ps -ef | grep xxx.jar | grep -v grep | awk '{print $2}' | xargs -r kill -9

就是杀掉xxx相关的进程,然后启动,当然也还有其他的方式可以实现类似的功能,我就不列举了,另外呢,现在很多公司可能也都把项目上云了,大部分情况都不需要自己写脚本重启服务,这个命令中在kill前面的一大串其实就是获取xxx.jar这个服务的jvm进程号,然后传递给kill -9命令,那么除了这种方式,还有没有其他办法获取到jvm进程号呢,下面就我知道的分享一下,不喜勿喷

第一种,通过java代码获取,获取到之后,不管是输出到文件还是输出到控制台都可以,当然是建议输出到文件了,代码如下

复制代码
public class MyJvm {
    public static void main(String[] args) {
        String jvmName = ManagementFactory.getRuntimeMXBean().getName();
        int pid = Integer.parseInt(jvmName.split("@")[0]);
        System.err.println("当前jvm进程PID: " + pid);
        try {
            java.io.FileWriter fw = new java.io.FileWriter("myjvm.pid");
            fw.write(pid + "");
            fw.flush();
            fw.close();
        } catch (java.io.IOException e) {
            e.printStackTrace();
        }
    }
}

第二种,就是logback日志中获取,现在大部分的javaweb项目应该基本上都是用springboot构建,springboot默认采用logback日志记录日志,里面内置了变量可以直接获取进程号,关键代码如下:

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<property name="log.pattern" value="[PID=${PID}]%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n" />

	<!-- 控制台输出 -->
	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>${log.pattern}</pattern>
		</encoder>
	</appender>
	<root level="info">
		<appender-ref ref="console" />
	</root>
</configuration>

@SpringBootApplication
public class LogjvmApplication {

    private static final org.slf4j.Logger LOGGER = org.slf4j.LoggerFactory.getLogger(LogjvmApplication.class);

    public static void main(String[] args) {
        String jvmName = ManagementFactory.getRuntimeMXBean().getName();
        int pid = Integer.parseInt(jvmName.split("@")[0]);
        LOGGER.info("当前系统进程号:" + pid);
        SpringApplication.run(LogjvmApplication.class, args);
    }

}

第三种,通过MDC设置进程编号变量:

复制代码
@SpringBootApplication
public class LogjvmApplication {

    private static final org.slf4j.Logger LOGGER = org.slf4j.LoggerFactory.getLogger(LogjvmApplication.class);

    public static void main(String[] args) {
        String jvmName = ManagementFactory.getRuntimeMXBean().getName();
        int pid = Integer.parseInt(jvmName.split("@")[0]);
        LOGGER.info("当前系统进程号:" + pid);
        // 将 PID 放入 MDC
        MDC.put("pid", pid + "");
        SpringApplication.run(LogjvmApplication.class, args);
        try {
            java.io.FileWriter fw = new java.io.FileWriter("logjvm_pid");
            fw.write(pid + "");
            fw.flush();
            fw.close();
        } catch (java.io.IOException e) {
            LOGGER.error("写入文件失败", e);
        }
    }

}

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<property name="log.pattern" value="[PID=%X{pid}]%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n" />

	<!-- 控制台输出 -->
	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>${log.pattern}</pattern>
		</encoder>
	</appender>
	<root level="info">
		<appender-ref ref="console" />
	</root>
</configuration>

与第二种不同的是在logback日志中获取进程号的表达式不一样:PID=%X{pid}

相关推荐
_下雨天.4 小时前
LVS负载均衡
服务器·负载均衡·lvs
小成202303202657 小时前
Linux高级02
linux·开发语言
mounter6257 小时前
【硬核前沿】CXL 深度解析:重塑数据中心架构的“高速公路”,Linux 内核如何应对挑战?-- CXL 协议详解与 LSF/MM 最新动态
linux·服务器·网络·架构·kernel
++==7 小时前
Linux 进程间通信与线程同步技术详解:IPC 机制、线程 API、同步工具与经典同步问题
linux
特长腿特长7 小时前
centos、ubantu系列机的用户和用户组的结构是什么?具体怎么配置?用户组权限怎么使用?这篇文章持续更新,帮助你复习linux的基础知识
linux·运维·centos
zzzyyy5387 小时前
Linux环境变量
linux·运维·服务器
pluvium278 小时前
记对 xonsh shell 的使用, 脚本编写, 迁移及调优
linux·python·shell·xonsh
无级程序员8 小时前
centos7 安装 llvm-toolset-7-clang出错的问题解决
linux·centos
kebeiovo8 小时前
atomic原子操作实现无锁队列
服务器·c++
赛博云推-Twitter热门霸屏工具9 小时前
Twitter运营完整流程:从0到引流获客全流程拆解(2026)
运维·安全·自动化·媒体·twitter