Estou tentando melhorar minhas habilidades de linha de comando e encontrei um problema em que não consigo eliminar um processo. Eu digito kill 2200
onde 2200 é meu PID e o processo não é interrompido. Após alguns minutos, a espera ainda está no top
e 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 fg
atualiza 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
command-line
process
Patryk
fonte
fonte
top
(conforme listado na edição). Eu só queria tentar colocar o programa para trabalhar em segundo plano e depois trazê-lo de volta.fg
oubg
para o processo)Respostas:
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:
Saiba mais lendo a página do manual:
fonte
kill -9
não funciona e o processo ainda está por aí?Se
kill
for 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 sequerkill -9
mata o processo. Por exemplo, quando um processo tem o estadoD
(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.fonte
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]
.fonte
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.
fonte
De dentro do C ++, eu executei:
E em um terminal linux (Ubuntu),
A saída foi:
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!
fonte
Você também pode usar
kill -l
para 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.fonte
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
onde
3348
está o pid do processo em execuçãofonte