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:
-
SIGABRTeSIGSEGVcausaram core dumps e kernel panics. Nada a ser detectado aqui. -
SIGTERMfez 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 -
SIGINTfez com que ele iniciasse uma reinicialização eSIGPWRiniciou um desligamento. Ambos pareciam normais (por exemplo, como se você fizesse umreboot). - Nenhum dos outros causou efeitos visíveis. (Embora, considerando as responsabilidades de
init, podemos adivinhar o que oSIGCHLDfaz.)
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/statuscontém muitas informações sobre o processo, incluindo o conjunto de sinais manipulados . Este conjunto é dado porSigCgt, um bitmask dado como um número hexadecimal. Usamosawkpara extrair esse número e adicionar0xcomo um prefixo. -
(( (1 << i) & $HANDLED_SIGS )): verifique se o sinal não.(i+1)está mascarado. Como estamos preocupados com oith bit, usamos 2 (i-1) (que é1 << i). Com(( )), um valor diferente de zero indica sucesso.