Quando o sistema envia um SIGTERM para um processo?

18

Meu programa do 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. Em que condições o linux (busybox) envia um SIGTERM para um processo?

    
por michelemarcon 28.03.2011 / 16:31

2 respostas

12

Vou postar isso como uma resposta para que haja algum tipo de resolução, se isso for o problema.

Um status de saída de 0 significa uma saída normal de um programa bem-sucedido. Um programa de saída pode escolher qualquer número inteiro entre 0 e 255 como seu status de saída. Convencionalmente, os programas usam valores pequenos. Os valores 126 e acima são usados pelo shell para reportar condições especiais, então é melhor evitá-los.

No nível da API C, os programas informam um status de 16 bits¹ que codifica os dois status de saída do programa e o sinal que o matou, se houver.

No shell, um status de saída do comando (salvo em $? ) conflates o status de saída real do programa e o valor do sinal: se um programa é eliminado por um sinal, $? é definido para 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 usam 384 + número de sinal, o que evita a ambigüidade, mas as outras shells não seguiram o mesmo caminho).

Em particular, se $? for 0, seu programa saiu normalmente.

Note que isso inclui o caso de um processo que recebe SIGTERM, mas tem um manipulador de sinal para ele e, eventualmente, sai normalmente (talvez como uma conseqüência indireta do sinal SIGTERM, talvez não).

Para responder a pergunta no seu título, o SIGTERM nunca é enviado automaticamente pelo sistema. Existem alguns sinais que são enviados automaticamente, como SIGHUP quando um terminal desaparece, SIGSEGV / SIGBUS / SIGILL quando um processo faz coisas que ele não deveria estar fazendo, SIGPIPE quando ele escreve em um pipe / socket quebrado, etc. E existem alguns sinais que são enviados devido a um pressionamento de tecla em um terminal, principalmente SIGINT para Ctrl + C , SIGQUIT para Ctrl + \ e SIGTSTP para Ctrl + Z , mas SIGTERM não é um desses. Se um processo receber SIGTERM, algum outro processo enviou esse sinal.

¹ grosso modo

    
por 30.03.2011 / 20:58
6

SIGTERM é o sinal que é normalmente usado para finalizar administrativamente um processo.

Isso não é um sinal que o kernel enviaria, mas esse é o sinal que um processo normalmente enviaria para finalizar (graciosamente) outro processo.

Esse é o sinal enviado por padrão pelos comandos kill , pkill , killall , fuser -k ....

Esse é o sinal que é enviado aos daemons para pará-los (como em service some-service stop ), ou enviado por init antes do desligamento (seguido por SIGKILL para aqueles processos que não conseguiram terminar no tempo em SIGTERM).

Note que SIGTERM não é o sinal que é enviado em ^C . O sinal enviado em ^C é SIGINT.

    
por 23.05.2017 / 23:12