我知道关于获取进程 ID 有一百万个问题,但这一个似乎是独一无二的。 Google 没有给我答案,所以我希望 stackexhange 能有所帮助而不是结束这个问题。
当涉及 Java 时,查找进程 ID 似乎比较困难(pgrep 不起作用)。
此外,我需要在 bash 脚本中自动执行此操作。我遇到的一个问题是,当我使用ps aux | grep
grep 进程本身时总是会出现,因此在一个简单的 bash 脚本中处理结果对于我自己找出一个好的解决方案来说还不够简单(以我有限的 bash 技能) 。
我尝试过的一些事情:
示例 1 - 即使不存在同名的应用程序,也会返回一个进程:
$ ps aux | grep -i anythingnotreal
user2 3040 0.0 0.0 4640 856 pts/3 S+ 18:17 0:00 grep --color=auto -i anythingnotreal
示例 2 - 即使“java_app”当前正在运行,也不会返回任何内容:
$ pgrep java_app
它什么也不返回。然而,这里有“java_app”正在运行的证据:
$ ps aux | grep java_app
tester2 2880 0.7 2.8 733196 58444 ? Sl 18:02 0:07 java -jar /opt/java_app2/my_java_app.jar
tester2 3058 0.0 0.0 4644 844 pts/3 S+ 18:19 0:00 grep --color=auto java_app
我需要的是一个可以插入 bash 脚本的解决方案,该解决方案将告诉我感兴趣的 java 应用程序(我知道其 jar 文件名和路径)当前是否正在运行。 (如果它正在运行,我需要要求用户在脚本继续之前关闭它。)
答案1
默认情况下,pgrep
仅匹配命令,不匹配参数。要匹配完整的命令行,您需要该-f
选项。
$ pgrep -f java_app
来自 pgrep 联机帮助页:
-f 该模式通常仅与进程名称匹配。设置 -f 时,使用完整命令行
答案2
您可以使用pidof java
来找出正在运行的java进程,然后获取每个进程的详细信息,例如ps -p $PID -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS
,然后您可以确定目标应用程序是否正在运行以及它的使用情况是否需要要求用户关闭或继续。
答案3
您可以使用jcmd属于 JDK 一部分的实用程序。它只列出当前正在运行的 Java 进程,因此您需要做的就是 grep forjava_app
jcmd | grep java_app | cut -d " " -f 1