Qual é a maneira correta de verificar se um PID está em execução?


12

Eu tenho um .pidarquivo e preciso verificar se o processo está em execução. 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 /dev/null, mas isso me faz pensar que essa não é a melhor solução.

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

ps -ef `cat something.pid`

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


5
Use kill -0como compatível com o padrão (POSIX).
Anders

Respostas:


9

para a maioria das distribuições linux que enumeram 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"

Editar: você deve verificar se o kpid está definido, mas isso é mais útil, pois retornará "não existe" para $ {kpid}

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

@SteveMuster Isso tornaria a resposta específica do Linux. Não há / proc no OSX. E acho que não há / proc no BSD.
cinzas

Nota com isso, você precisa ter certeza ${kpid}existe
Wilf

@Wilf eu editei-lo, então ele retorna "processo não existe" por US $ unset {kpid}
Tom H

Graças - Eu estava fazendo um script que verifica a PID usando um método semelhante e não funcionou até que eu encontrei esta foi a questão :)
Wilf

6

Como Anders observou, você deve usar kill -0para conformidade com o 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

1

Se isso estiver em um script (que eu assumo que seja o caso de você estar preocupado com a impressão em stdout), o seguinte seria como você poderia fazê-lo:

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

Ele ps -pprocura um processo com o pid especificado em something.pid (a $()sintaxe é uma versão ligeiramente mais recente do backtick. O backtick precisa escapar em determinadas circunstâncias que o novo formulário não faz). O 2>&1redirecionador stderr também para esse comando.

Se o ps -pcomando não encontrar o processo com esse PID, ele sairá com um erro> 0 e, portanto, elseserá executado. Caso contrário, a killdeclaração. Você pode negar o acima, se desejar, fazendo:

if ! ps -p ...

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


1

Aqui estão algumas opções:

  • Se você estiver escrevendo o script init (por exemplo, o que você deve colocar /etc/init.d/) e se estiver usando a distribuição baseada no 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 do procpspacote:
    pgrep --pidfile $PIDFILE

0

Se você possui um arquivo pid, pode usar o pgrep para verificar se o processo está em execução:

    if pgrep -F something.pid; then
        echo "Running"
    else
        echo "Not running"
    fi
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.