Respuestas:
Por defecto, no, eso no está permitido. Bajo Linux (desde man 2 kill
):
Las únicas señales que pueden enviarse al ID de proceso 1, el proceso init, son aquellas para las que init ha instalado explícitamente controladores de señal. Esto se hace para asegurar que el sistema no se caiga accidentalmente.
Pid 1 (init) puede decidir dejarse matar, en cuyo caso el "kill" es básicamente una solicitud para que se cierre. Esta es una forma posible de implementar el halt
comando, aunque no conozco ninguno init
que lo haga.
En una Mac, matar launchd
(su análogo de inicio) con la señal 15 (SIGTERM) reiniciará inmediatamente el sistema, sin molestarse en cerrar los programas en ejecución sin problemas. Matarlo con la señal inalcanzable 9 (SIGKILL) no hace nada, lo que demuestra que la kill()
semántica de Mac es la misma que la de Linux a este respecto.
Por el momento, no tengo una caja de Linux a mano con la que estoy dispuesto a experimentar, por lo que la pregunta de qué hace Linux Y con init
con un SIGTERM tendrá que esperar. init
proyectos de reemplazo como Upstart y Systemd siendo populares en estos días, la respuesta podría ser variable.
ACTUALIZACIÓN : En Linux, init
ignora explícitamente SIGTERM, por lo que no hace nada. @jsbillings tiene información sobre lo que hacen Upstart y Systemd.
init
con una señal Segmentation fault
( SIGSEGV
), lo que dará como resultado un pánico en el núcleo:kill -SEGV 1
El init SysV ignora las señales SIGKILL o SIGTERM. La única señal que causa un cambio de estado es SIGPWR, por lo que puedo decir, que programa un apagado relacionado con la energía.
Parece que Upstart y Systemd tampoco responden a SIGKILL, y de mi prueba, parece que un SIGTERM hace que upstart y systemd se vuelvan a ejecutar.
No estoy seguro de lo que los otros respondedores están ejecutando, pero estoy bastante seguro de que no puede matar -9 (SIGKILL) o kill -15 (SIGTERM) init (pid 1). Lo más probable es que si pudiera, obtendría un kernel panic porque init salió inesperadamente con un código de salida distinto de cero, que sería menos que ideal. No apaga la computadora ni hace que se reinicie.
Técnicamente sí, root puede emitir un SIGKILL a init. init, sin embargo, difiere de la mayoría, casi de hecho, de otros procesos en que se le permite atrapar e ignorar la señal.
Puede, libremente, matar a init emitiendo un kill -TERM 1
que sería análogo a emitir un halt
o shutdown
en ese init pasará la señal a todos los niños, esencialmente todos los demás procesos, antes de honrar la señal en sí.
Tenga en cuenta: realizar este comando apagará su sistema.
Por sabor; Un tipo de otro proceso que puede "ignorar" un SIGKILL es uno en reposo ininterrumpido, como uno que espera E / S. Tal proceso podría encontrarse emitiendo un ps axo stat,comm
proceso donde los procesos con un estado 'D' son ininterrumpibles.
kill -TERM 1
no hará más que causa init para sí re-ejecutivo en la mayoría de los sistemas Linux, y que la única cosa que podría hacer para causar un sistema para apagar el sistema es ejecutarkill -PWR 1
kill -TERM 1
definitivamente provoca un reinicio (en realidad, revisando la ::shutdown:
entrada y el script asociado en inittab).
Puedes reiniciar el init
proceso. Esto es útil para realizar cambios inittab
sin tener que reiniciar.
kill -HUP 1
Fuente: http://www.cyberciti.biz/faq/linux-unix-kill-hup-1-reread-etcinittab-file/
init
Sé que esta señal no hace que el proceso se reinicie, sino solo para volver a cargar el /etc/inittab
archivo. --- systemctl daemon-reexec
Realmente lo contrario systemd
( init
reemplazo en Linux) para volver a ejecutar
Bueno, la raíz puede matar el proceso de inicio en Linux:
strace -p 1 -o OUT &
kill -9 1
Detalles:
kill -9 1
no funciona
-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
Entonces, corramos 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
al PID1
puesto github.com/torvalds/linux/commit/... se fusionó.
Escriba sudo kill -INT 1
, luego vea lo que sucede.