A 'kill PID list' descobre a ordem correta de morte (ou faz uma tentativa apropriada)?

0

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 depois mata seu "parceiro" com sucesso deixando o primeiro não-qualificado mesmo poderia ter matado também, se tivesse tentado novamente.

Se este caso for verdadeiro, outra pergunta seria: kill <PID list> obedece a ordem dos PIDs na minha lista ou eu tenho que usar processos separados para controlar a ordem em que os processos são mortos?

    
por argle 07.02.2018 / 09:33

3 respostas

0

Eu duvido que exista algo mais do que apenas enviar o sinal para cada um dos alvos. A definição POSIX para kill(1) é exatamente a mesma , então, tentar novamente seria uma violação de a especificação:

The kill utility shall send a signal to the process or processes specified by each pid operand.

For each pid operand, the kill utility shall perform actions equivalent to the kill() function

Além disso, lembre-se de que nem todos os sinais fazem com que os processos terminem, e alguns, como SIGHUP (sem falar em SIGUSR1 ), podem significar coisas diferentes para programas diferentes. Não há nenhuma maneira clara de kill saber quando tentar novamente, mas certamente existem programas que primeiro enviam SIGTERM e depois "tentam novamente" com SIGKILL .

O envio dos sinais na ordem dada seria a implementação direta, e é isso que, por exemplo, % De kill do Bash:

$ strace -etrace=kill bash -c 'kill -0 33330 33339 33335 33332 33337' |& grep ^'kill('
kill(33330, SIG_0)                      = -1 ESRCH (No such process)
kill(33339, SIG_0)                      = -1 ESRCH (No such process)
kill(33335, SIG_0)                      = -1 ESRCH (No such process)
kill(33332, SIG_0)                      = -1 ESRCH (No such process)
kill(33337, SIG_0)                      = -1 ESRCH (No such process)
    
por 07.02.2018 / 11:27
0

kill <PID list> simplesmente envia o sinal especificado para a lista de processos especificada. Então o comportamento do seu sistema depende se esse processo específico ignora ou não esse sinal em particular. Por padrão, kill envia um sinal TERM.

Supondo que você esteja falando sobre o SIGKILL aqui, este sinal não pode ser bloqueado ou ignorado. Portanto, kill -9 eliminará os processos listados, a menos que, por algum motivo, o processo não esteja respondendo (por exemplo, aguardando E / S em um NFS bloqueado).

    
por 07.02.2018 / 09:54
0

Podemos responder a essa pergunta simplesmente olhando kill.c .

Basicamente, apenas:

  • liste todos os processos com struct proc_processes ps = proc_open_processes (); então filtramos essa lista por pids ou processa nomes e enviamos

  • kill_verbose (& ctl) para cada processo encontrado, que é simplesmente simples kill (ctl- > pid, ctl- > numsig)

Quando o processo é eliminado com SIGKILL, é finalizado. De signal.h :

terminate   - kill the process, i.e. all threads in the group,
      similar to exit_group.  The group leader (only) reports
      WIFSIGNALED status to its parent.

Então, como você pode ver, é simplesmente um comando "enviar mensagem para processar". Nada extravagante.

    
por 07.02.2018 / 11:39

Tags