我正在运行一个名为的 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
反而。