web-dev-qa-db-fra.com

La racine peut-elle tuer le processus d'init?

La racine peut-elle tuer le processus d'init (le processus avec PID 1)? Quelles seraient ses conséquences?

40
Dharmit

Par défaut, non, ce n'est pas permis. Sous Linux (de man 2 kill):

Les seuls signaux qui peuvent être envoyés au processus ID 1, le processus init sont ceux pour lesquels init a explicitement installé des gestionnaires de signaux. Ceci est fait pour assurer que le système n'est pas traduit accidentellement.

PID 1 (INIT) peut décider de se permettre d'être tué, auquel cas le "tuer" est essentiellement une demande de se fermer. C'est un moyen possible de mettre en œuvre la commande halt, bien que je ne connaisse aucun init qui fait cela.

Sur un Mac, tuer launchd (son analogue init) avec signal 15 (SIGTERM) redémarre immédiatement le système, sans vous soucier de fermer les programmes d'exécution proprement. Le tuer avec le signal non incapable 9 (SIGKILL) ne fait rien, montrant que la sémantique de Mac's kill() Sémantique est la même que celle de Linux à cet égard.

Pour le moment, je n'ai pas de boîte linux utile que je suis prêt à expérimenter, alors la question de savoir ce que Linux init fait avec un sigterm devra attendre. Et avec init projets de remplacement comme UpStart et SystemD étant populaires ces jours-ci, la réponse pourrait être variable.

MISE À JOUR : sur Linux, init _ ignore explicitement SIGTERM, de sorte que cela ne fait rien. @jsbillings contient des informations sur ce que font le point de vue et SystemD.

38
Jander

Le SYSV INIT ignore les signaux SIGKILL ou SIGTERM. Le seul signal qui provoque un changement d'état est SIGPWR autant que je puisse dire, qui planifie une fermeture liée à la puissance.

Il semble que UPSTART et SystemD ne répondent pas non plus à SIGKILL, et de mon test, il semble qu'un SIGTERM provoque le reconstitution de UPSARD et SystemD.

Je ne sais pas ce que les autres interrogateurs fonctionnent, mais je suis à peu près sûr que vous ne pouvez pas tuer -9 (sigkill) ou tuer -15 (Sigterm) init (PID 1). Très probablement, si vous avez pu, vous obtiendrez une panique de noyau car init de manière inattendue avec un code de sortie non nul, qui serait moins qu'idéal. Cela ne ferme pas votre ordinateur ou ne le redémarre pas.

13
jsbillings

Techniquement oui, la racine peut émettre un sigkill à init. L'init, cependant, diffère de la plupart des autres processus en réalité, il est permis de piéger et d'ignorer le signal.

Vous pouvez, vaguement, tuer init en émettant un kill -TERM 1 qui serait analogue à la délivrance d'un halt ou shutdown dans cet init passera le signal à tous les enfants, essentiellement tous les autres processus, avant d'honorer le signal lui-même.

Remarque: effectuer cette commande Will Arrêtez votre système.

Pour la saveur; Un type d'autre processus qui peut "ignorer" un SIGKILL est un sommeil ininterrompt, tel qu'une attente d'E/S. Un tel processus pourrait être trouvé en émettant un ps axo stat,comm Lorsque les processus avec un statut 'd' sont ininterruptibles.

6
Tok

Vous pouvez redémarrer le processus init. Ceci est utile pour apporter des modifications à inittab sans avoir à redémarrer.

kill -HUP 1

Source: http://www.ycyberciti.biz/faq/linux-unix-kill-hup--reread-etcinittab-file/

6
jonescb

Sudo kill -INT 1 (interruption) va redémarrer le système et Sudo kill -SEGV 1, (violation de la segmentation) ou Sudo kill -ABRT 1 (Abort) générera une panique de noyau.

remarque: le sudo est requis.

4
ComMania

Eh bien, la racine peut tuer le processus init sur Linux:

strace -p 1 -o OUT &
kill -9 1

Des détails:

kill -9 1 ne fonctionne pas:

-bash-4.3# trace-cmd start -e signal_deliver -f 'common_pid == 1' -e signal_generate -f 'pid == 1'

-bash-4.3# echo "My first attempt" >/sys/kernel/debug/tracing/trace_marker
-bash-4.3# kill -9 1

-bash-4.3# trace-cmd show # there is no signal_deliver-event
...
        bash-164   [000] .N..    29.302996: tracing_mark_write: My first attempt
        bash-164   [000] d...    29.312586: signal_generate: sig=9 errno=0 code=0 comm=systemd pid=1 grp=1 res=1

Alors, courons strace:

-bash-4.3# echo 1 >/proc/sys/kernel/ftrace_dump_on_oops
-bash-4.3# strace -p 1 -o OUT &
[1] 179
strace: Process 1 attached
-bash-4.3# echo "My second attempt" >/sys/kernel/debug/tracing/trace_marker
-bash-4.3# kill -9 1

bash-4.3# [  134.943439] Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000009
[  134.943439]
[  134.943439] CPU: 0 PID: 1 Comm: systemd Not tainted 4.7.2-201.fc24.x86_64 #1
[  134.943439] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.9.1-1.fc24 04/01/2014
[  134.943439]  0000000000000086 00000000610ec632 ffff88001ea43c10 ffffffff813d941f
[  134.943439]  ffffffff81a290c0 ffff88001ea43ca8 ffff88001ea43c98 ffffffff811b2cb6
[  134.943439]  ffffffff00000010 ffff88001ea43ca8 ffff88001ea43c40 00000000610ec632
[  134.943439] Call Trace:
[  134.943439]  [<ffffffff813d941f>] dump_stack+0x63/0x84
[  134.943439]  [<ffffffff811b2cb6>] panic+0xde/0x22a
[  134.943439]  [<ffffffff810a40ac>] do_exit+0xb6c/0xb70
[  134.943439]  [<ffffffff810a4137>] do_group_exit+0x47/0xb0
[  134.943439]  [<ffffffff810af3ed>] get_signal+0x28d/0x630
[  134.943439]  [<ffffffff81025f57>] do_signal+0x37/0x6c0
[  134.943439]  [<ffffffff8100325b>] ? do_audit_syscall_entry+0x4b/0x70
[  134.943439]  [<ffffffff810ca250>] ? wake_up_q+0x70/0x70
[  134.943439]  [<ffffffff8100330c>] exit_to_usermode_loop+0x8c/0xd0
[  134.943439]  [<ffffffff81003df3>] do_syscall_64+0x103/0x110
[  134.943439]  [<ffffffff817eb921>] entry_SYSCALL64_slow_path+0x25/0x25
[  134.943439] Dumping ftrace buffer:
[  134.943439] ---------------------------------
[  134.943439]     bash-154     0.... 10592888us : tracing_mark_write: My first attempt
[  134.943439]     bash-154     0d... 17328079us : signal_generate: sig=9 errno=0 code=0 comm=systemd pid=1 grp=1 res=1
[  134.943439]     bash-154     0.... 80772500us : tracing_mark_write: My second attempt
[  134.943439]     bash-154     0dN.. 85426791us : signal_generate: sig=9 errno=0 code=0 comm=systemd pid=1 grp=1 res=0
[  134.943439]  systemd-1       0d... 85437478us : signal_deliver: sig=9 errno=0 code=0 sa_handler=0 sa_flags=0
[  134.943439] ---------------------------------
[  134.943439] Kernel Offset: disabled
[  134.943439] ---[ end Kernel panic - not syncing: Attempted to kill     init! exitcode=0x00000009
[  134.943439]
2