Como encerro todos os processos com o mesmo nome de uma maneira mais suave do que killall
faz? Não quero interromper os processos, mas deixe-os tempo para sair corretamente.
Veja também:
Como eu mato processos no Ubuntu?
No System Monitor, qual é a diferença entre Kill Process e End Process?
Por que killall (às vezes?) Precisa ser aplicado duas vezes?
command-line
process
kill
killall
noz sobre natty
fonte
fonte
Respostas:
1. `killall` já é legal (SIGTERM)
killall
por padrão enviaSIGTERM
. Essa já é a boa abordagem que deixa os aplicativos com a chance de se limparem. O "vá morrer já, agora!" A abordagem é enviar umSIGKILL
sinal, o que requer especificar isso como uma opção parakillall
. Da Biblioteca GNU C: Sinais de Terminação :2. O "Processo final" do System Monitor é igualmente agradável (SIGTERM também)
Você está vinculado a uma pergunta sobre o GNOME System Monitor. Isso também é usado
SIGTERM
para a ação "Finalizar processo" (e percebo que estou contradizendo a resposta a essa pergunta). Você pode encontrá-lo no código fonte para verificar a si mesmo:data / menus.ui :
Os 15 aqui são o número do sinal. O sinal 15 é
SIGTERM
. E o System Monitor já foi utilizadoSIGTERM
bem antes que outra pergunta fosse feita e respondida.Adendo técnico (em resposta a um comentário)
Examinando a representação do Github de
git blame
, aqui estão as mudanças que foram feitas na forma como os sinais são escritos no código-fonte do GNOME System Monitor:383007f2 24 de julho de 2013 Código duplicado substituído para enviar sinais com os parâmetros do
GAction 0e766b2d 18 de julho de 2013 Menu pop-up do processo da porta para o GAction
97674c79 3 de outubro de 2012 Livre-se da estrutura do ProcData
38c5296c 3 de julho de 2011 Torne a indentação uniforme nos arquivos de origem.
Nada disso foi alterado de
SIGQUIT
paraSIGTERM
e o último foi de antes da pergunta vinculada.fonte
15
? Pode ter sido alterado em algum momento, portanto a resposta antiga pode estar 100% correta em relação a uma versão antiga.git grep 'SIGQUIT'
não revela nada. Nada relacionado a sinais também é encontradogit grep '>3<'
. Concluo que provavelmente o monitor do sistema gnome nunca foi usadoSIGQUIT
.git grep
apenas pesquisa na árvore atual, não em todo o histórico. Eu useigit blame
(na verdade o equivalente ao Github) para cavar um pouco mais fundo, mas ainda nada.A resposta do @hvd está basicamente correta. Para dar ainda mais suporte, o
init
processo será enviado primeiroSIGTERM
aos processos quando você estiver desligando o computador e depois de um atraso será enviadoSIGKILL
se eles ainda não tiverem saído. Os processos não podem manipular / ignorarSIGKILL
.Para dar um pouco mais de detalhes, a resposta real é que você não tem como saber com certeza que o programa lida com isso.
SIGTERM
é o sinal mais comum a ser usado para pedir educadamente a um programa para sair, mas toda a manipulação de sinais depende do programa fazer algo com o sinal.Em outras palavras, com base nas outras respostas, se você tivesse um programa escrito por @Jos ou por @AlexGreg, eles provavelmente estariam lidando com,
SIGQUIT
mas possivelmente nãoSIGTERM
, e, portanto, o envioSIGTERM
seria menos "suave" do queSIGQUIT
.Eu escrevi um código para que você possa brincar com ele. Salve o abaixo como
signal-test.c
e compile comVocê pode executá-lo
./signal-test
e ver o que acontece quando envia sinais diferentes comkillall -s <signal>
.Tal como está, o código lida com SIGTERM e SIGQUIT normalmente. Você pode tentar comentar as linhas
signal(SIG...
(usando a//
no início da linha) para remover o manipulador de sinais, executar e enviar os sinais novamente. Você poderá ver essas diferentes saídas:dependendo se você lida com os sinais ou não.
Você também pode tentar ignorar os sinais:
Se você fizer isso, o envio
SIGTERM
não fará nada, você precisará usarSIGKILL
para finalizar o processo.Mais detalhes em
man 7 signal
. Observe que o usosignal()
dessa maneira é considerado não portátil - é muito mais fácil do que a alternativa!Uma outra nota de rodapé menor - no Solaris,
killall
tenta matar todos os processos. Todos eles. Se você executá-lo como root, poderá se surpreender :)fonte
pkill
. A outra razão é que ele é emparelhadopgrep
, o que facilita a verificação exata de quais processos serão eliminados e qual ela mesma possui melhor semântica de correspondência do queps | grep
."Terminar tudo" seria
killall -s SIGQUIT [process name]
. Se você deseja uma solução sofisticada, definaalias endall='killall -s SIGQUIT'
.fonte
SIGQUIT
é como fazer o processoabort(3)
: despeja o núcleo e depois mata o processo. Isso não é de maneira alguma mais agradável / gentil / gentil doSIGTERM
que o padrãokillall
.SIGQUIT
(ou melhor aindaSIGINT
) , pode ser tratado com mais suavidade do queSIGTERM
, mas isso depende da aplicação. Sem tratamento, qualquer um deles causa rescisão imediata.