2

我想构建一个小脚本(称为check_process.sh)来检查某个进程$PROC_NAME是否正在运行。如果是,则返回其 PID,否则返回 -1。

我的想法是pgrep -f <STRING>在命令替换中使用。

如果我直接在命令行中运行此代码:

export ARG1=foo_name
export RES=$(pgrep -f ${ARG1})
if [[ $RES == "" ]]; then echo "-1" ; else echo "$RES"; fi

一切正常:PID或-1,具体取决于进程状态。

我的脚本check_process.sh包含相同的行加上一个额外的变量来传递进程的名称:

#!/bin/bash
export ARG1=$1
export RES=$(pgrep -f ${ARG1})
if [[ $RES == "" ]]; then echo "-1" ; else echo "$RES"; fi

但是这段代码不起作用!如果进程当前正在运行,我会得到两个 PID(进程的 PID 和其他东西......),而当我检查一个没有运行的进程时,我会得到其他东西

我很困惑。任何想法?提前致谢!

4

1 回答 1

2

如果您将-a标志添加到pgrep脚本中,您会看到类似的内容(我跑了./check_process.sh vlc):

17295 /usr/bin/vlc --started-from-file ~/test.mkv
18252 /bin/bash ./check_process.sh vlc

所以“其他东西”是pid运行脚本本身的。

pgrep手册解释了该-f标志:

该模式通常仅与进程名称匹配。设置 -f 时,将使用完整的命令行

显然,脚本命令行包含查找进程名称 ( 'vlc') 作为参数,因此它出现在pgrep -f结果中。

如果您只是在寻找进程名称匹配项,您可以删除该-f标志并获得您想要的结果。

如果您希望保留该-f标志,您可以过滤掉当前的pid

#!/bin/bash
ARG1=$1
TMP=$(pgrep -f ${ARG1})
RES=$(echo "${TMP}" | grep -v $$)
if [[ $RES == "" ]]; then echo "-1" ; else echo "${RES}"; fi
于 2016-08-17T09:50:48.667 回答