O que é uma maneira correta de verificar se um PID está sendo executado?

11

Eu tenho um arquivo .pid e preciso verificar se o processo está sendo executado. Até agora eu encontrei duas opções

kill -0 'cat something.pid'

que imprime um erro se o pid não estiver em execução. Eu sei que isso pode ser redirecionado para /dev/null , mas isso me faz pensar que essa não é a melhor solução.

A segunda solução seria usar ps , que no entanto também imprime no STDOUT

ps -ef 'cat something.pid'

É normal redirecionar a saída para /dev/null e apenas usar o código de status retornado ou é um sinal de que estou fazendo algo errado e preciso de um comando diferente?

    
por Jakub Arnold 05.03.2012 / 16:05

5 respostas

8

para a maioria das distribuições linux enumerando o / proc / {pid} é uma boa maneira de obter informações sobre os processos em execução, e geralmente como os comandos do espaço do usuário como "ps" estão se comunicando com o kernel. Então, por exemplo, você pode fazer;

[ -d "/proc/${kpid}" ] && echo "process exists" || echo "process not exists"

Edit: você deve verificar se o kpid está definido, mas isso é mais útil, já que ele retornará "not exists" para unset $ {kpid}

[ -n "${kpid}" -a -d "/proc/${kpid}" ] && echo "process exists" || echo "process not exists"
    
por 05.03.2012 / 17:04
6

Como Anders observou, você deve usar kill -0 para conformidade POSIX.

Nos sistemas Linux, você também pode verificar a existência de um arquivo no sistema de arquivos / proc, por exemplo,

-f /proc/$(cat something.pid)/status
    
por 05.03.2012 / 16:46
1

Se isso estiver em um script (o que eu suponho ser o caso quando você está preocupado em imprimir para o stdout), o seguinte seria como você poderia fazer isso:

if ps -p $(cat something.pid) > /dev/null 2>&1
then
    kill $(cat something.pid)
else
    # Deal with the fact that the process isn't running
    # i.e. clear up the pid file
fi

O ps -p procura por um processo com o pid especificado em something.pid (a sintaxe $() é uma versão um pouco mais nova do backtick. O Backtick precisa escapar em certas circunstâncias que o novo formulário não possui). O 2>&1 redireciona stderr para esse comando também.

Se o comando ps -p não encontrar o processo com esse PID, ele sairá com um erro > 0 e assim o else é executado. Caso contrário, a instrução kill . Você pode negar o que precede se quiser:

if ! ps -p ...

Espero que isso responda à sua pergunta. Obviamente, tenha cuidado e teste bastante ao usar comandos perigosos, como kill .

    
por 05.03.2012 / 16:57
1

Aqui estão algumas opções:

  • Se você está escrevendo init-script (por exemplo, aquele para colocar em /etc/init.d/ ) e se você está usando a distro baseada em Debian, é melhor usar start-stop-daemon :
    # start-stop-daemon -T -p $PIDFILE -u $USER_NAME -n $NAME
    Você deve obter o código de saída 0 se estiver em execução.
  • Você pode usar o pgrep e o pkill de procps package:
    pgrep --pidfile $PIDFILE
por 06.03.2012 / 22:52
0

Se você tiver um arquivo pid, poderá usar o pgrep para verificar se o processo está sendo executado:

    if pgrep -F something.pid; then
        echo "Running"
    else
        echo "Not running"
    fi
    
por 20.04.2018 / 16:50