รูท kill kill สามารถทำได้หรือไม่?


38

สามารถรูทกระบวนการ kill kill (กระบวนการที่มี pid 1) ได้หรือไม่? จะเกิดอะไรขึ้น?

คำตอบ:


38

โดยค่าเริ่มต้นไม่ว่าจะไม่ได้รับอนุญาต ภายใต้ Linux (จากman 2 kill):

สัญญาณเดียวที่สามารถส่งไปยังกระบวนการ ID 1 ซึ่งเป็นกระบวนการเริ่มต้นคือสัญญาณที่ init ได้ติดตั้งตัวจัดการสัญญาณอย่างชัดเจน สิ่งนี้ทำเพื่อให้มั่นใจว่าระบบจะไม่ถูกลบโดยไม่ตั้งใจ

Pid 1 (init) สามารถตัดสินใจที่จะยอมให้ตัวเองถูกฆ่าซึ่งในกรณีนี้ "kill" นั้นเป็นคำขอให้ปิดตัวเอง นี่เป็นวิธีหนึ่งที่เป็นไปได้ที่จะใช้haltคำสั่งแม้ว่าฉันจะไม่ทราบเลยinitว่าจะทำเช่นนั้น

สำหรับ Mac การฆ่าlaunchd(อะนาล็อกเริ่มต้น) ที่มีสัญญาณ 15 (SIGTERM) จะรีบูทระบบทันทีโดยไม่ต้องปิดระบบเพื่อรันโปรแกรมอย่างหมดจด การฆ่ามันด้วยสัญญาณที่จับไม่ได้ 9 (SIGKILL) ไม่ได้ทำอะไรเลยแสดงให้เห็นว่าความkill()หมายของ Mac เหมือนกับ Linux ในแง่นี้

ในขณะนี้ฉันไม่มีกล่อง Linux ที่มีประโยชน์ซึ่งฉันยินดีที่จะทำการทดลองดังนั้นคำถามที่ Linux initใช้กับ SIGTERM ต้องรอ และด้วยinitโครงการทดแทนเช่น Upstart และ Systemd ซึ่งกำลังได้รับความนิยมในทุกวันนี้คำตอบอาจแปรผัน

UPDATE : บน Linux ให้initละเว้น SIGTERM อย่างชัดเจนดังนั้นจึงไม่ทำอะไรเลย @jsbillings มีข้อมูลเกี่ยวกับสิ่งที่พุ่งพรวดและ Systemd ทำ


1
ดูเหมือนว่าคุณจะพบมันแล้ว แต่สำหรับลูกหลาน: unix.stackexchange.com/questions/85364
Jander

1
คุณสามารถฆ่าinitด้วยสัญญาณSegmentation fault( SIGSEGV) ซึ่งจะทำให้เกิดความตื่นตระหนกเคอร์เนล:kill -SEGV 1
จอห์นสันสจ๊วต

13

SysV init จะละเว้นสัญญาณ SIGKILL หรือ SIGTERM สัญญาณเดียวที่ทำให้เกิดการเปลี่ยนแปลงในสถานะคือ SIGPWR เท่าที่ฉันสามารถบอกได้ซึ่งกำหนดเวลาการปิดระบบไฟฟ้าที่เกี่ยวข้อง

ปรากฏว่า Upstart และ Systemd ไม่ตอบสนองต่อ SIGKILL และจากการทดสอบของฉันปรากฏว่า SIGTERM ทำให้พุ่งพรวดและ systemd ทำการประมวลผลอีกครั้ง

ฉันไม่แน่ใจว่าผู้ตอบคำถามอื่นกำลังทำงานอยู่ แต่ฉันค่อนข้างแน่ใจว่าคุณไม่สามารถฆ่า -9 (SIGKILL) หรือ kill -15 (SIGTERM) init (pid 1) เป็นไปได้มากว่าถ้าคุณสามารถทำได้คุณจะได้รับความตื่นตระหนกของเคอร์เนลเนื่องจาก init ออกโดยไม่คาดคิดด้วยรหัสออกที่ไม่เป็นศูนย์ซึ่งจะน้อยกว่าอุดมคติ มันไม่ได้ปิดเครื่องคอมพิวเตอร์ของคุณหรือทำให้มันรีบูต


