Alguns processos não podem ser eliminados antes de outros processos, então posso pensar em um caso em que kill <PID list>
tenta matar tal processo, desiste e, em seguida, mata seu "parceiro" com sucesso, deixando o anterior não qualificado, embora pudesse tê-lo matado também, tentou novamente mais tarde.
Se esse caso for verdadeiro, outra pergunta seria: kill <PID list>
obedece à ordem dos PIDs na minha lista ou devo usar processos de eliminação separados para controlar a ordem em que os processos são eliminados?
Duvido que haja algo mais do que apenas enviar o sinal para cada um dos alvos. A definição POSIX para
kill(1)
é apenas isso , então tentar novamente pareceria uma violação da especificação:Além disso, lembre-se de que nem todos os sinais causam o encerramento de processos e alguns como
SIGHUP
(sem falarSIGUSR1
em ) podem significar coisas diferentes para programas diferentes. Não há uma maneira clarakill
de saber quando tentar novamente, mas certamente existem programas que primeiro enviamSIGTERM
e depois "tentam novamente" comSIGKILL
.Enviar os sinais na ordem fornecida seria a implementação direta, e é isso que, por exemplo, o Bash
kill
faz:kill <PID list>
simplesmente envia o sinal especificado para a lista especificada de processos. Então, o comportamento do seu sistema depende se esse processo específico ignora ou não esse sinal específico. Por padrão,kill
envia um sinal TERM.Supondo que você esteja falando sobre SIGKILL aqui, este sinal não pode ser bloqueado ou ignorado. Portanto
kill -9
, matará os processos listados, a menos que, por algum motivo, o processo não responda (por exemplo, aguardando E/S em um NFS bloqueado).Podemos responder a essa pergunta simplesmente olhando para kill.c .
Basicamente nós apenas:
liste todos os processos com struct proc_processes ps = proc_open_processes(); então filtramos essa lista por pids ou nomes de processos e enviamos
kill_verbose(&ctl) para cada processo encontrado, que é simplesmente kill(ctl->pid, ctl->numsig)
Quando o processo é encerrado com SIGKILL, ele é encerrado. Do sinal.h :
Então, como você pode ver, é apenas um simples comando "enviar mensagem para processar". Nada chique.