Root có thể giết quá trình init?


38

Root có thể giết tiến trình init (quá trình với pid 1) không? Hậu quả của nó là gì?

Câu trả lời:


38

Theo mặc định, không, điều đó không được phép. Trong Linux (từ man 2 kill):

Các tín hiệu duy nhất có thể được gửi để xử lý ID 1, quá trình init, là các tín hiệu mà init đã cài đặt rõ ràng các trình xử lý tín hiệu. Điều này được thực hiện để đảm bảo hệ thống không bị vô tình đưa xuống.

Pid 1 (init) có thể quyết định cho phép bản thân bị giết, trong trường hợp đó, "kill" về cơ bản là một yêu cầu để nó tự tắt. Đây là một cách có thể để thực hiện haltlệnh, mặc dù tôi không biết bất kỳ cách nào initthực hiện điều đó.

Trên máy Mac, việc tiêu diệt launchd(tương tự init của nó) với tín hiệu 15 (SIGTERM) sẽ ngay lập tức khởi động lại hệ thống mà không cần tắt các chương trình đang chạy một cách sạch sẽ. Giết nó với tín hiệu không thể so sánh 9 (SIGKILL) không làm gì cả, cho thấy kill()ngữ nghĩa của Mac giống như của Linux về mặt này.

Hiện tại, tôi không có hộp Linux tiện dụng mà tôi sẵn sàng thử nghiệm, vì vậy câu hỏi về những gì Linux initlàm với SIGTERM sẽ phải chờ. Và với initcác dự án thay thế như Upstart và Systemd đang trở nên phổ biến ngày nay, câu trả lời có thể thay đổi.

CẬP NHẬT : Trên Linux, initrõ ràng bỏ qua SIGTERM, vì vậy nó không làm gì cả. @jsbillings có thông tin về những gì Upstart và Systemd làm.


1
Có vẻ như bạn đã tìm thấy nó, nhưng cho hậu thế: unix.stackexchange.com/questions/85364
Jander

1
Bạn có thể giết initbằng tín hiệu Segmentation fault( SIGSEGV), điều này sẽ dẫn đến sự hoảng loạn hạt nhân:kill -SEGV 1
Johnson Steward

13

Khởi tạo SysV bỏ qua tín hiệu SIGKILL hoặc SIGTERM. Tín hiệu duy nhất gây ra thay đổi trạng thái là SIGPWR theo như tôi có thể nói, đó là lịch trình tắt máy liên quan đến điện.

Dường như Upstart và Systemd cũng không phản hồi với SIGKILL và từ thử nghiệm của tôi, có vẻ như một SIGTERM gây ra sự khởi đầu và systemd để thực thi lại.

Tôi không chắc những người trả lời khác đang chạy gì nhưng tôi khá chắc chắn rằng bạn không thể giết -9 (SIGKILL) hoặc giết -15 (SIGTERM) init (pid 1). Rất có thể, nếu bạn có thể, bạn sẽ bị hoảng loạn hạt nhân vì init bất ngờ thoát ra với mã thoát khác không, sẽ ít hơn lý tưởng. Nó không tắt máy tính của bạn hoặc khiến nó khởi động lại.


6

Về mặt kỹ thuật có, root có thể cấp SIGKILL cho init. Tuy nhiên, init khác với hầu hết, gần như trên thực tế, các quá trình khác ở chỗ nó được phép bẫy và bỏ qua tín hiệu.

Bạn có thể, một cách lỏng lẻo, giết init bằng cách phát ra một kill -TERM 1thứ tương tự như phát hành một halthoặc shutdowntrong đó init sẽ truyền tín hiệu cho tất cả trẻ em, về cơ bản là tất cả các quá trình khác, trước khi tự tôn vinh tín hiệu.

Xin lưu ý: thực hiện lệnh này sẽ tắt hệ thống của bạn.

Đối với hương vị; một loại quy trình khác có thể "bỏ qua" SIGKILL là một loại trong giấc ngủ không bị gián đoạn, chẳng hạn như một loại đang chờ i / o. Quá trình như vậy có thể được tìm thấy bằng cách ban hành một ps axo stat,commnơi mà các quy trình có trạng thái 'D' không thể bị gián đoạn.


2
Trên thực tế, từ các thử nghiệm của tôi, kill -TERM 1sẽ không làm gì ngoài việc khiến init tự thực thi lại trên hầu hết các hệ thống linux và điều duy nhất bạn có thể làm để khiến hệ thống tắt hệ thống của bạn là chạykill -PWR 1
jsbillings

@jsbillings Trên các Linux SBC nhúng mà tôi đang làm việc với việc phát hành kill -TERM 1chắc chắn gây ra khởi động lại (thực sự đi qua ::shutdown:mục nhập và tập lệnh liên quan trong inittab.)
SF.

Nếu init ở trạng thái D lâu thì hệ thống của bạn thực sự bị bệnh.
Joshua

6

Bạn có thể khởi động lại initquá trình. Điều này rất hữu ích để thực hiện các thay đổi inittabmà không phải khởi động lại.

kill -HUP 1

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


1
Trong triển khai của inittôi biết tín hiệu này không làm cho quá trình khởi động lại mà chỉ để tải lại /etc/inittabtập tin. --- Trái ngược systemctl daemon-reexecthực sự systemd( initthay thế trên Linux) để thực thi lại.
pabouk

4

sudo kill -INT 1(ngắt) sẽ khởi động lại hệ thống và sudo kill -SEGV 1, (vi phạm phân đoạn) hoặc sudo kill -ABRT 1(hủy bỏ) sẽ tạo ra sự hoảng loạn hạt nhân.

lưu ý: sudo là bắt buộc.


2

Chà, root có thể giết tiến trình init trên Linux:

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

Chi tiết:

kill -9 1 không hoạt động:

-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

Vì vậy, hãy chạy 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]

Dường như hạt nhân vẫn chưa được cung cấp SIGKILLđể PID1từ github.com/torvalds/linux/commit/... được sáp nhập.
Evgeny Vereshchagin

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.