我正在运行一个名为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)
问题是直接调用使脚本名称成为命令名称,请参见
cat /proc/$PID/comm
Run Code Online (Sandbox Code Playgroud)
这导致pgrep
匹配。如果通过调用,bash
则命令名称为“bash”。
使用
pgrep --exact zeal
Run Code Online (Sandbox Code Playgroud)
反而。