Enviando sinais de kill diferentes para o init - como logar

4

Eu tenho que escrever um programa em C para verificar como o init reage a diferentes sinais de kill, mas não tenho certeza de como registrá-lo - por exemplo, o sinal número 14 trava o Ubuntu, então algum deles o desativa. Existe alguma maneira de registrá-lo corretamente para que eu saiba como o sistema reage a cada sinal? Aqui está o código C que eu uso, qualquer feedback sobre isso também seria apreciado:

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    int sigs[64] = { 0 };
    for(int i = 0; i < 64; i++) sigs[i] = i+1;
    char sigs_char[64][2];
    for(int i = 0; i < 64; i++) sprintf(sigs_char[i], "%d", sigs[i]);

    char one[2] = " 1";

    char commands[64][128];
    for(int i = 0; i < 64; i++){
        strcpy(commands[i], "sudo kill -s ");
        strncat(commands[i], sigs_char[i], 2);
        strcat(commands[i], one);
    }

    for(int i = 0; i < 64; i++){
        printf("Sending signal number %d\n", i);
        system(commands[i]);
    }
    return 0;
}
    
por LookingForKnowledge 13.11.2014 / 14:59

1 resposta

4

Eu tenho medo de que não haja uma maneira geral de "registrar" a reação de init . Primeiro, há o fato de que kill não fornecerá nenhum sinal para init que init não está manipulando (de man 2 kill ):

NOTES
       The only signals that can be sent to process ID 1,  the  init  process,
       are  those  for  which  init  has explicitly installed signal handlers.
       This is done to assure the system is not brought down accidentally.

Assim, para muitos sinais, não haverá reação alguma. Agora isso deixa os sinais que são manipulados. Usando este Unix & amp; Questão do Linux , podemos determinar os 1 :

$ HANDLED_SIGS=$(awk '/SigCgt/{print "0x"}' /proc/1/status)
$ for i in {0..31}; do (( (1 << i) & $HANDLED_SIGS )) && echo $((++i)) $(/bin/kill --list=$i); done | column
1 HUP   6 ABRT  11 SEGV 15 TERM 30 PWR
2 INT   10 USR1 14 ALRM 17 CHLD 32

Destes:

  • SIGABRT e SIGSEGV causaram core dumps e kernel panics. Nada a ser detectado aqui.
  • SIGTERM fez com que recarregasse, com mensagens de log em /var/log/syslog :

    Nov 14 00:25:13 vm kernel: [32383.384907] init: upstart-udev-bridge main process (395) terminated with status 1
    Nov 14 00:25:13 vm kernel: [32383.384916] init: upstart-udev-bridge main process ended, respawning
    Nov 14 00:25:13 vm kernel: [32383.384990] init: upstart-socket-bridge main process (649) terminated with status 1
    Nov 14 00:25:13 vm kernel: [32383.384995] init: upstart-socket-bridge main process ended, respawning
    Nov 14 00:25:13 vm kernel: [32383.385059] init: upstart-file-bridge main process (953) terminated with status 1
    Nov 14 00:25:13 vm kernel: [32383.385074] init: upstart-file-bridge main process ended, respawning
    
  • SIGINT fez com que ele iniciasse uma reinicialização e SIGPWR iniciou um desligamento. Ambos pareciam normais (por exemplo, como se você fizesse um reboot ).
  • Nenhum dos outros causou efeitos visíveis. (Embora, considerando as responsabilidades de init , podemos adivinhar o que o SIGCHLD faz.)

E tudo isso é para o Upstart. Quem sabe como o SysV ou o systemd reagirão?

Então, apesar de tudo, você não terá muita sorte com métodos empíricos aqui. Use a fonte, Luke.

1 Esse pedaço complicado de código é para obter os sinais que init está disposto a capturar:

HANDLED_SIGS=$(awk '/SigCgt/{print "0x"}' /proc/1/status)
for i in {0..31} 
do 
    (( (1 << i) & $HANDLED_SIGS )) && echo $((++i)) $(/bin/kill --list=$i); 
done | column
  • HANDLED_SIGS=$(awk '/SigCgt/{print "0x"}' /proc/1/status) : /proc/$PID/status contém muitas informações sobre o processo, incluindo o conjunto de sinais manipulados . Este conjunto é dado por SigCgt , um bitmask dado como um número hexadecimal. Usamos awk para extrair esse número e adicionar 0x como um prefixo.
  • (( (1 << i) & $HANDLED_SIGS )) : verifique se o sinal não. (i+1) está mascarado. Como estamos preocupados com o i th bit, usamos 2 (i-1) (que é 1 << i ). Com (( )) , um valor diferente de zero indica sucesso.
por muru 13.11.2014 / 20:09

Tags