2011-02-09 08:49:24 +0000 2011-02-09 08:49:24 +0000
183
183

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

Ctrl + C nem sempre funciona para matar o processo actual (por exemplo, se esse processo estiver ocupado em certas operações de rede). Nesse caso, você só 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 o meu terminal?

Resumo das respostas: Normalmente, você pode Ctrl + Z para colocar o processo a dormir, e depois fazer kill -9 _process-pid_, onde você encontra o pid do processo com ps e outras ferramentas. Em Bash (e possivelmente outras conchas), pode fazer kill -9 %1 (ou ‘%N’ em geral), o que é mais fácil. Se o Ctrl + Z não funcionar, terá de abrir outro terminal e kill a partir daí.

Respostas (9)

127
127
127
2011-02-09 09:13:54 +0000

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

A maioria das shells ligam Ctrl + C para “enviar um sinal SIGINT para o programa que actualmente corre em primeiro plano”. Pode ler sobre os diferentes sinais através de man signal :

SIGINT 2 Term Interrupt from keyboard

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

SIGTSTP 18,20,24 Stop Stop typed at tty

(que é o que a maioria das shells fazem quando pressiona Ctrl + Z, razão pela qual não é garantido que funcione)

Existem alguns sinais que não podem ser ignorados pelo processo: SIGKILL , SIGSTOP e alguns outros. Pode enviar estes sinais através do comando kill . Então, para matar o seu processo de enforcamento / zombie, basta encontrar o process ID (PID). Por exemplo, use pgrep ou ps e depois kill it:

% kill -9 PID
119
119
119
2011-02-09 09:36:15 +0000

Se Ctrl+C (SIGINT) não funcionar, experimente Ctrl+\ (SIGQUIT). Depois experimente o Ctrl+Z (SIGTSTP). Se isso o devolve a uma shell prompt, faça kill no ID do processo. (Este padrão é o sinal SIGTERM, que pode especificar com kill -TERM. Em algumas shells, poderá usar o %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 caso faça o kill -KILL, também conhecido como kill -9, pois não dá ao processo qualquer hipótese de abortar de forma limpa, sincronizar os seus ficheiros abertos, remover os seus ficheiros temporários, fechar ligações de rede, etc.

37
37
37
2012-06-19 03:03:03 +0000

Ver também este link .

Ctrl+Z: pausar um processo.

Ctrl+C: pedir educadamente que o processo seja encerrado agora.

Ctrl+: matar sem piedade o processo que está actualmente em primeiro plano

33
33
33
2011-02-09 08:53:17 +0000

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 primeiro plano novamente usando fg)

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

13
13
13
2011-02-09 08:53:41 +0000

Normalmente, ainda se pode parar o processo (Ctrl + Z) e depois usar o kill -9. Para kill -9, você precisa primeiro do Process PID . Para trabalhos em background, kill -9 %1 é a forma mais fácil de o fazer - se não tem a certeza do número de trabalhos em background que quer matar, corra jobs.

Em alternativa, pode encontrar o ID do processo com

ps

Depois pode correr

kill -9 <Appropriate PID from ps output>
5
5
5
2011-02-09 22:40:53 +0000

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

Ctrl-z followed by kill -9 %1

onde “%1” se refere ao número do trabalho que está a ser morto. Pode ser “%2” (ou outra coisa qualquer) se já tiver outros trabalhos a dormir. Pode ver qual é o número da tarefa quando atinge Ctrl-z:

[1]+ Stopped <process name>

Note que ‘kill’ é a versão da concha de kill, e não /bin/kill.

4
4
4
2011-02-09 09:01:45 +0000

1) Se estiver na consola e em modo multi-utilizador, pode pressionar CTRL-ALT-Fn e fazer login noutro ecrã, usar ps -ef | grep <myprocessname> ou pidof <myprocessname> e depois matar -9 o processo por número de ID.

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

Também pode facilitar um pouco a vida instalando htop , que é uma versão mais versátil do topo que lhe permite matar selectivamente processos em execução. A maioria das distros tem htop em um repo.

3) se você estiver apenas preso em uma sessão ssh pendurada (para outro sistema, por exemplo), tente pressionar til (~), que é a tecla escape, e então pressione CTRL-Z para voltar à sessão host, então você pode matar o processo ssh preso ou esperar que ele fique sem tempo, o que a maioria dos sill faz após um período de inatividade.

0
0
0
2017-04-18 10:41:06 +0000

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

0
0
0
2017-10-26 13:16:30 +0000

Talvez haja uma armadilha com SIGINT(2) no seu /etc/profile. Se assim for, remova-o. Saia e volte a iniciar sessão e deverá estar bem.