如何在bash脚本中正确使用pgrep?

如何在bash脚本中正确使用pgrep?

我正在运行一个名为的 GUI 程序热情(从 src 编译)并为可执行文件添加脚本(zeal.sh):

#!/bin/bash

if pgrep zeal &>/dev/null; then
    printf "already on\n"
else
    ~/tools/zeal/zeal/zeal &>/dev/null &
fi

奇怪的是,当我像这样运行这个脚本时/path/to/zeal.sh,它总是告诉“已经开启”,而用bash /path/to/zeal.sh它正确地决定进程是否正在运行。

我还检查了其他具有类似脚本的 GUI 程序(如 Firefox),它们工作正常。

那么这种情况怎么会发生以及如何解决呢?

答案1

Hauke 的答案中提出的长选项--exact在某些系统上不起作用。您可以使用等效的短选项-x来代替。

#!/bin/bash

if pgrep -x "zeal" > /dev/null
then
    echo "Running"
else
    echo "Stopped"
fi

答案2

问题是直接调用使脚本名称成为命令名称,请参见

cat /proc/$PID/comm

这导致pgrep匹配。如果通过调用bash,则命令名称为“bash”。

使用

pgrep --exact zeal

反而。

相关内容