Como abortar um comando travado no servidor do Ubuntu?

8

Eu sei que existe ctrl + c , mas às vezes isso não funciona. No Ubuntu desktop eu posso apenas fechar a janela do terminal e abrir uma nova quando isso acontecer, mas como isso poderia ser resolvido usando a CLI no servidor Ubuntu (sem reiniciar a caixa)?

    
por CrazeD 30.11.2011 / 20:41

5 respostas

18

CTRL + C enviará SIGINT para o aplicativo. O aplicativo pode configurar um manipulador para este sinal ou pode ignorar o sinal. Por padrão, não há manipulador e SIGINT eliminará o aplicativo.

Você pode usar CTRL + \ , que enviará SIGQUIT . Isso também gerará um dump principal se o limite do núcleo não for zero.

Você pode suspender o processo e retornar ao shell com CTRL + Z , isso stop a execução do processo e retornar ao prompt do shell. O processo estará na memória e estará disponível como um trabalho no shell atual. Você pode então usar kill -SIGNAL %% ou kill -SIGNAL %<job_ID> para enviar um sinal para esse trabalho. Por exemplo. para matar o último emprego use kill -9 %%

Se nenhum deles estiver funcionando, você sempre pode enviar SIGTERM e, como último recurso, SIGKILL , o que encerrará qualquer processo. Este sinal como qualquer outro sinal deve ser enviado como o mesmo usuário que o processo que você está tentando parar ou como root. Para enviar SIGKILL para o processo, primeiro encontre o processo com ps aux ou ps -edf e, em seguida, execute kill -SIGKILL <process_ID> , em que <process_ID> é a coluna PID em ps output.

Os sinais não podem ser entregues se o processo estiver em uma chamada ininterrupta. Chamadas ininterruptas são funções do kernel que não podem ser interrompidas e geralmente acontecem por causa de um driver incorreto (por exemplo, um driver que não é reentrante ). Um processo que está em suspensão ininterrupta não pode ser interrompido até que a chamada seja concluída ou o servidor seja reiniciado.

Se um processo se tornar um zumbi , ele não usará recursos apenas ocupando espaço na tabela de processos. Um processo zumbi não pode receber sinais.

A lista de sinais para a arquitetura atual pode ser encontrada com kill -l

Veja as páginas de manual de kill , ps e bash . Para ver uma página man use algo como: man ps

    
por Mircea Vutcovici 30.11.2011 / 20:55
2

Se você tem acesso total ao console, você pode fazer Alt - F1..12 e obter um novo console.

De lá, você pode fazer uma listagem de processos da seguinte forma:

ps aux | grep <process-name>

Em seguida, faça um kill no ID do processo:

kill -9 <pid>

Se você não tiver acesso total ao console, basta abrir outra janela de terminal (talvez através do PuTTY ou similar), e fazer a listagem de processos acima e encerrar etapas.

    
por warren 30.11.2011 / 20:51
1

O Ctrl C envia um SIGINT para o seu processo em execução. Se você não quiser abrir outro console, você pode enviar um SIGQUIT com Ctrl \. Isto irá abordar a maioria dos aplicativos pendentes do dia a dia que o SIGINT não faz.

Eu pessoalmente queria uma maneira de enviar um SIGKILL com um atalho, mas não tenho conhecimento de uma maneira de fazer isso.

    
por Tim Brigham 30.11.2011 / 20:53
0

Considero que pgrep e pkill são mais fáceis de usar do que kill com um ID de processo explícito.

Além disso, em vez de começar com o sinal 9 (SIGKILL), considere começar com o padrão SIGTERM (15). Isso dará ao processo a chance de terminar com graça (se puder). pkill -15 thing e pkill thing devem ser equivalentes.

Veja como isso funcionaria. Digamos que o ntpd esteja suspenso.

Quais são os processos? (Você pode pular para pkill se você acredita que não terá falsos positivos).

$ pgrep -fl ntp
1034 /usr/sbin/ntpd
1037 /usr/sbin/ntpd

Mate os processos:

$ pkill ntpd

Use pgrep novamente para ver se foi bem-sucedido.

Se não, mova-se para pkill -9 .

    
por belacqua 18.06.2012 / 19:43
0

Você mudaria para um novo terminal, encontraria o PID do processo emperrado (usando ps ) e, em seguida, usaria kill para eliminar o processo. Eu usaria primeiro kill (PID) . Se isso não funcionar, usaria kill -9 (PID) . Se isso não parar o processo, a máquina precisará ser reinicializada.

    
por Bill Weiss 30.11.2011 / 20:48