Câu trả lời:
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 halt
lệnh, mặc dù tôi không biết bất kỳ cách nào init
thự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 Và với init
làm với SIGTERM sẽ phải chờ. init
cá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, init
rõ 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.
init
bằ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
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.
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 1
thứ tương tự như phát hành một halt
hoặc shutdown
trong đó 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,comm
nơi mà các quy trình có trạng thái 'D' không thể bị gián đoạn.
kill -TERM 1
sẽ 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
kill -TERM 1
chắ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.)
Bạn có thể khởi động lại init
quá trình. Điều này rất hữu ích để thực hiện các thay đổi inittab
mà 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/
init
tô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/inittab
tập tin. --- Trái ngược systemctl daemon-reexec
thực sự systemd
( init
thay thế trên Linux) để thực thi lại.
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]
SIGKILL
để PID1
từ github.com/torvalds/linux/commit/... được sáp nhập.
Nhập sudo kill -INT 1
, sau đó xem những gì xảy ra.