Apakah root dapat membunuh proses init?

38

Bisakah root kill init process (proses dengan pid 1)? Apa konsekuensinya?

Dharmit
sumber

Jawaban:

38

Secara default, tidak, itu tidak diizinkan. Di bawah Linux (dari man 2 kill):

Satu-satunya sinyal yang dapat dikirim ke ID proses 1, proses init, adalah mereka yang init secara eksplisit telah menginstal penangan sinyal. Hal ini dilakukan untuk memastikan sistem tidak diturunkan secara tidak sengaja.

Id 1 (init) dapat memutuskan untuk membiarkan dirinya terbunuh, dalam hal ini "membunuh" pada dasarnya adalah permintaan untuk mematikan dirinya sendiri. Ini adalah salah satu cara yang mungkin untuk mengimplementasikan haltperintah, meskipun saya tidak mengetahui ada inityang melakukan itu.

Pada Mac, membunuh launchd(analog initnya) dengan sinyal 15 (SIGTERM) akan segera mem-boot ulang sistem, tanpa repot-repot mematikan program yang sedang berjalan dengan bersih. Membunuhnya dengan sinyal 9 yang tak tertandingi (SIGKILL) tidak melakukan apa-apa, menunjukkan bahwa kill()semantik Mac sama dengan Linux dalam hal ini.

Saat ini, saya tidak memiliki kotak Linux yang siap untuk saya coba, jadi pertanyaan tentang apa yang Linux initlakukan dengan SIGTERM harus menunggu. Dan dengan initproyek pengganti seperti Upstart dan Systemd yang populer hari ini, jawabannya bisa bervariasi.

UPDATE : Di Linux, initsecara eksplisit mengabaikan SIGTERM, jadi ia tidak melakukan apa-apa. @ jsbillings memiliki informasi tentang apa yang dilakukan Upstart dan Systemd.

Jander
sumber
1
Sepertinya Anda sudah menemukannya, tetapi untuk anak cucu: unix.stackexchange.com/questions/85364
Jander
1
Anda dapat membunuh initdengan sinyal Segmentation fault( SIGSEGV), yang akan mengakibatkan kepanikan kernel:kill -SEGV 1
Johnson Steward
13

Init SysV mengabaikan sinyal SIGKILL atau SIGTERM. Satu-satunya sinyal yang menyebabkan perubahan status adalah SIGPWR sejauh yang saya tahu, yang menjadwalkan pematian terkait daya.

Tampaknya Upstart dan Systemd juga tidak menanggapi SIGKILL, dan dari pengujian saya, tampak bahwa SIGTERM menyebabkan pemula dan systemd untuk kembali dijalankan.

Saya tidak yakin apa yang dijalankan penjawab lain tetapi saya cukup yakin Anda tidak dapat membunuh -9 (SIGKILL) atau membunuh -15 (SIGTERM) init (pid 1). Kemungkinan besar, jika Anda bisa, Anda akan mendapatkan panik kernel karena init tiba-tiba keluar dengan kode keluar non-nol, yang akan kurang dari ideal. Itu tidak mematikan komputer Anda, atau menyebabkannya reboot.

jsbillings
sumber
6

Secara teknis ya, root dapat mengeluarkan SIGKILL untuk init. init, bagaimanapun, berbeda dari sebagian besar, hampir semuanya, proses lain yang diizinkan untuk menjebak dan mengabaikan sinyal.

Anda dapat, secara longgar, membunuh init dengan mengeluarkan kill -TERM 1yang akan analog dengan mengeluarkan haltatau shutdowninit yang akan meneruskan sinyal ke semua anak, pada dasarnya semua proses lain, sebelum menghormati sinyal itu sendiri.

Harap dicatat: melakukan perintah ini akan mematikan sistem Anda.

Untuk rasa; satu jenis proses lain yang dapat "mengabaikan" SIGKILL adalah proses dalam tidur yang tidak terputus, seperti yang menunggu i / o. Proses semacam itu dapat ditemukan dengan mengeluarkan ps axo stat,commproses di mana dengan status 'D' tidak dapat diganggu gugat.

Tok
sumber
2
Sebenarnya, dari pengujian saya, kill -TERM 1tidak akan melakukan apa-apa selain menyebabkan init mengeksekusi kembali dirinya sendiri pada kebanyakan sistem linux, dan bahwa satu-satunya hal yang dapat Anda lakukan untuk menyebabkan sistem mematikan sistem Anda adalah menjalankankill -PWR 1
jsbillings
@ jsbillings Pada SBC Linux tertanam saya bekerja dengan mengeluarkan kill -TERM 1pasti menyebabkan reboot (sebenarnya melalui ::shutdown:entri dan skrip terkait di inittab.)
SF.
Jika init dalam keadaan D untuk waktu yang lama sistem Anda benar-benar sakit.
Yosua
6

Anda dapat memulai kembali initprosesnya. Ini berguna untuk membuat perubahan inittabtanpa harus reboot.

kill -HUP 1

Sumber: http://www.cyberciti.biz/faq/linux-unix-kill-hup-1-reread-etcinittab-file/

jonescb
sumber
1
Dalam implementasi initsaya tahu sinyal ini tidak membuat proses untuk me-restart tetapi hanya memuat ulang /etc/inittabfile. --- Bertentangan systemctl daemon-reexecbenar-benar membuat systemd( initpenggantian di Linux) untuk kembali mengeksekusi
pabouk
4

sudo kill -INT 1(interupsi) akan memulai ulang sistem, dan sudo kill -SEGV 1, (pelanggaran segmentasi) atau sudo kill -ABRT 1(batalkan) akan menghasilkan kepanikan kernel.

Catatan: diperlukan sudo.

ComMania
sumber
2

Yah, root dapat mematikan proses init di Linux:

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

Detail:

kill -9 1 tidak bekerja:

-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

Jadi, mari kita jalankan 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]
Evgeny Vereshchagin
sumber
Tampaknya kernel belum memberikan SIGKILLuntuk PID1sejak github.com/torvalds/linux/commit/... dilebur.
Evgeny Vereshchagin
-2

Ketik sudo kill -INT 1, lalu lihat apa yang terjadi.

Siddhartha Biswas
sumber