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)?
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)?
Respostas:
CTRL+Cenviará SIGINT
para o aplicativo. O aplicativo pode configurar um manipulador para esse sinal ou pode ignorá-lo. Por padrão, não há manipulador e SIGINT
matará 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 SIGKILL
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 raiz. Para enviar SIGKILL
para o processo, primeiro localize o processo com ps aux
ou ps -edf
, em seguida kill -SIGKILL <process_ID>
, execute , onde <process_ID>
é a PID
coluna na ps
saí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
, ps
e bash
. Para ver uma página de manual, use algo como:man ps
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 kill
no 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.
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.
Considero pgrep
e sou pkill
mais fácil 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 SIGTERM padrão (15). Isso dará ao processo a chance de terminar normalmente (se possível).
pkill -15 thing
e pkill thing
deve 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 pgrep
novamente para ver se foi bem-sucedido.
Caso contrário, vá para pkill -9
.
Você mudaria para um novo terminal, encontraria o PID do processo travado (usando ps
) e depois kill
o 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.