记录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}

相关推荐
庸子1 分钟前
基于Jenkins和Kubernetes构建DevOps自动化运维管理平台
运维·kubernetes·jenkins
眠修24 分钟前
Kuberrnetes 服务发布
linux·运维·服务器
好奇的菜鸟1 小时前
Docker 配置项详解与示例
运维·docker·容器
xcs194052 小时前
集运维 麒麟桌面版v10 sp1 2403 aarch64 离线java开发环境自动化安装
运维·自动化
BAOYUCompany2 小时前
暴雨服务器成功中标华中科技大学集成电路学院服务器采购项目
运维·服务器
超龄超能程序猿2 小时前
Bitvisse SSH Client 安装配置文档
运维·ssh·github
奈斯ing3 小时前
【Redis篇】数据库架构演进中Redis缓存的技术必然性—高并发场景下穿透、击穿、雪崩的体系化解决方案
运维·redis·缓存·数据库架构
鳄鱼皮坡3 小时前
仿muduo库One Thread One Loop式主从Reactor模型实现高并发服务器
运维·服务器
即将头秃的程序媛3 小时前
centos 7.9安装tomcat,并实现开机自启
linux·运维·centos
fangeqin3 小时前
ubuntu源码安装python3.13遇到Could not build the ssl module!解决方法
linux·python·ubuntu·openssl