O problema é que a chamada direta faz do nome do script o nome do comando, veja
cat /proc/$PID/comm
Isso faz com que pgrep
corresponda. Se chamado via bash
, o nome do comando é "bash".
Use
pgrep --exact zeal
em vez disso.
Estou executando um programa GUI chamado zelo (compilado de src) e incluo um script (zeal.sh) no executável:
#!/bin/bash
if pgrep zeal &>/dev/null; then
printf "already on\n"
else
~/tools/zeal/zeal/zeal &>/dev/null &
fi
O mais estranho é que quando executo este script como /path/to/zeal.sh
, ele sempre diz "já ligado", enquanto que com bash /path/to/zeal.sh
ele decide corretamente se o processo está sendo executado ou não.
Também verifiquei outros programas GUI (como o firefox) com scripts semelhantes e eles funcionam bem.
Então, como isso pode acontecer e como corrigi-lo?
A longa opção --exact
proposta na resposta de Hauke não funcionou em alguns sistemas. Você pode usar a opção curta equivalente -x
.
#!/bin/bash
if pgrep -x "zeal" > /dev/null
then
echo "Running"
else
echo "Stopped"
fi