通过 shell 脚本中的 bash 检查应用是否为 运行

Check if app is running via bash in shell script

我的 "if" 语句负责检查应用程序是否 运行 不起作用。总是 returns "false" 这是一个 script.sh:

#!/bin/bash
    osascript -e "do shell script \"

        if (ps aux | grep "[[S]kype]" > /dev/null)
        then
            echo "RUNNING" > /Users/someuser/Desktop/RUNNING.txt
        else
            echo "STOPPED" > /Users/someuser/Desktop/STOPPED.txt
        fi

    \" with administrator privileges"

结果脚本创建 "STOPPED.txt" 即使应用程序已启动。

如何解决以下问题?

请注意,我只能更改 "IF" 语句。

这里有几个问题。您没有在 post 中指定它,但您似乎专门在寻找应用程序“Skype”。然而,方括号在 grep 中有特殊的含义:它们表示任何括起来的字符。但是,通过嵌套方括号,您基本上可以确保它不会匹配任何内容。 (请参阅其他地方的 Grep ambiguity nested square bracket。)

这就是它总是报告“已停止”的原因,因为没有匹配项。

您可能想要更多类似的东西:

ps aux | grep "Skype"

但是,如果您 运行 这样做,您会发现它报告的总是 运行ning。这是因为这实际上会匹配 grep 本身,因为 grep 进程也包含所需的文本。要解决该问题,您需要以某种方式从匹配列表中删除 grep 进程。 (这可能是您的方括号的用途;请参阅评论。)一种方法是使用 grep -v 排除匹配的行:

ps aux | grep "Skype" | grep -v "grep"

这应该可以满足您的要求。我用你的脚本的简化形式测试了它,它正确地报告了命名的应用程序是否 运行ning 或 运行ning:

#!/bin/bash
osascript -e "do shell script \"

  if (ps aux | grep Skype | grep -v grep > /dev/null)
  then
      echo RUNNING
  else
      echo STOPPED
  fi

\""

请注意,虽然我简化了脚本的其余部分以使其更易于测试,但重要的更改仅在 if 语句中。

(另请注意,由于您的搜索不包含空格,因此搜索周围的引号是多余的;您可以通过删除它们来提高可读性。但是,拥有它们不会损害脚本。)