Como cancelar um comando preso no servidor ubuntu?

11

Eu sei que há ctrl+ c, mas às vezes isso não funciona. Na área de trabalho do Ubuntu, basta fechar a janela do terminal e abrir uma nova quando isso acontecer, mas como isso seria resolvido usando a CLI no servidor Ubuntu (sem reiniciar a caixa)?

CrazeD
fonte

Respostas:

21

CTRL+Cenviará SIGINTpara o aplicativo. O aplicativo pode configurar um manipulador para esse sinal ou pode ignorá-lo. Por padrão, não há manipulador e SIGINTmatará o aplicativo.

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

Você pode suspender o processo e retornar ao shell com CTRL+Z, isso interromperá 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 usar kill -SIGNAL %%ou kill -SIGNAL %<job_ID>enviar um sinal para esse trabalho. Por exemplo, para matar o último empregokill -9 %%

Se nenhum deles estiver funcionando, você sempre poderá enviar SIGTERM, como último recurso, o SIGKILLque 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 raiz. Para enviar SIGKILLpara o processo, primeiro localize o processo com ps auxou ps -edf, em seguida kill -SIGKILL <process_ID>, execute , onde <process_ID>é a PIDcoluna na pssaída.

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 paradas e geralmente acontecem devido a um driver incorreto (por exemplo, um driver que não é reentrante ). Um processo que está em suspensão ininterrupta não pode ser parado até que a chamada seja concluída ou o servidor seja reiniciado.

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

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

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

Mircea Vutcovici
fonte
2

Se você tiver acesso total ao console, poderá fazê-lo Alt- F1..12e obter um novo console.

A partir daí, você pode fazer uma lista de processos da seguinte maneira:

ps aux | grep <process-name>

Em seguida, faça um killno ID do processo:

kill -9 <pid>

Se você não tiver acesso total ao console, basta abrir outra janela do terminal (talvez via PuTTY ou similar) e faça a lista de processos acima e elimine as etapas.

Warren
fonte
1

Ctrl C envia um SIGINT ao seu processo em execução. Se você não deseja abrir outro console, pode enviar um SIGQUIT com Ctrl \. Isso abordará a maioria dos aplicativos desligados do dia a dia que o SIGINT não.

Pessoalmente, eu queria uma maneira de enviar um SIGKILL com um atalho, mas não conheço uma maneira de fazê-lo.

Tim Brigham
fonte
1

Considero pgrepe sou pkillmais fácil de usar do que killcom um ID de processo explícito.

Além disso, em vez de começar com o sinal 9 (SIGKILL), considere começar com o SIGTERM padrão (15). Isso dará ao processo a chance de terminar normalmente (se possível). pkill -15 thinge pkill thingdeve ser equivalente.

Aqui está como isso funcionaria. Digamos que o ntpd esteja travado.

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

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

Mate os processos:

$ pkill ntpd

Use pgrepnovamente para ver se foi bem-sucedido.

Caso contrário, vá para pkill -9.

belacqua
fonte
0

Você mudaria para um novo terminal, encontraria o PID do processo travado (usando ps) e depois killo mataria. Eu usaria primeiro kill (PID). Se isso não funcionar, eu usaria kill -9 (PID). Se isso não interromper o processo, a máquina precisará ser reinicializada.

Bill Weiss
fonte
0

Cntrl+ \trabalhou para mim (onde Cntrl+ cou znão funcionou)

vineeshvs
fonte