6

ในทางเทคนิคใช่แล้ว root สามารถออก SIGKILL เพื่อเริ่มต้นได้ อย่างไรก็ตาม init แตกต่างจากความจริงเกือบทั้งหมดกระบวนการอื่น ๆ ที่อนุญาตให้ดักจับและไม่สนใจสัญญาณ

คุณสามารถฆ่า init ได้อย่างอิสระโดยการออก a kill -TERM 1ซึ่งจะคล้ายกับการออก a haltหรือshutdownใน init นั้นจะส่งสัญญาณไปยังเด็กทุกคนโดยเฉพาะอย่างยิ่งกระบวนการอื่น ๆ ทั้งหมดก่อนที่จะให้เกียรติสัญญาณเอง

โปรดทราบ: การใช้คำสั่งนี้จะเป็นการปิดระบบของคุณ

สำหรับรสชาติ; กระบวนการอื่น ๆ ประเภทหนึ่งที่สามารถ "เพิกเฉย" SIGKILL เป็นกระบวนการหนึ่งในการหยุดพักชั่วคราวเช่นหนึ่งรอ i / o กระบวนการดังกล่าวสามารถพบได้โดยการออกps axo stat,commกระบวนการที่มีสถานะ 'D' จะไม่ถูกขัดจังหวะ


2
ที่จริงแล้วจากการทดสอบของฉันkill -TERM 1จะไม่ทำอะไรเลยนอกจากจะทำให้ init กลับมาทำงานอีกครั้งในระบบ Linux ส่วนใหญ่และสิ่งเดียวที่คุณสามารถทำได้เพื่อให้ระบบปิดระบบของคุณคือการทำงานkill -PWR 1
jsbillings

@jsbillings บน SBC ลินุกซ์ที่ฝังตัวฉันทำงานด้วยการออกkill -TERM 1แน่นอนทำให้รีบูต (จริง ๆ แล้วจะผ่าน::shutdown:รายการและสคริปต์ที่เกี่ยวข้องใน inittab.)
SF

หาก init อยู่ในสถานะ D เป็นเวลานานระบบของคุณจะป่วยจริงๆ
Joshua

6

คุณสามารถรีสตาร์ทinitกระบวนการ สิ่งนี้มีประโยชน์สำหรับการเปลี่ยนแปลงinittabโดยไม่ต้องรีบูต

kill -HUP 1

ที่มา: http://www.cyberciti.biz/faq/linux-unix-kill-hup-1-reread-etcinittab-file/


1
ในการใช้งานของinitฉันรู้ว่าสัญญาณนี้ไม่ได้ทำให้กระบวนการรีสตาร์ท แต่เพียงเพื่อโหลด/etc/inittabไฟล์อีกครั้ง --- ตรงกันข้ามsystemctl daemon-reexecทำให้systemd(การinitแทนที่บน Linux) เพื่อดำเนินการอีกครั้งจริงๆ
pabouk

4

sudo kill -INT 1(ขัดจังหวะ) จะรีสตาร์ทระบบและ sudo kill -SEGV 1(การแบ่งเซกเมนต์) หรือsudo kill -ABRT 1(ยกเลิก) จะสร้างความตื่นตระหนกของเคอร์เนล

หมายเหตุ: ต้องใช้ sudo


2

รากสามารถฆ่ากระบวนการ init บน Linux:

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

รายละเอียด:

kill -9 1 ไม่ทำงาน:

-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

ดังนั้นมาเรียกใช้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นับตั้งแต่github.com/torvalds/linux/commit/ ......ถูกรวมเข้าด้วยกัน
Evgeny Vereshchagin

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.