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

144

O Ctrl + C nem sempre funciona para matar o processo atual (por exemplo, se esse processo estiver ocupado em certas 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 colocar o processo em suspensão, e então fazer kill -9 _process-pid_ , onde você encontra o pid do processo com ps e outras ferramentas. Em Bash (e possivelmente outros shells), você pode fazer kill -9 %1 (ou '% N' em geral), que é mais fácil. Se Ctrl + Z não funcionar, você terá que abrir outro terminal e matar de lá.

    
por Dustin Boswell 09.02.2011 / 09:49

9 respostas

102

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

A maioria das shells liga Ctrl + C para "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

Os 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 através do comando kill . Então, para matar o processo pendente / zumbi, localize o ID do processo (PID). Por exemplo, use pgrep ou ps e, em seguida, kill it:

 % kill -9 PID
    
por 09.02.2011 / 10:13
96

Se Ctrl + C (SIGINT) não funcionar, tente Ctrl + \ (SIGQUIT) . Em seguida, tente Ctrl + Z (SIGTSTP). Se isso retornar a um prompt de shell, execute 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 SSH. sessão e faça kill ou kill -TERM no ID do processo. Apenas como último recurso você deve fazer kill -KILL , também conhecido como kill -9 , pois não dá ao processo nenhuma chance de abortar corretamente, sincronizar seus arquivos abertos, remover seus arquivos temporários, fechar a rede conexões, etc.

    
por 09.02.2011 / 10:36
27

Pressione Ctrl-Z para suspender o programa e coloque 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 para o primeiro plano usando fg )

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

    
por 09.02.2011 / 09:53
23

Veja este link também .

Ctrl + Z : pausa um processo.

Ctrl + C : peça educadamente que o processo seja encerrado agora.

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

    
por 19.06.2012 / 05:03
12

Normalmente, você ainda pode parar o processo ( Ctrl + Z ) e, em seguida, 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 tiver certeza de qual é o número de trabalhos 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>
    
por 09.02.2011 / 09:53
4

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

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 o htop , que é uma versão mais versátil do topo que permite que você mate seletivamente processos em execução. A maioria das distros tem htop em um repo.

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

    
por 09.02.2011 / 10:01
3

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 o número do trabalho quando pressionar Ctrl-z:

[1]+  Stopped                 <process name>

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

    
por 09.02.2011 / 23:40
0

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

    
por 18.04.2017 / 12:41
0

Talvez haja um trap configurado 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.

    
por 26.10.2017 / 15:16