Como usar o pgrep dentro do script bash corretamente?

6

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?

    
por Hongxu Chen 06.11.2014 / 04:39

2 respostas

3

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.

    
por 06.11.2014 / 05:41
3

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
    
por 02.12.2015 / 04:35

Tags