Bash 在unix中,如何确定进程是否正在运行并返回true/false?

Bash 在unix中,如何确定进程是否正在运行并返回true/false?,bash,shell,unix,Bash,Shell,Unix,我正在编写一个unixshell脚本,需要检查当前是否有正在运行的进程的目录中有“xyz”。如果是,则继续执行下一个命令并显示文本,如“找到它” 如果不是,则不要继续,并显示类似“未找到进程”的文本 我试过这样的方法: if ps -ef | grep xyz then echo "XYZ Process Found!" else echo "XYZ Process Not Found!" fi 但它只是向我显示进程并显示“process found”,即使没有xyz进程。我相

我正在编写一个unixshell脚本,需要检查当前是否有正在运行的进程的目录中有“xyz”。如果是,则继续执行下一个命令并显示文本,如“找到它”

如果不是,则不要继续,并显示类似“未找到进程”的文本

我试过这样的方法:

if ps -ef | grep xyz
then
    echo "XYZ Process Found!"
else
    echo "XYZ Process Not Found!"
fi

但它只是向我显示进程并显示“process found”,即使没有xyz进程。

我相信您想根据一个值检查命令的输出,使用链接的bash黑客wiki,命令替换扩展为命令的输出。这些命令在子shell中执行,它们的stdout数据是替换语法扩展的内容。另外,数一数行并删除grep。大概

if [[ $(ps -ef | grep xyz | grep -v grep | wc -l) != 0 ]]; then
        echo "XYZ Process Found!"
else
        echo "XYZ Process Not Found!"
fi
编辑

根据下面的评论,您可能应该使用

if [[ $(ps -ef | grep -c xyz)  -ne 1 ]]; then

这更容易阅读。

我相信您希望根据一个值检查命令的输出,使用链接的bash wiki将命令替换扩展为命令的输出。这些命令在子shell中执行,它们的stdout数据是替换语法扩展的内容。另外,数一数行并删除grep。大概

if [[ $(ps -ef | grep xyz | grep -v grep | wc -l) != 0 ]]; then
        echo "XYZ Process Found!"
else
        echo "XYZ Process Not Found!"
fi
编辑

根据下面的评论,您可能应该使用

if [[ $(ps -ef | grep -c xyz)  -ne 1 ]]; then

这更容易阅读。

当您运行
grep xyz
时,该进程-
grep xyz
也在运行&因此显示在
ps-ef
的输出中
此正在运行的进程命令行包含
xyz
。因此,grep将该行传递给输出。
因此,您始终获得零退出状态,即成功

2种解决方案:

  • 如果ps-ef | grep'[x]yz',则使用
    ;然后
    。(您可能希望使用
    -q
    抑制
    grep
    输出)
    正在运行的grep命令是
    grep[x]yz
    。这将在
    ps-ef
    输出中打印。
    显然,grep过滤掉了这一行
    [x]yz
    可以与
    \[x\]yz
    匹配,而不是与
    [x]yz
    匹配

  • 如果pgrep-f xyz>/dev/null,则使用
    ;然后

    查看更多详细信息


  • 当您运行
    grep xyz
    时,该进程-
    grep xyz
    也在运行&因此显示在
    ps-ef
    的输出中
    此正在运行的进程命令行包含
    xyz
    。因此,grep将该行传递给输出。
    因此,您始终获得零退出状态,即成功

    2种解决方案:

  • 如果ps-ef | grep'[x]yz',则使用
    ;然后
    。(您可能希望使用
    -q
    抑制
    grep
    输出)
    正在运行的grep命令是
    grep[x]yz
    。这将在
    ps-ef
    输出中打印。
    显然,grep过滤掉了这一行
    [x]yz
    可以与
    \[x\]yz
    匹配,而不是与
    [x]yz
    匹配

  • 如果pgrep-f xyz>/dev/null,则使用
    ;然后

    查看更多详细信息


  • 您也可以使用
    pgrep
    。从
    pgrep(1)

    pgrep查看当前运行的进程并列出 与标准输出匹配的进程ID

    [……]

    退出状态
    0一个或多个进程符合条件。
    1没有匹配的进程。
    2命令行中出现语法错误。
    3致命错误:内存不足等

    示例输出:

    [~]% pgrep xterm
    18231
    19070
    31727
    
    您可以在
    if
    语句中使用它,如下所示:

    if pgrep xterm > /dev/null; then
      echo Found xterm
    else
      echo xterm not found
    fi
    

    注意:
    pgrep
    不是一个标准实用程序(即,它不在POSIX中),但至少在Linux和我相信大多数BSD系统上广泛可用。

    您也可以使用
    pgrep
    。从
    pgrep(1)

    pgrep查看当前运行的进程并列出 与标准输出匹配的进程ID

    [……]

    退出状态
    0一个或多个进程符合条件。
    1没有匹配的进程。
    2命令行中出现语法错误。
    3致命错误:内存不足等

    示例输出:

    [~]% pgrep xterm
    18231
    19070
    31727
    
    您可以在
    if
    语句中使用它,如下所示:

    if pgrep xterm > /dev/null; then
      echo Found xterm
    else
      echo xterm not found
    fi
    

    注意:
    pgrep
    不是一个标准实用程序(即,它不在POSIX中),但至少在Linux和我相信大多数BSD系统上广泛可用。

    只有在我更改了=0到=1因为在ps-ef上,即使没有任何匹配项,它也会为每一组进程返回一个标头。@user1508682我首先在这里测试了它,当我使用它时,我得到了“process Found”1. <代码>ps--版本在此输出procps ng版本3.3.9。你有同样的吗?UUO*太多了<代码>如果ps-ef | grep-q[x]yz;然后其他的fi应该可以用。@anishsane不错的链接。你是对的,它提出了几种选择。我喜欢我在这里测试过的
    -c
    psgrep
    在某些系统上是一个东西。只有我更改了=0到=1因为在ps-ef上,即使没有任何匹配项,它也会为每一组进程返回一个标头。@user1508682我首先在这里测试了它,当我使用它时,我得到了“process Found”1. <代码>ps--版本在此输出procps ng版本3.3.9。你有同样的吗?UUO*太多了<代码>如果ps-ef | grep-q[x]yz;然后其他的fi应该可以用。@anishsane不错的链接。你是对的,它提出了几种选择。我喜欢我在这里也测试过的
    -c
    psgrep
    在某些系统上是一种东西。
    pgrep
    通常是人们喜欢的。但是我更喜欢grep[x]yz版本。如果不想抑制输出,可以在屏幕上获取命令行。否则,您需要使用
    ps-f$(pgrep-fxyz)
    。人们通常喜欢使用
    pgrep
    。但是我更喜欢grep[x]yz版本。如果不想抑制输出,可以获取命令li