"Matar <PID>" realmente não está matando o processo, por quê?


118

Estou tentando melhorar minhas habilidades de linha de comando e encontrei um problema em que não consigo eliminar um processo. Eu digito kill 2200onde 2200 é meu PID e o processo não é interrompido. Após alguns minutos, a espera ainda está no tope ps aux. Eu até tentei digitar com sudo - sem resultados.

Alguma idéia de por que seria assim?


EDITAR

Eu encontrei uma dependência estranha, onde fgatualiza a lista de processos:

x@xxx:/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
x@xxx:/etc/grub.d$ fg
top

x@xxx:/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
x@xxx:/etc/grub.d$ fg
top

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2621 pts/0    00:00:00 ps

Que processo foi esse? Você verificou se o processo talvez foi extinto ? Nesse caso, você precisaria matar o processo pai.
Htorque

O processo é top(conforme listado na edição). Eu só queria tentar colocar o programa para trabalhar em segundo plano e depois trazê-lo de volta.
Patryk

2
Se você suspende um processo com CTRL-z, vai bloquear a maioria dos sinais, desde que ele está suspenso (ou seja, até que você faça um fgou bgpara o processo)
nºs

Respostas:


179

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

kill -9 {PID}

Saiba mais lendo a página do manual:

man kill

22
Observe também que, em algumas circunstâncias muito específicas , um processo pode estar em um estado zumbi / extinto, que nem a SIGKILL pode matar o processo. Nesse caso, você terá que encontrar o processo pai e matar o processo pai.
Lie Ryan

15
Se esse processo sair da linha, é KILL DASH NINE !
scottl

4
E, às vezes, não há processo pai, caso em que você está ferrado. A única maneira de remover esse processo é reiniciar a máquina.
user606723

2
O nome do comando kill continua sendo enganoso para muitos, muitos usuários (incluindo eu no começo). Supõe-se que quando você diz "matar X", isso significa realmente matar o X e não fazer outra coisa. Eu entendo que isso não vai mudar nada, mas gostaria que ter escolhido um nome mais elaborative ...
rbaleksandar

1
O que fazer depois kill -9não funciona e o processo ainda está por aí?
Douglas Gaskell

42

Se killfor chamado sem nenhum parâmetro, ele envia o número do sinal 15 ( SIGTERM). Este sinal pode ser ignorado pelo processo. Esse sinal notifica o processo de limpar as coisas e 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 nem o reconhecerá, porque o kernel encerra o processo, não o próprio processo. Esse é o caminho do mal.

Diz-se que kill -9 <pid>sempre funciona. Isso é uma descrença . Existem situações em que nem sequer kill -9mata o processo. Por exemplo, quando um processo tem o estado D(suspensão ininterrupta). Um processo entra nesse estado toda vez que espera por E / S (normalmente não muito longa). Portanto, se um processo aguarda E / S (em um disco rígido com defeito, por exemplo) e não está programado corretamente (com um tempo limite), você simplesmente não pode interromper o processo . Não importa o que você faça. Você apenas pode tentar tornar o arquivo acessível para que o processo continue.


2
Isso é muito útil, já experimentei isso várias vezes devido à suspensão do acesso de E / S em discos de rede e fiquei pensando por que não consegui interromper os processos que congelaram. Existe mais documentação sobre esse problema específico e como contornar isso?
Sheljohn 6/07/2014

7

Apesar do 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 normalmente, mas não necessariamente, pede que o processo seja encerrado. É bem possível escrever um programa que reproduz uma melodia feliz quando você envia o sinal SIGTERM , mas não é recomendado.

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

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


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, pois está congelado. A execução de 'fg' derrete o processo, para que ele capte o sinal e termine automaticamente. Isso poderia explicar por que 'fg' parece atualizar a lista de processos.


1
Então, como encontrar um terminal conectado?
ruX 21/03

0

De dentro do C ++, eu 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, ele (4024) ainda sobrevive. No entanto, assim que encerrei o processo pai que chamou a instrução "kill" acima, o 4024 não apareceu mais. Agora, julgo que o processo "extinto" não passa de uma linha exibida e decidi ignorá-lo. Espero que minha experiência possa ajudar alguém por aí. Felicidades!


0

Você também pode usar kill -lpara exibir os sinais suportados pela sua arquitetura e aprender mais sobre o sinal que deseja usar para enviar um sinal corretamente.

Nota: como outros já mencionaram, o uso de kill -9 {PID}não é recomendado, a menos que seja um processo de zumbi. uma vez que um processo receba um SIGKILL, ele será encerrado imediatamente sem limpeza ou quaisquer outros procedimentos adequados.


0

Isto é o que eu usei para pilotar o host local em execução na porta 80 (por angular cli) Obter informações do aplicativo em execução na porta 80

sudo lsof -i tcp:80

After That 
sudo kill -9 3348

onde 3348está o pid do processo em execução

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.