O que fazer quando Ctrl-C não mata o trabalho em execução?

98

Às vezes, os processos ignoram o sinal SIGINT enviado por Ctrl- Cno Bash. Por exemplo, mane vi. Supondo que você não queira pesquisar no google ou ler o manual sobre como sair do processo em execução, existe alguma sequência de teclas que sempre funcionará (sem sair do terminal)?

Olivier Lalonde
fonte

Respostas:

141

Envie o sinal SIGQUIT com Ctrl+ \.

.. $ sleep 10
^\Quit

→ Isso é equivalente a kill -3 pid. Programas executados no espaço do usuário não ignoram o sigquit.

Há também um conjunto de atalhos de teclado do Magic SysRq . Um dos mais interessantes é o seguinte: Alt+ SysRq+ k. Ele mata todos os processos no console virtual atual. Se um de seus ttys estiver completo e totalmente quebrado, isso pode ser usado para voltar . No tty executando o X.org, ele pode ser usado para matar o X sem piedade.

A tecla SysRq é, na maioria dos teclados, a mesma da tecla Print. No meu notebook, ele pode ser chamado usando a tecla Fn; Ou seja, Alt → Fn → Imprimir → k nessa ordem.

Aqui estão alguns dos atalhos básicos de gerenciamento de processos:

  • Ctrl+ Z: pausar um processo (mais bgpara retomar em segundo plano, fgaumentar para primeiro plano)
  • Ctrl+ C: peça educadamente que o processo seja encerrado agora
  • Ctrl+ \: elimina impiedosamente o processo que está atualmente em primeiro plano
  • Alt+ SysRq+ s: Grava dados no disco (sempre faça isso antes de eliminar qualquer coisa importante)
  • Alt+ SysRq+ s, k: Matar sem piedade todos os processos atuais sobre um determinado console virtual
  • Alt+ SysRq+ s, b: Reiniciar impiedosamente sem desmontar,
  • Alt+ SysRq+ r, e, i, s, u, b: Com segurança r eboot e ven i f o s istema é u tterly b roken,

Nota: Ctrl+ Z, em contraste com Ctrl+ Ce Ctrl+ \, também funciona para man, vi, lesse afins.

Em caso de dúvida, o procedimento a seguir quase sempre funciona:

~$ sleep 10
^Z
[5]+  Stopped              sleep 10
~$ ps
  PID TTY          TIME CMD
 4804 pts/0    00:00:00 bash
 6207 pts/0    00:00:00 sleep
 6208 pts/0    00:00:00 ps
~$ kill -9 6207
[5]+  Killed                  sleep 10
~$ 

^ É claro que Z indica que Ctrl+ Zfoi pressionado.


Para uma visão mais aprofundada dos shells e terminais, veja também minhas respostas em:

Stefano Palazzo
fonte
3
Funciona para "dormir 10", mas ainda não funciona para "homem" ou "vi". Obviamente, "kill -9 pid" funciona para matar os dois processos. Estou esquecendo de algo?
Olivier Lalonde
3
Ctrl + Z trabalha com coisas como menos, man, vi e assim por diante. Você pode matá-los fazendo um pspara ver a identificação do processo e matá-los usando kill pidou, se você não se importa com outras instâncias do programa killall vi,. De qualquer forma, Ctrl-Z sempre parece funcionar.
Stefano Palazzo
5
Você também pode fazer kill %%para matar o último trabalho e kill %5onde 5 é o número de trabalho mostrado na jobs.
precisa
2
Ctrl- \ envia um SIGQUIT , não um SIGKILL. Existem algumas diferenças importantes entre SIGQUIT e SIGKILL. pt.wikipedia.org/wiki/SIGQUIT
Juliano
4
Como pressionar Ctrl+ \ quando não há \ tecla no layout do teclado?
Forivin
14

Você pode tentar Ctrl+\

Benjamin
fonte
1
Não funciona com manou vi.
Hipopótamo
1
funcionou o ubuntu 16.04
kRazzy R:
8

Às vezes, ele CTRL+Cestá sendo enviado para o programa ou canal de entrada errado. Isso é especialmente comum em editores como vi, com comandos com saída canalizada, comandos bash complexos envolvendo loops, etc.

Uma solução simples e rápida é suspender o trabalho CTRL+Ze depois matá-lo pelo número do trabalho: kill %1ou kill -9 %1, etc.

tylerl
fonte
6
  • Experimente um destes:

    Ctrl+4

    Ctrl+\


  • Ou:

    Ctrl+ Ze, em seguida, execute:

    kill %1

Onde %1está o número de trabalhos retornados quando você pressionou Control- Z. Adicione -9para forçar a matança.


Quando você estiver no console de texto, também poderá tentar: Ctrl- SysRq. O kernel deve matar o processo.

Ou SysRq- k, mate todos os processos no console virtual atual (também pode matar os programas X e svgalib).

Nota: Quando as teclas mágicas SysRq são usadas para matar um programa gráfico congelado, o programa não tem chance de restaurar o modo de texto. Isso pode tornar tudo ilegível.

Veja: Tecla Magic SysRq e suas combinações de comandos.

kenorb
fonte
3

Para sair do man , use q Para deixar vi use:q

antivirtel
fonte
0

É possível que você tenha alterado o atalho da cópia de:

CTRL+ SHIFT+C

Para

CTRL+C

Dessa forma, quando você tenta matar um processo, o CTRL+ Cnão funciona.

Tente substituir o atalho da cópia para CTRL+ SHIFT+ C.

Minter
fonte
1
Alterar o atalho da cópia é irrelevante para forçar a finalização de um processo!
SuB
Você pode expandir um pouco sua resposta? Passo a passo seria o ideal, principalmente para que o OP possa acompanhar sua sugestão. :)
ThatGuy
Isso realmente me ajudou. Estou acostumado a CTRL + C no MacOS e não percebi que o comando Ubuntu era CTRL + SHIFT + C
ratskin 14/02
-1

Experimente Ctrl+ Alt+Backspace

Se você estiver usando o ubuntu 10.04, você deseja habilitar esta chave para funcionar.

Para ativar Control- Alt-Backspace

Ir para Sistema -> Preferências -> Teclado

Selecione a guia Layouts e clique nas Opções de layout .

Selecione Sequência de teclas para matar o servidor X e ativar Control+ Alt+Backspace .

Nota:

Pressionar Ctrl- Alt- Backspacereiniciará o servidor X.

karthick87
fonte
A questão foi editada para deixar claro que quero eliminar o processo de dentro do terminal.
precisa