在unix中如何找出进程是否正在运行并返回true / false?

时间:2015-01-13 14:35:47

标签: bash shell unix

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

如果不是不继续并显示“未找到过程”这样的文本。

我试过这样的事情:

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

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

3 个答案:

答案 0 :(得分:3)

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

2解决方案:

  1. 使用if ps -ef | grep '[x]yz'; then。 (您可能希望使用grep)来禁止-q输出 正在运行的grep命令是grep [x]yz。这将打印在ps -ef输出中 显然,grep会过滤掉这一行。 [x]yz可以与\[x\]yz匹配,而不是[x]yz

  2. 使用if pgrep -f xyz >/dev/null; then
    查看man pgrep了解详情..

答案 1 :(得分:2)

我相信您希望使用Command substition来检查命令的输出,来自链接的bash-hackers 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

这更容易阅读。

答案 2 :(得分:2)

您也可以使用pgrep。来自pgrep(1)

  

pgrep查看当前正在运行的进程并列出   将选择条件与stdout匹配的进程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系统。