如何在bash中使用grep测试进程是否正在运行?

3

我有一个命令:

ps ax | grep my_application

如果my_application未运行,则输出一个包含涉及此应用程序进程端口的大字符串。
3873 pts/0    S+     0:00 grep my_application

我需要一个条件来测试 ps ax | grep my_application 的输出,并在 my_application 仍在运行时执行 exit 2。有任何想法吗?

2
如果您有pgrep,您可以使用它。 - anubhava
如果 ps ax | grep my_application 命令的输出产生两行或更多行,则表示该进程当前正在运行,否则它没有运行。 - Avinash Raj
可能是更优雅的“ps aux | grep -v grep”的重复。 - tripleee
3个回答

5

您可以添加括号来排除grep进程:

ps ax | grep -q '[m]y_application' && exit 2

如果我的应用程序正在运行,ps ax 将打印 my_application 以及 grep 命令和模式。Grep 将 [m] 理解为一个字符类,但不会匹配由 ps ax 打印的字面字符串 '[m]',因此 grep 进程被排除在外。

你能解释一下括号的作用吗? - Shahbaz
@Shahbaz,我已经添加了关于括号的说明。 - Cole Tierney
@tripleee,也许我应该重新表达一下评论:为了提高您的答案质量,最好是解释解决方案的工作原理,而不仅仅是提供解决方案。虽然手册链接也很受欢迎,但摘录出相关部分的段落会对OP有很大帮助。 - Shahbaz
@Shahbaz 这个问题和这个回答都是非常经常重复的。我在 Stack Overflow 上没有很快找到一个精确的重复,但简短的谷歌搜索应该可以让你得到你需要的一切。 - tripleee
@tripleee,简单的谷歌搜索就可以回答 Stack Overflow 上 99% 的问题。这个话题实际上经常出现(最近的讨论),答案总是回答这些琐碎的问题,而不是关闭它,引用他们到谷歌等等。如果您想争论这个问题,请参考 meta 中的帖子(我只是遵循 SO 的政策)。 - Shahbaz
https://dev59.com/LHrZa4cB1Zd3GeqPyybK - tripleee

1

如果您的系统支持,最简单的解决方案是使用pgrep

否则,您可以自定义ps报告进程的方式。您不必使用默认格式,其中包括(某些)命令行参数。

例如:

ps ax -ocomm

仅输出可执行文件名。如果您还想要进程 ID (PID),

ps ax -opid,comm

为了方便使用grep命令,你可能想要删除标题。

ps ax -opid=,comm=

任何一个都可以作为grep 应用程序名称的输入,尽管您仍需要注意应用程序名称是否是另一个应用程序名称的子字符串。 man ps应该给您可能输出字段的列表。有很多选项。

0

您可以通过使用类似以下命令来从grep返回的结果中排除某些内容:

ps ax | grep my_application | grep -v grep

这不包括在应用程序未运行时显示 grep 运行的返回过程。当此过程运行且您的应用程序未运行时,它将返回空值。检查空字符串并以此方式退出。


1
更好的方法是,只需使用[m]y_application作为模式,这样它就不会在ps的输出中匹配自身。 - chepner
请确保用引号保护字符串,以防万一有一个名为my_application的文件存在于shell中。 - Cole Tierney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接