Questão O que fazer quando Ctrl + C não pode matar um processo?


Ctrl + C nem sempre funciona para eliminar o processo atual (por exemplo, se esse processo estiver ocupado em determinadas operações de rede). Nesse caso, você vê apenas "^ C" pelo seu cursor e não pode fazer muito mais.

Qual é a maneira mais fácil de forçar esse processo a morrer agora sem perder meu terminal?

Resumo das respostas: Normalmente você pode Ctrl + Z para colocar o processo para dormir e, em seguida, fazer kill -9 _process-pid_, onde você encontra o pid do processo com ps e outras ferramentas. Em Festança (e possivelmente outras conchas), você pode fazer kill -9 %1 (ou '% N' em geral), o que é mais fácil. E se Ctrl + Z não funciona, você terá que abrir outro terminal e matar de lá.


139


origem


screen seria uma solução possível, permitindo criar uma nova janela e kill o processo a partir daí. - Bobby
supondo que você já estivesse em uma tela :) - Dustin Boswell


Respostas:


Para entender o problema do porquê Ctrl + C não funciona, é muito útil entender o que acontece quando você pressiona:

A maioria das conchas liga Ctrl + C "enviar um SIGINT sinal para o programa que atualmente é executado em primeiro plano ". Você pode ler sobre os diferentes sinais via sinal de homem:

 SIGINT        2       Term    Interrupt from keyboard

Programas podem ignorar esse sinal, pois eles podem ignorar SIGTSTP também:

 SIGTSTP   18,20,24    Stop    Stop typed at tty

(Que é o que a maioria das shells faz quando você pressiona Ctrl + Z, e é por isso que não é garantido que funcione.)

Existem alguns sinais que não podem ser ignorados pelo processo: SIGKILL, SIGSTOP e alguns outros. Você pode enviar esses sinais via matar comando. Então, para matar seu processo de enforcar / zumbi, é só encontrar o ID do processo (PID). Por exemplo, use pgrep ou ps e depois kill isto:

 % kill -9 PID

101



Uma mera observação. Cuidado que "zumbi" é tecnicamente um estado de processo, e não é o mesmo que você quis dizer aqui por "zumbi". (Um processo finalizado que não foi aguardado () pelo seu pai está em zumbi (Z) Estado. Neste caso, não pode mais lidar com sinais.) - Stéphane Gimenez
infelizmente, às vezes, ctrl + c, ctrl + z e ctrl + \ não fazem nada, e o processo está executando o undo sudo (permitido sem uma senha), então você não pode simplesmente enviar um sinal para o processo. - Michael


E se Ctrl+C (SIGINT) não funciona, tente Ctrl+\ (SIGQUIT) Então tente Ctrl+Z (SIGTSTP) Se isso retornar você a um prompt de shell, faça kill no ID do processo. (Esse padrão é o sinal SIGTERM, que você pode especificar com kill -TERM. Em alguns shells, você pode usar %1 para se referir ao PID.) Se isso não funcionar, vá para outro terminal ou sessão SSH e faça kill ou kill -TERM no ID do processo. Apenas como último recurso você deveria fazer kill -KILL, a.k.a. kill -9, pois não dá ao processo qualquer chance de abortar de forma limpa, sincronizar seus arquivos abertos, remover seus arquivos temporários, fechar conexões de rede, etc.


90





Pressione Ctrl-Z para suspender o programa e colocá-lo em segundo plano:

Suspend the program currently running and put it in the background.
This does not stop the process as it does in VMS!

(Restaure novamente em primeiro plano usando fg)

Então você pode kill ou kill -9 isso, dado seu ID de processo (você obtém isso de ps a).


25



Com festança você pode kill $!, Como $! é uma variável especial contendo o pid do último programa em segundo plano. - Lloeki
@Lloeki Não funciona para mim (pelo menos não confiável). Eu tenho que bg uma vez antes, a variável recebe um valor atribuído. - Daniel Beck♦
@ Daniel, correto. É como eu disse o último com fundo processo, assim precisa bg como logo após Ctrl + Z ele está meramente suspenso. - Lloeki
Nota: isto não é apenas um truque, usando ps saída (ou killall) é bastante arriscado se você tiver vários processos com o mesmo nome em execução. ps -e -o pid,command irá fornecer pid + full args, não apenas o nome do programa, mas novamente pode não ser suficiente para discriminar. Em contraste $! é um sucesso certo. - Lloeki
@Lloeki eu discordo. Exemplo de linha de saída de ps a no meu sistema: 27721 s000 T 0:00.09 top Quantos suspensos (T, Eu acho) instâncias do mesmo comando (topvocê está correndo no mesmo tty?s000)? - Daniel Beck♦


Veja isso ligação também.

Ctrl+Z: pausa um processo.

Ctrl+C: educadamente, peça para o processo encerrar agora.

Ctrl+\: mate impiedosamente o processo que está atualmente em primeiro plano


21





Normalmente, você ainda pode parar o processo (Ctrl + Z) e depois usar kill -9. Para kill -9, você precisa do processo PID primeiro. Para trabalhos em segundo plano, kill -9 %1 é a maneira mais fácil de fazer isso - se você não tem certeza qual é o número de trabalho em segundo plano que deseja matar, execute jobs.

Como alternativa, você pode encontrar o ID do processo com

ps

Então você pode correr

kill -9 <Appropriate PID from ps output>

10





1) Se você estiver no console e no modo multiusuário, você pode pressionar CTRL-ALT-Fn e fazer o login em outra tela, use ps -ef | grep <myprocessname> ou pidof <myprocessname> e então mate -9 o processo pelo número de identificação.

2) Se você estiver conectado remotamente, faça o mesmo através de outra sessão de terminal.

Você também pode tornar a vida um pouco mais fácil instalando htop, que é uma versão mais versátil do topo que permite matar seletivamente os processos em execução. A maioria das distros tem htop em um repo.

3) se você está apenas preso em uma sessão suspensa ssh (para outro sistema, por exemplo), tente pressionar til (~), que é a chave de escape, e pressione CTRL-Z para voltar para a sessão do host, então você pode matar o processo ssh preso ou esperar que ele atinja o tempo limite, o que a maioria fará depois de um período de inatividade.


4





Uma solução mais simples para o Bash (e outros shells?) É fazer:

Ctrl-z      followed by     kill -9 %1

onde '% 1' refere-se ao número do trabalho que está sendo morto. Pode ser '% 2' (ou outra coisa) se você já tiver outros trabalhos dormindo. Você pode ver qual número de trabalho é quando você pressiona Ctrl-z:

[1]+  Stopped                 <process name>

Note que 'kill' é a versão do shell de kill, não de / bin / kill.


3





Se você estiver usando tmux ou screen, e nenhum dos trabalhos acima, você ainda pode matar o painel por <prefix> x, então o processo também é morto.


0





Talvez haja uma armadilha configurada com SIGINT (2) em seu / etc / profile. Em caso afirmativo, remova-o. Faça o logout e faça o login novamente e você deve ser bom.


0