"kill PID" não está realmente matando o processo, por quê?

97

Estou tentando melhorar minhas habilidades de linha de comando e encontrei um problema em que não posso matar um processo. Eu digito kill 2200 onde 2200 é meu PID e o processo não é eliminado. Após alguns minutos, espera ainda em top e ps aux . Eu até tentei digitá-lo com o sudo - sem resultados.

Alguma idéia de por que seria assim?

EDITAR

Encontrei uma dependência estranha, em que fg atualiza a lista de processos:

[email protected]:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2200 pts/0    00:00:00 top
 2202 pts/0    00:00:00 top
 2258 pts/0    00:00:00 ps
[email protected]:/etc/grub.d$ fg
top

[email protected]:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2200 pts/0    00:00:00 top
 2620 pts/0    00:00:00 ps
[email protected]:/etc/grub.d$ fg
top

[email protected]:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2621 pts/0    00:00:00 ps
    
por Patryk 03.09.2011 / 09:47

5 respostas

143

Os processos podem ignorar alguns sinais. Se você enviar SIGKILL, ele não poderá ignorá-lo (e tampouco pegá-lo para fazer limpezas). Experimente:

kill -9 {PID}

Saiba mais lendo a página de manual:

man kill
    
por Michał Šrajer 03.09.2011 / 10:09
30

Se kill for chamado sem nenhum parâmetro, ele envia o número de sinal 15 ( SIGTERM ). Este sinal pode ser ignorado pelo processo. Este sinal notifica o processo para limpar suas coisas e depois terminar corretamente sozinho. Essa é a maneira legal.

Você também pode "enviar" o número de sinal 9 ( SIGKILL ) que não pode ser ignorado pelo processo. O processo não irá reconhecê-lo, porque o kernel encerra o processo, não o processo em si. Essa é a maneira má.

Um diz que kill -9 <pid> sempre funciona. Essa é uma falta de fé . Existem situações em que mesmo kill -9 não mata o processo. Por exemplo, quando um processo tem o estado D (suspensão ininterrupta). Um processo entra nesse estado toda vez que ele espera por E / S (normalmente não muito tempo). Portanto, se um processo aguardar E / S (em um disco rígido defeituoso, por exemplo) e ele não estiver programado corretamente (com um tempo limite), você simplesmente não poderá eliminar o processo . Não importa o que você faça. Você só pode tentar tornar o arquivo acessível que o processo continue.

    
por chaos 10.06.2014 / 08:22
7

Apesar de o nome kill não matar processos, ele envia sinais para ele. Na página do manual:

kill - send a signal to a process

O sinal padrão enviado por kill [pid] é SIGTERM que geralmente, mas não necessariamente, solicita que o processo termine. É bem possível escrever um programa que tenha uma melodia feliz quando você envia o sinal SIGTERM para ele, mas não é recomendado.

Outro sinal comum é o SIGHUP , que é freqüentemente usado para solicitar que um programa releia seus arquivos de configuração.

Se você realmente quer matar um programa, você precisa usar o sinal SIGKILL fazendo kill -9 [pid] .

    
por danne 06.09.2011 / 13:51
2

Parece que você pode estar suspendendo um processo (talvez pressionando Ctrl-Z no terminal). Nesse estado, seu processo não responderá a um SIGTERM quando estiver congelado. Correndo 'fg' descongela o processo, assim ele pode pegar o sinal e auto-terminar. Isso poderia explicar por que 'fg' parece atualizar a lista de processos.

    
por user24497 06.09.2011 / 17:00
0

De dentro do C ++, executei:

kill(4024, SIGKILL);

E em um terminal linux (Ubuntu),

$ ps -ax | grep my_su

A saída foi:

4024 pts/1    Z+     0:00 [my_subscriber] <defunct>

Aparentemente, (4024) ainda sobrevive. No entanto, assim que terminei o processo pai que chamou a instrução "kill" acima, 4024 não apareceu mais. Agora eu julgo processo "extinto" é nada mais do que uma linha exibida e decidiu ignorá-lo. Espero que minha experiência possa ajudar alguém lá fora. Felicidades!

    
por Park JongBum 11.03.2016 / 00:51