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

Hon*_*hen 6 bash process

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

#!/bin/bash

if pgrep zeal &>/dev/null; then
    printf "already on\n"
else
    ~/tools/zeal/zeal/zeal &>/dev/null &
fi
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 6

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

#!/bin/bash

if pgrep -x "zeal" > /dev/null
then
    echo "Running"
else
    echo "Stopped"
fi
Run Code Online (Sandbox Code Playgroud)


Hau*_*ing 3

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

cat /proc/$PID/comm
Run Code Online (Sandbox Code Playgroud)

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

使用

pgrep --exact zeal
Run Code Online (Sandbox Code Playgroud)

反而。