Às vezes, quando eu quero sair rapidamente, eu faço kill -15 -1
. Notei que o bash está ignorando o SIGTERM.
Gostaria de saber qual é a lógica para esse comportamento bash ?
Não é muito UNIX'y ignorar o SIGTERM sem uma boa razão, não é?
ATUALIZAR:
mesmo (não) efeito para todos:
$ kill -TERM $$
$ type kill
kill is a shell builtin
$ command kill -TERM $$
$ /bin/kill -TERM $$
UPDATE2:
De man bash :
Quando o bash é interativo, na ausência de armadilhas, ele ignora o SIGTERM
Então é feito de propósito. Mas por que?
/bin/kill
ou o shell embutido? Neste último caso, estou supondo que o shell não se mate com seu próprio componente.Respostas:
Primeiro, isso não é específico para o bash. ATT ksh, dash e zsh se comportam da mesma maneira: eles ignoram SIGTERM e SIGQUIT durante a edição da linha de comando; quanto ao mksh, ele também não sai, mas os trata como SIGINT.
Tanto o manual do ksh quanto o manual do bash justificam ignorar o SIGTERM nestes termos:
kill 0
mata todos os processos no grupo de processos em que o shell está¹. Em poucas palavras, o grupo de processos consiste em todos os processos em execução em primeiro plano em um terminal ou em todos os processos em segundo plano ou trabalho suspenso.Mais precisamente, é isso o que acontece nas conchas modernas com controle de trabalho . Nessas conchas,
kill 0
não seria útil, pois o shell estaria em um grupo de processos próprio. Os shells mais antigos (ou shells modernos depoisset +m
) não criaram grupos de processos para comandos em segundo plano. Portanto, você pode usar o comandokill 0
para eliminar todos os comandos em segundo plano sem desconectar-sekill 0
.No entanto, existem outras situações semelhantes nas quais tornar a concha imune é útil. Considere o caso em que você possui processos que monopolizam um terminal e deseja matá-los sem sair do sistema. Muitos sistemas possuem uma ferramenta como a
pkill
qual permite matar os processos em execução em um terminal. Você pode executarpkill -t $TTY
oupkill -QUIT -t $TTY
eliminar todos os processos em execução no terminal atual, exceto o shell que ignora o sinal.Um shell normalmente desaparece quando o usuário o sai (com um comando como
exit
oulogout
) ou quando seu terminal sinaliza o final da entrada (o usuário pode causar isso pressionando Ctrl+ D) ou desaparece completamente. Neste último caso, o shell recebe o sinal SIGHUP, e não o ignora.Para o seu caso de uso de logoff de uma sessão X,
kill -15 -1
será feito, pois mata o emulador de terminal que faz com que o shell receba o SIGHUP. De fato, é suficiente matar o servidor X, mas isso exige encontrar seu ID do processo. Se você deseja que o mesmo comando funcione em uma sessão de texto, você pode usá-lokill -15 -1; exit
. É um comando muito perigoso de ter ao seu alcance de qualquer maneira.Seem Isso não parece ser mencionado nos manuais do shell como regra; é um recurso da chamada do sistema subjacente. É mencionado explicitamente na especificação POSIX .
² Atualmente, para fazer isso, execute
jobs -l
a exibição de uma lista de tarefas com o ID do grupo de processos e depoiskill -123 -456 …
mate os grupos de processos.fonte
Isso pode responder à sua pergunta:
FONTE : O manual GNU Bash
fonte