在bash脚本中查找java应用的进程id(查看目标应用是否已经在运行)

Mou*_*inX 9 bash java shell-script process-management bash-script

我知道关于获取进程 ID 有上百万个问题,但这个问题似乎是独一无二的。谷歌没有给我答案,所以我希望 stackexhange 会有所帮助而不是关闭这个问题。

当涉及到 Java 时,查找进程 ID 似乎更棘手(pgrep 不能正常工作)。

此外,我需要在 bash 脚本中自动执行此操作。我遇到的一个问题是,当我使用ps aux | grepgrep 进程本身时,它总是会出现,所以在一个简单的 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
Run Code Online (Sandbox Code Playgroud)

示例 2 - 即使“java_app”当前正在运行,也不会返回任何内容:

$ pgrep java_app
Run Code Online (Sandbox Code Playgroud)

它什么都不返回。但是,这是“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
Run Code Online (Sandbox Code Playgroud)

我需要的是一个解决方案,我可以插入一个 bash 脚本,它会告诉我感兴趣的 java 应用程序(我知道 jar 文件名和路径)当前是否正在运行。(如果它正在运行,我需要在我的脚本继续之前要求用户关闭它。)

jor*_*anm 12

默认情况下,pgrep只匹配命令,不匹配参数。要匹配完整的命令行,您需要该-f选项。

$ pgrep -f java_app
Run Code Online (Sandbox Code Playgroud)

从 pgrep 联机帮助页:

-f 该模式通常仅与进程名称匹配。设置 -f 时,将使用完整的命令行