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

171

CtrlO + Cnem sempre funciona para eliminar o processo atual (por exemplo, se esse processo estiver ocupado em determinadas operações de rede). Nesse caso, você apenas vê "^ 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+ Zcolocar o processo em suspensão e, em seguida kill -9 _process-pid_, fazer , onde encontra o pid do processo com o ps e outras ferramentas. No Bash (e possivelmente em outros shells), você pode fazer kill -9 %1(ou '% N' em geral) o que é mais fácil. Se o Ctrl+ Znão funcionar, você terá que abrir outro terminal e matar a partir daí.

Dustin Boswell
fonte
screenseria uma solução possível, permitindo criar uma nova janela e killo processo a partir daí.
Bobby
2
supondo que você já estavam em uma tela :)
Dustin Boswell

Respostas:

119

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

A maioria dos shells se liga a Ctrl+ Cpara "enviar um sinal SIGINT ao programa que atualmente é executado em primeiro plano". Você pode ler sobre os diferentes sinais através do sinal manual :

 SIGINT        2       Term    Interrupt from keyboard

Os programas podem ignorar esse sinal, como também podem ignorar o SIGTSTP :

 SIGTSTP   18,20,24    Stop    Stop typed at tty

(É o que a maioria das conchas 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 outros. Você pode enviar esses sinais através do comando kill . Portanto, para matar seu processo de enforcamento / zumbi, basta encontrar o ID do processo (PID). Por exemplo, use pgrepou pse então kill:

 % kill -9 PID
akira
fonte
13
Uma mera observação. Cuidado que "zumbi" é tecnicamente um estado de processo, e não é o mesmo que você quis dizer com "zumbi". (Um processo terminado que não tenha sido espera () - Ed por sua mãe é em zombie ( Z) estado Neste caso, não pode lidar com sinais de mais..)
Stéphane Gimenez
infelizmente, às vezes ctrl + c, ctrl + z e ctrl + \ all não fazem nada, e o processo está sendo executado desfazer sudo (permitido sem senha), portanto você não pode simplesmente enviar um sinal para o processo.
Michael
112

Se Ctrl+ C(SIGINT) não funcionar, tente Ctrl+ \(SIGQUIT). Em seguida, tente Ctrl+ Z(SIGTSTP). Se você retornar a um prompt do shell, faça killo ID do processo. (O padrão é o sinal SIGTERM, que você pode especificar kill -TERM. Em alguns shells, você pode usar %1o PID.) Se isso não funcionar, vá para outro terminal ou sessão SSH e faça killou kill -TERMno ID do processo. Somente como último recurso , você kill -KILLtambém deve kill -9, como não dá ao processo a chance de abortar de maneira limpa, sincronizar seus arquivos abertos, remover seus arquivos temporários, fechar conexões de rede etc.

Teddy
fonte
32

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!

(Restaurar para o primeiro plano novamente usando fg)

Depois, você pode killou kill -9que, dada a sua ID do processo (você conseguir que a partir ps a).

Daniel Beck
fonte
13
Com o bash, você pode kill $!, como $!é uma variável especial que contém o pid do último programa em segundo plano.
Lloeki
@Lloeki Não funciona para mim (pelo menos não é confiável). Eu tenho que bguma vez antes que a variável obtenha um valor atribuído.
Daniel Beck
2
@ Daniel, correto. É como eu disse no último processo em segundo plano , e assim bgque, após Ctrl + Z, ele é simplesmente suspenso.
Lloeki
2
Nota: isso não é apenas um truque, usar a pssaída (ou killall) é bastante arriscado se você tiver vários processos com o mesmo nome em execução. ps -e -o pid,commandfornecerá argumentos pid + completos, não apenas o nome do programa, mas novamente pode não ser suficiente para discriminar. Em contraste, $!é um sucesso garantido.
Lloeki
1
@Lloeki eu discordo. Exemplo de linha de saída do ps ameu sistema: 27721 s000 T 0:00.09 topQuantas Tinstâncias suspensas ( acho) do mesmo comando ( top) você está executando no mesmo tty ( s000)?
Daniel Beck
30

Veja este link também.

Ctrl+ Z: pausa um processo.

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

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

RoboAlex
fonte
"ctrl"+ "\"não funcionou para mim
Benyamin Jafari
13

Normalmente, você ainda pode parar o processo ( Ctrl+ Z) e usá-lo kill -9. Para kill -9, você precisa primeiro do processo PID . 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>
Olli
fonte
5

Uma solução mais simples para o Bash (e outras conchas?) É:

Ctrl-z      followed by     kill -9 %1

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

[1]+  Stopped                 <process name>

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

Dustin Boswell
fonte
4

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

2) Se você estiver conectado remotamente, faça o mesmo em outra sessão do terminal.

Você também pode facilitar a vida instalando o htop , que é uma versão mais versátil do top que permite eliminar seletivamente os processos em execução. A maioria das distros possui htop em um repositório.

3) se você está apenas preso em uma sessão ssh travada (para outro sistema, por exemplo), tente pressionar til (~), que é a tecla de escape, e pressione CTRL-Z para retornar à sessão do host. pode matar o processo ssh preso ou aguardar o tempo limite, o que a maioria ainda faz após um período de inatividade.

Linker3000
fonte
0

Se você estiver usando tmux ou screen, e nenhuma das opções acima funcionar, você ainda pode matar o painel <prefix> x, então o processo também é eliminado.

ospider
fonte
0

Talvez haja uma armadilha definida com SIGINT (2) no seu / etc / profile. Se sim, remova-o. Saia e faça login novamente, e você deve ser bom.

TechNo_phile
fonte