【问题标题】:How to test if a process is running with grep in bash?如何测试一个进程是否在 bash 中使用 grep 运行?
【发布时间】:2014-06-22 01:29:26
【问题描述】:

我有命令:

ps ax | grep my_application

它输出一个大字符串,包括 my_application 中涉及的进程的端口。

如果 my_application 没有运行,它会输出:

3873 pts/0    S+     0:00 grep my_application

我需要一个条件来测试ps ax | grep my_application 的输出并执行exit 2,以防my_application 仍在运行。

有什么想法吗?

【问题讨论】:

  • 如果有pgrep,可以使用。
  • 如果ps ax | grep my_application 命令的输出产生两行或多行作为输出,则表示该进程当前正在运行,否则它不是。

标签: linux bash shell


【解决方案1】:

最简单的解决方案是使用pgrep,如果它在您的系统上可用。

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

例如:

ps ax -ocomm

只会输出可执行文件名。如果你也想要 pid,

ps ax -opid,comm

为了方便 grepping,您可能需要删除标题

ps ax -opid=,comm=

其中任何一个都可以作为grep application_name 的输入正常工作,尽管您仍然需要注意application_name 是另一个应用程序名称的子字符串。

man ps 应该为您提供可能的输出字段列表。有很多。

【讨论】:

    【解决方案2】:

    可以加括号排除grep进程:

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

    如果 my_application 正在运行,ps ax 将打印 my_application 以及 grep 命令和模式。 grep 将[m] 理解为字符类,但它不会匹配ps ax 打印的文字字符串'[m]',因此排除了grep 进程。

    【讨论】:

    • 你能解释一下括号的作用吗?
    • @Shahbaz,我添加了关于括号的注释。
    • @tripleee,也许我应该改写评论:为了提高答案的质量,最好解释解决方案的工作原理,而不仅仅是提出解决方案。虽然也感谢手册的链接,但突出显示相关部分的摘录对 OP 有很大帮助。
    • @Shahbaz 这个问题和这个答案都非常频繁地重复。我无法在 Stack Overflow 上快速找到精确的副本,但简短的谷歌搜索应该可以为您提供所需的一切。
    • @tripleee,简短的谷歌搜索将回答 99% 的关于 SO 的问题。这个话题其实很多(a recent discussion),答案一直是回答这些琐碎的问题,而不是关闭它,将它们提交给谷歌等。如果您想对此进行争论,请参考帖子meta(我只是遵循 SO 的政策)。
    【解决方案3】:

    您可以使用以下方法从 grep 返回的结果中排除某些内容:

    ps ax | grep my_application | grep -v grep
    

    这不包括当您的应用程序未运行时返回的显示 grep 正在运行的进程。当它运行并且您的应用程序未运行时,它不会返回任何内容。检查空字符串,然后退出。

    【讨论】:

    • 更好的是,只需使用[m]y_application作为模式,在ps的输出中与自身不匹配。
    • 请务必使用引号保护字符串免受 shell 的影响,以防碰巧有一个名为 my_application 的文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 2010-10-17
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多