bash:pgrep在commad中

时间:2016-08-17 09:30:05

标签: bash grep command-substitution

我想构建一个小脚本(称为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 s(进程'PID和其他 ...),而当我检查进程时没有跑,我得到别的东西

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

1 个答案:

答案 0 :(得分:2)

如果您在脚本中添加-a标记到pgrep,您可以看到类似的内容(我运行./check_process.sh vlc):

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

所以&#34; 别的东西&#34;是运行脚本本身的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