Respostas:
o envio do sinal 0
para um determinado PID
apenas verifica se algum processo com o dado PID
está em execução e você tem permissão para enviar um sinal para ele.
Para mais informações, consulte as seguintes páginas de manual:
abate (1)$ man 1 kill
...
If sig is 0, then no signal is sent, but error checking is still performed.
...
abate (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.
...
man 2 kill
lugar.
man 1 kill
e man 2 kill
tinha no meu sistema Fedora 20. É difícil identificar, porém, enterrado nas duas páginas de manual.
If sig is 0 (the null signal), error checking is performed but no signal is actually sent. The null signal can be used to check the validity of pid.
pubs.opengroup.org/onlinepubs/009695399/functions/kill.html
man 2 kill
está fora do primeiro alteração :)
... pode ser difícil encontrar documentação sobre este sinal especial. Apesar do que outros disseram, a única menção desse sinal nos man 1 kill
sistemas baseados no Debian é:
Sinais particularmente úteis incluem HUP, INT, KILL, STOP, CONT e 0.
Não é especialmente útil, especialmente se você ainda não sabe o que o sinal faz. Também não é listado pela saída de kill -l
, portanto, você não saberá a menos que já saiba.
Nos sistemas Debian e Ubuntu, a saída de man 2 kill
diz, em parte:
Se sig for 0, nenhum sinal será enviado, mas a verificação de erros ainda será realizada; isso pode ser usado para verificar a existência de um ID do processo ou do grupo de processos.
Você pode usar kill -0
para verificar se um processo está em execução. Considere estes exemplos.
# Kill the process if it exists and accepts signals from
# the current user.
sleep 60 &
pid=$!
kill -0 $pid && kill $pid
# Check if a PID exists. When missing, this should result
# in output similar to:
# bash: kill: (6228) - No such process
# Exit status: 1
kill -0 $pid; echo "Exit status: $?"
Você também pode usar kill -0
para determinar se o usuário atual tem permissões para sinalizar um determinado processo. Por exemplo:
# See if you have permission to signal the process. If not,
# this should result in output similar to:
# bash: kill: (15764) - Operation not permitted
# Exit status: 1
sudo sleep 60 &
kill -0 $!; echo "Exit status: $?"
kill(2)
Aqui está o trecho:The kill() function sends the signal specified by sig to pid, a process or a group of processes. Typically, Sig will be one of the signals specified in sigaction(2). A value of 0, however, will cause error checking to be performed (with no signal being sent). This can be used to check the validity of pid.
kill
página do manual: "Se sig for 0, nenhum sinal será enviado, mas a verificação de erros ainda será executada."
Este comando verifica se o processo com PID em $ pid está ativo.
$pid
pode estar em execução, mas você não tem permissão para enviar um sinal para ele.
kill(1)
imprimirá um erro diferente para cada um. Portanto, você pode saber se o pid está ativo, independentemente de você ter permissões para enviar sinais ou não. Além disso, o uso típico de kill -0
é verificar se o pid está vivo, mesmo que nem sempre seja usado corretamente. Eu diria que esta resposta está correta (além da ortografia).
kill -0 $pid
será o mesmo nos dois casos. Ele retornará 1
para que você não possa dizer sem analisar a saída de kill
se o processo está em execução ou não, se você não tiver permissão para enviar um sinal para ele. EDIT: sim, eu sei que é usado na maioria das vezes para verificar se um processo está vivo, mas isso é errado a menos que você pode garantir que você tem permissão para enviar o sinal (por exemplo: ser root)
kill
bash embutido (a pergunta está marcada bash
) gera o tipo de erro no stderr e indica de um erro no seu código de retorno. Ou seja, "Este comando verifica [se] o processo com o PID em $ pid está ativo" está completamente correto se você interpretar a saída corretamente. [Eu não teria comentado se você não dissesse que deu -1 à resposta. O seu comentário é válido de outra forma].
Kill -0 $ pid é verificar se o processo com pid existe ou não.
Tenha cuidado ao usar 'kill -0 $ pid' para verificar a existência do processo, porque
Uma vez que o processo pretendido saia, seu pid poderá ser alocado para outro processo recém-criado. (Portanto, não se pode ter tanta certeza de que um processo específico esteja vivo ou não)
No caso do processo Zombie, pelo qual o filho está esperando o pai chamar a espera. Aqui ele contém o $ pid e fornece o resultado positivo enquanto esse processo não está em execução.
Kill -0 $ pid usado para verificar se um processo em execução com $ pid está ativo ou não. Mas isso pode ser complicado, pois o ID do processo pode ser reatribuído, uma vez que um processo saia e um novo processo seja executado. Pode-se usar killall -0 para obter ou não um processo em particular.
EXIT
sinal ou 0
para um processo irá:stdout
sucesso.stderr
se algo não estiver certo.Mais explicitamente, uma função útil para seus scripts de shell seria:
function isProcess ()
{
kill -s EXIT $1 2> /dev/null
}
Isso não retorna nenhum texto para o stdout
êxito, mas uma mensagem de erro para o stderr
erro (mas eu redirecionei essa mensagem de erro para/dev/null
).
Se você estiver preocupado com o status do processo extinto / zumbi , precisará usar ps
, de preferência com a --no-headers
opção.
#!/bin/ksh
function trim ()
{
echo -n "$1" | tr -d [:space:]
}
function getProcessStatus ()
{
trim $(ps -p $1 -o stat --no-headers)
}
function isZombie ()
{
typeset processStatus=$(getProcessStatus $1)
[[ "$processStatus" == "Z" ]]
return $?
}