bash: grep 命令替换

bash: pgrep in a commad substition

我想构建一个小脚本(称为 check_process.sh)来检查某个进程 $PROC_NAME 是否为 运行ning。如果是,它 returns 它的 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=
export RES=$(pgrep -f ${ARG1})
if [[ $RES == "" ]]; then echo "-1" ; else echo "$RES"; fi

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

我很纳闷。任何的想法? 提前致谢!

如果在脚本中将 -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 标志:

The pattern is normally only matched against the process name. When -f is set, the full command line is used.

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

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

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

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