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
eSIGSEGV
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 eSIGPWR
iniciou 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 oSIGCHLD
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 porSigCgt
, um bitmask dado como um número hexadecimal. Usamosawk
para extrair esse número e adicionar0x
como um prefixo. -
(( (1 << i) & $HANDLED_SIGS ))
: verifique se o sinal não.(i+1)
está mascarado. Como estamos preocupados com oi
th bit, usamos 2 (i-1) (que é1 << i
). Com(( ))
, um valor diferente de zero indica sucesso.