【问题标题】:Check if process is running检查进程是否正在运行
【发布时间】:2010-02-04 14:10:17
【问题描述】:

我正在尝试检查进程是否正在运行。如果它正在运行,我想要一个“OK”的返回值,如果不是“Not OK”的返回值。如果那是正确的术语,我只能在不附加任何其他参数的情况下使用“ps”(例如 ps -ef)。我的代码是:

if ps | grep file; then  echo 'OK'; else  echo 'NO'; fi

这样做的问题是它不搜索确切的过程并且总是返回'OK',我不希望出现所有信息我只想知道文件是否存在。

【问题讨论】:

    标签: linux bash process grep


    【解决方案1】:

    您的代码总是返回“OK”,因为 grep 发现自己在进程列表中(“grep file”包含单词“file”)。一个修复方法是执行 `grep -e [f]ile'(-e 表示正则表达式),它不会找到自己。

    【讨论】:

      【解决方案2】:

      备用grep 解决实际问题:

      ps -C file
      

      完全避免了使用grep 的问题。

      【讨论】:

        【解决方案3】:
        ps | grep -q '[f]ile'
        

        【讨论】:

          【解决方案4】:

          当我知道我喜欢的 pid 时:

          [ -d /proc/<pid> ] && echo OK || echo NO
          

          【讨论】:

            【解决方案5】:

            “pgrep”呢?

            $ pgrep -x foo
            xxxx
            $
            

            其中 xxxx 是以名称 foo 运行的二进制文件的 pid。如果 foo 没有运行,则没有输出。

            还有:

            $ if [[ pgrep -x foo ]];然后回显“是”;否则回显“否”;菲;

            如果 foo 正在运行,将打印“yes”;如果不是,则为“否”。

            参见 pgrep 手册页。

            【讨论】:

              【解决方案6】:
              if ps | grep file | grep -v grep;
              then echo 'ok';
              else echo 'no';
              

              grep -v grep 确保你得到的结果不是正在执行的 grep 语句。

              【讨论】:

                【解决方案7】:

                grep 也有一个解决方案:

                if [ "$(ps aux | grep "what you need" | awk '{print $11}')" == "grep" ]; then
                ...
                elif [ ... ]; then
                ...
                else
                ...
                fi
                

                这在 Debian 6 中运行良好,不确定其他发行版。 '{print $11}' 是必需的,因为系统也将 grep 视为一个进程。

                【讨论】:

                  最近更新 更多