Este é um pouco difícil de brilhar, mas se você olhar nas duas páginas man seguintes você verá as seguintes notas.
matar (1)$ man 1 kill
...
If sig is 0, then no signal is sent, but error checking is still performed.
...
matar (2)
$ man 2 kill
...
If sig is 0, then no signal is sent, but error checking is still performed;
this can be used to check for the existence of a process ID or process
group ID.
...
Portanto, o sinal 0 não enviará de fato nada para o PID do seu processo, mas verificará se você tem permissão para fazê-lo.
Onde isso pode ser útil?
Um lugar óbvio seria se você estivesse tentando determinar se você tinha permissões para enviar sinais para um processo em execução via kill
. Você pode verificar antes de enviar o sinal kill
real desejado, colocando uma verificação para garantir que kill -0 <PID>
seja permitido pela primeira vez.
Exemplo
Digamos que um processo estava sendo executado pelo root da seguinte forma:
$ sudo sleep 2500 &
[1] 15690
Agora, em outra janela, se executarmos este comando, podemos confirmar que esse PID está sendo executado.
$ pgrep sleep
15693
Agora vamos tentar este comando para ver se temos acesso para enviar os sinais PID via kill
.
$ if ! kill -0 $(pgrep sleep); then echo "You're weak!"; fi
bash: kill: (15693) - Operation not permitted
You're weak!
Então funciona, mas a saída está vazando uma mensagem do comando kill
que não temos permissões. Não é grande coisa, basta pegar STDERR e enviá-lo para /dev/null
.
$ if ! kill -0 $(pgrep sleep) 2>/dev/null; then echo "You're weak!"; fi
You're weak!
Exemplo completo
Então poderíamos fazer algo assim, killer.bash
:
#!/bin/bash
PID=$(pgrep sleep)
if ! kill -0 $PID 2>/dev/null; then
echo "you don't have permissions to kill PID:$PID"
exit 1
fi
kill -9 $PID
Agora, quando executo o código acima como um usuário não raiz.
$ ~/killer.bash
you don't have permissions to kill PID:15693
$ echo $?
1
No entanto, quando é executado como root: $ sudo ~ / killer.bash
$ echo $?
0
$ pgrep sleep
$