Usando 'kill -s 0 $ pid' vs '[[-e / proc / $ pid]]' para detectar se o PID está sendo executado

6

Um dos idiomas geralmente usados para verificar se o processo está em execução é usar kill -s 0 $pid .

A minha pergunta é, tem algum ups sobre o uso de [[ -e /proc/$pid ]] construct?

O script que estou escrevendo é específico para Linux e bash.

    
por Hubert Kario 25.11.2013 / 19:12

3 respostas

6

Eu preferiria kill -s 0 pid vs testing /proc/pid , já que o primeiro é portátil, sendo especificado pelo POSIX. Mesmo que o seu script tenha como alvo o Linux, ainda há um risco (muito pequeno) de que /proc seja desmontado por algum motivo.

    
por 25.11.2013 / 21:53
2

Eu geralmente usaria um comando como kill sobre a leitura de conteúdo diretamente de /proc . A vantagem é que uma ferramenta como kill retornará códigos de status (pense em $? ) se foi bem-sucedida ou não e, em tese, já deve ter alguma coisa relacionada à API incluída, quando estiver lidando com /proc content vs rolando você mesmo.

Além disso, o uso de comandos dedicados permite uma melhor portabilidade do seu código nos vários Unixes. /proc não é onipresente em outros Unixes, como Solaris e AIX.

Exemplos

Processo de teste para matar.

$ sleep 10 &
[1] 11639

Agora nós matamos isso.

$ kill 11639
[1]+  Terminated              sleep 10

Fomos bem sucedidos?

$ echo $?
0

Um zero significa que fomos bem sucedidos. Qualquer outra coisa, nós poderíamos lidar com isso de maneiras diferentes. Com a leitura do /proc diretamente, somos deixados em um dilema.

Mesma situação, estamos tentando matar um processo inexistente.

$ kill 61234
bash: kill: (61234) - No such process

Recebemos feedback sobre isso.

$ echo $?
1

O que mais?

Você também pode querer investigar usando pkill e pgrep também se preferir matar ou procurar um processo pelo nome, em vez de $pid . Mas isso depende basicamente do que você está tentando fazer.

    
por 25.11.2013 / 19:32
1

Existe uma grande diferença entre kill -s 0 $pid e [ -e /proc/$pid ] . O último testa se existe um processo (ou zumbi) com este PID. O primeiro corresponde apenas a processos (ou zumbis) aos quais você pode enviar um sinal, ou seja, o UID real ou salvo do processo deve ser o mesmo do UID do shell do qual você está executando (a menos que o shell esteja executando como root). caso em que não há diferença).

Qual usar depende se você deseja corresponder aos processos de outros usuários.

kill -s 0 $pid é muito portátil (é compatível com POSIX). O teste para /proc/$pid não funciona em uniões BSD, pois eles não têm /proc ; uma maneira portátil de obter o mesmo efeito é ps -p $pid >/dev/null 2>/dev/null .

    
por 26.11.2013 / 02:06