O root pode matar o processo init?

36

O processo init de kill raiz (o processo com pid 1)? Quais seriam suas conseqüências?

    
por Dharmit 15.02.2011 / 15:59

7 respostas

37

Por padrão, não, isso não é permitido. No Linux (de man 2 kill ):

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.

Pid 1 (init) pode decidir se permitir ser morto, em cujo caso o "kill" é basicamente um pedido para que ele se desligue. Esta é uma maneira possível de implementar o comando halt , embora eu não saiba de nenhum init que faça isso.

Em um Mac, matar launchd (seu análogo de inicialização) com o sinal 15 (SIGTERM) reinicializará o sistema imediatamente, sem se preocupar em desligar programas em execução de forma limpa. Matá-lo com o sinal uncatchable 9 (SIGKILL) não faz nada, mostrando que as semânticas de kill() do Mac são as mesmas que as do Linux a esse respeito.

No momento, eu não tenho uma caixa do Linux à mão com a qual estou disposto a experimentar, então a questão do que o init do Linux faz com um SIGTERM terá que esperar. E com projetos de substituição de init como Upstart e Systemd sendo populares atualmente, a resposta pode ser variável.

UPDATE : no Linux, init ignora explicitamente o SIGTERM, por isso não faz nada. @jsbillings tem informações sobre o que o Upstart e o Systemd fazem.

    
por 15.02.2011 / 17:00
13

O init do SysV ignora os sinais SIGKILL ou SIGTERM. O único sinal que provoca uma mudança no estado é o SIGPWR, até onde eu sei, que programa um desligamento relacionado à energia.

Parece que o Upstart e o Systemd também não respondem ao SIGKILL e, do meu teste, parece que um SIGTERM faz com que o upstart e o systemd sejam reexecutados.

Não tenho certeza do que os outros respondentes estão executando, mas tenho certeza que você não pode matar -9 (SIGKILL) ou matar -15 (SIGTERM) init (pid 1). Provavelmente, se você conseguisse, você obteria um kernel panic porque o init inesperadamente saía com um código de saída diferente de zero, o que seria menos que o ideal. Ele não desliga o computador nem faz com que ele seja reinicializado.

    
por 15.02.2011 / 19:36
6

Tecnicamente sim, o root pode emitir um SIGKILL para o init. O init, no entanto, difere da maioria, quase todos de fato, de outros processos em que é permitido capturar e ignorar o sinal.

Você pode, livremente, matar o init emitindo um kill -TERM 1 , o que seria análogo a emitir um halt ou shutdown em que o init passará o sinal para todos os filhos, essencialmente todos os outros processos, antes de honrar o sinal em si.

Por favor note: executar este comando irá desligar o seu sistema.

Para sabor; Um tipo de outro processo que pode "ignorar" um SIGKILL é aquele em um modo de espera ininterrupta, como um esperando por i / o. Esse processo pode ser encontrado emitindo um ps axo stat,comm em que os processos com status 'D' não são interrompidos.

    
por 15.02.2011 / 19:04
6

Você pode reiniciar o processo init . Isso é útil para fazer alterações em inittab sem precisar reinicializar.

kill -HUP 1

Fonte: link

    
por 15.02.2011 / 19:46
4

sudo kill -INT 1 (interromper) reiniciará o sistema e sudo kill -SEGV 1 , (violação de segmentação) ou sudo kill -ABRT 1 (abort) gerará um pânico no kernel.

nota: sudo é necessário.

    
por 23.02.2014 / 05:54
2

Bem, o root pode matar o processo init no Linux:

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

Detalhes:

kill -9 1 não 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

Então, vamos executar 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]
    
por 07.09.2016 / 16:11
-3

Digite sudo kill -INT 1 e veja o que acontece.

    
por 18.08.2013 / 05:31

Tags