Réponses:
Par défaut, non, ce n'est pas autorisé. Sous Linux (depuis man 2 kill
):
Les seuls signaux pouvant ê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 s'assurer que le système n'est pas arrêté accidentellement.
Pid 1 (init) peut décider de se laisser tuer, auquel cas le "kill" est essentiellement une demande pour qu'il se ferme lui-même. C'est un moyen possible d'implémenter la halt
commande, bien que je ne sache pas init
qu'il en soit ainsi.
Sur un Mac, la suppression launchd
(son signal analogique) avec le signal 15 (SIGTERM) redémarre immédiatement le système, sans avoir à arrêter d'éteindre les programmes en cours d'exécution. Le tuer avec le signal non joignable 9 (SIGKILL) ne fait rien, montrant que la kill()
sémantique de Mac est la même que celle de Linux à cet égard.
Pour le moment, je ne suis pas prêt à expérimenter Et avec init
avec une machine Linux, alors la question de savoir ce que fait Linux avec un SIGTERM devra attendre. init
les projets de remplacement comme Upstart et Systemd étant populaires ces jours-ci, la réponse pourrait être variable.
UPDATE : Sous Linux, init
ignore explicitement SIGTERM, donc il ne fait rien. @jsbillings a des informations sur ce que font Upstart et Systemd.
init
avec un signal Segmentation fault
( SIGSEGV
), ce qui entraînera une panique du noyau:kill -SEGV 1
Le SysV init ignore les signaux SIGKILL ou SIGTERM. Le seul signal qui provoque un changement d'état est SIGPWR, autant que je sache, qui programme un arrêt lié à l'alimentation.
Il semble que Upstart et Systemd ne répondent pas non plus à SIGKILL et, d'après mon test, il semble qu'un SIGTERM provoque la ré-exécution de upstart et de systemd.
Je ne suis pas sûr de savoir ce que les autres répondeurs utilisent, mais je suis à peu près sûr que vous ne pouvez ni tuer -9 (SIGKILL) ni tuer -15 (SIGTERM) init (pid 1). Très probablement, si vous le pouviez, vous auriez une panique dans le noyau car init est sorti de manière inattendue avec un code de sortie non nul, ce qui serait loin d'être idéal. Cela n'arrête pas votre ordinateur et ne le redémarre pas.
Techniquement oui, root peut émettre un SIGKILL à init. Cependant, init diffère de la plupart des autres processus, voire presque tous, en ce sens qu'il est autorisé à intercepter et à ignorer le signal.
Vous pouvez, en gros, tuer init en en émettant une action kill -TERM 1
qui serait analogue à émettre en halt
ou shutdown
dans cet init transmettra le signal à tous les enfants, essentiellement à tous les autres processus, avant de respecter le signal lui-même.
S'il vous plaît noter: l' exécution de cette commande volonté d' éteindre votre système.
Pour la saveur; Un type de processus pouvant "ignorer" un SIGKILL est un processus en sommeil ininterruptible, tel qu'un processus en attente d'E / S. Un tel processus pourrait être trouvé en émettant un ps axo stat,comm
où les processus avec un statut 'D' sont ininterruptibles.
kill -TERM 1
rien ne fera qu'init se re-exécuter sur la plupart des systèmes Linux, et que la seule chose que vous puissiez faire pour qu'un système kill -PWR 1
kill -TERM 1
redémarrage provoque définitivement un redémarrage (en passant par l' ::shutdown:
entrée et le script associé dans inittab.)
Vous pouvez redémarrer le init
processus. Ceci est utile pour apporter des modifications inittab
sans avoir à redémarrer.
kill -HUP 1
Source: http://www.cyberciti.biz/faq/linux-unix-kill-hup-1-reread-etcinittab-file/
init
je sais que ce signal ne fait pas que le processus redémarre mais se contente de recharger le /etc/inittab
fichier. --- Contrary systemctl daemon-reexec
fait vraiment systemd
( init
remplacement sur Linux) à ré-exécuter.
Eh bien, root peut tuer le processus init sous Linux:
strace -p 1 -o OUT &
kill -9 1
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]
SIGKILL
à PID1
depuis la fusion de github.com/torvalds/linux/commit/… .
Tapez sudo kill -INT 1
, puis voyez ce qui se passe.