如何根据固定名称片段获取动态命名的Java进程PID?
解决Java进程PID动态获取问题
我来帮你搞定这个问题~你之前的命令返回空,核心原因是你用$NF匹配"backend",但$NF指的是命令行的最后一个参数,看你的进程命令:
testuser 37126 1 0 2018 ? 01:56:24 java -jar backend76465465.jar -XX:-OmitStackTraceInFastThrow --spring.profiles.active=server
最后一个参数是--spring.profiles.active=server,根本不是包含"backend"的jar文件名,所以匹配自然失败。
给你几个靠谱的解决方案:
方案1:遍历所有字段匹配(最通用)
这个方法会检查进程命令行的每一个字段,只要找到包含"backend"的字段就输出PID:
ps -eaf | awk '/java/ {for(i=1;i<=NF;i++) if($i ~ /backend/) print $2}'
/java/先过滤出Java进程,避免无关进程干扰- 遍历每个字段
i,找到匹配backend的字段后,输出第2个字段(也就是PID)
方案2:精准定位jar文件所在字段
观察你的命令行,backendxxxx.jar是在java -jar之后的那个字段,对应命令行的倒数第3个字段(NF-2),可以直接定位匹配:
ps -eaf | awk '/java/ && $(NF-2) ~ /backend/ {print $2}'
方案3:用pgrep简化操作(最简洁)
pgrep命令支持直接匹配整个命令行内容,用-f选项就能轻松搞定:
pgrep -f "backend"
这个命令会直接返回所有命令行包含"backend"的进程PID,不需要额外的管道处理,非常方便。
内容的提问来源于stack exchange,提问作者firasKoubaa
相关产品推荐
相关产品推荐

