我想构建一个小脚本(称为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和其他 ...),而当我检查进程时没有跑,我得到别的东西!
我很困惑。任何的想法? 提前谢谢!
答案 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