Meu programa servidor recebeu um SIGTERM e parou (com o código de saída 0). Estou surpreso com isso, pois tenho certeza de que havia muita memória para isso. Sob quais condições o linux (busybox) envia um SIGTERM para um processo?
24
$?
seria definido como 143 (128 + número do sinal).Respostas:
Vou postar isso como resposta, para que haja algum tipo de resolução, se esse for o problema.
Um status de saída 0 significa uma saída normal de um programa bem-sucedido. Um programa existente pode escolher qualquer número inteiro entre 0 e 255 como status de saída. Convencionalmente, os programas usam valores pequenos. Os valores 126 e acima são usados pelo shell para relatar condições especiais; portanto, é melhor evitá-las.
No nível da API C, os programas relatam um status de 16 bits¹ que codifica o status de saída do programa e o sinal que o interrompeu , se houver.
No shell, o status de saída de um comando (salvo em
$?
) conflita o status de saída real do programa e o valor do sinal: se um programa é morto por um sinal,$?
é definido como um valor maior que 128 (com a maioria dos shells, esse valor é 128 mais o número do sinal; ATT ksh usa 256 + número de sinal e yash usa 384 + número de sinal, o que evita a ambiguidade, mas as outras conchas não seguiram o exemplo).Em particular, se
$?
for 0, seu programa saiu normalmente.Observe que isso inclui o caso de um processo que recebe o SIGTERM, mas possui um manipulador de sinal e, eventualmente, sai normalmente (talvez como uma conseqüência indireta do sinal do SIGTERM, talvez não).
Para responder à pergunta em seu título, o SIGTERM nunca é enviado automaticamente pelo sistema. Existem alguns sinais que são enviados automaticamente como SIGHUP quando um terminal sai, SIGSEGV / SIGBUS / SIGILL quando um processo faz coisas que não deveriam estar fazendo, SIGPIPE quando grava em um tubo / soquete quebrado etc. alguns sinais enviados devido ao pressionamento de tecla em um terminal, principalmente SIGINT para Ctrl+ C, SIGQUIT para Ctrl+ \e SIGTSTP para Ctrl+ Z, mas o SIGTERM não é um deles. Se um processo recebe o SIGTERM, algum outro processo envia esse sinal.
¹ grosso modo
fonte
exit
. Ayash
abordagem é um bom compromisso, mas veja rc por outro. Consulte também Código de saída padrão quando o processo é finalizado?SIGTERM é o sinal normalmente usado para finalizar administrativamente um processo.
Esse não é um sinal que o kernel enviaria, mas é o sinal que um processo normalmente enviaria para finalizar (normalmente) outro processo.
Esse é o sinal que é enviado por padrão pelos
kill
,pkill
,killall
,fuser -k
... comandos.Esse é o sinal enviado aos daemons para interrompê-los (como no a
service some-service stop
) ou enviadoinit
antes do desligamento (seguido pelo SIGKILL para os processos que não conseguiram terminar a tempo no SIGTERM).Observe que SIGTERM não é o sinal enviado
^C
. O sinal enviado^C
é SIGINT.fonte