क्या जड़ प्रक्रिया को मार सकते हैं?


38

क्या रूट इनिट प्रक्रिया (पीआईडी ​​1 के साथ प्रक्रिया) को मार सकता है? इसके परिणाम क्या होंगे?

जवाबों:


38

डिफ़ॉल्ट रूप से, नहीं, यह अनुमति नहीं है। लिनक्स के तहत (से man 2 kill):

केवल संकेत जो कि प्रक्रिया 1, init प्रक्रिया को भेजे जा सकते हैं, वे हैं जिनके लिए init ने स्पष्ट रूप से संकेत संचालकों को स्थापित किया है। यह आश्वासन देने के लिए किया जाता है कि सिस्टम गलती से नीचे नहीं लाया गया है।

Pid 1 (init) खुद को मारने की अनुमति देने का निर्णय ले सकता है, जिस स्थिति में "मार" मूल रूप से इसे बंद करने का अनुरोध है। यह haltकमांड को लागू करने का एक संभव तरीका है , हालांकि मुझे ऐसा करने वाले किसी के बारे में पता initनहीं है।

मैक पर, launchdसिग्नल 15 (SIGTERM) के साथ हत्या (इसका init एनालॉग) तुरंत सिस्टम को रिबूट करेगा, बिना साफ-सफाई के चलने वाले कार्यक्रमों को बंद करने के लिए। इसे अचूक संकेत 9 (SIGKILL) के साथ मारना कुछ भी नहीं करता है, यह दर्शाता है कि मैक का kill()शब्दार्थ इस संबंध में लिनक्स के समान है।

फिलहाल, मेरे पास लिनक्स बॉक्स नहीं है जिसे मैं प्रयोग करने के लिए तैयार हूं, इसलिए लिनक्स के initSIGTERM के साथ क्या करना है, इस सवाल का इंतजार करना होगा। और initइन दिनों अपस्टार्ट और सिस्टर्ड जैसी प्रतिस्थापन परियोजनाओं के लोकप्रिय होने के कारण इसका उत्तर परिवर्तनशील हो सकता है।

अद्यतन : लिनक्स पर, initस्पष्ट रूप से SIGTERM को अनदेखा करता है, इसलिए यह कुछ भी नहीं करता है। @jsbillings को उपस्टार्ट और सिस्टमड के बारे में जानकारी है।


1
ऐसा लगता है कि आप पहले से ही इसे पा चुके हैं, लेकिन पोस्टर के
जैंडर

1
आप initएक Segmentation fault( SIGSEGV) सिग्नल से मार सकते हैं , जिसके परिणामस्वरूप कर्नेल घबराहट होगी:kill -SEGV 1
जॉनसन स्टीवर्ड

13

SysV init SIGKILL या SIGTERM संकेतों की अनदेखी करता है। केवल एक संकेत जो राज्य में बदलाव का कारण बनता है वह है SIGPWR जहाँ तक मैं बता सकता हूं, जो बिजली से संबंधित बंद का शेड्यूल करता है।

ऐसा प्रतीत होता है कि अपस्टार्ट और सिस्टमड भी SIGKILL का जवाब नहीं देते हैं, और मेरे परीक्षण से, ऐसा प्रतीत होता है कि एक SIGTERM अपस्टार्ट और सिस्टमड को पुन: क्रियान्वित करने का कारण बनता है।

मुझे यकीन नहीं है कि अन्य उत्तरदाता क्या चल रहे हैं, लेकिन मुझे पूरा यकीन है कि आप -9 (SIGKILL) या किल -15 (SIGTERM) init (pid 1) नहीं मार सकते। सबसे अधिक संभावना है, यदि आप सक्षम थे, तो आपको एक कर्नेल घबराहट मिलेगी क्योंकि यह अनपेक्षित रूप से एक गैर-शून्य निकास कोड के साथ बाहर निकलता है, जो आदर्श से कम होगा। यह आपके कंप्यूटर को बंद नहीं करता है, या इसे रिबूट करने का कारण बनता है।


6

तकनीकी रूप से हां, रूट एक init को जारी कर सकता है। हालाँकि, यह वास्तव में, लगभग सभी प्रक्रियाओं से भिन्न है, इसमें अन्य प्रक्रियाओं को सिग्नल को फंसाने और अनदेखा करने की अनुमति है।

आप, शिथिल रूप से, इनिट को मार सकते हैं, kill -TERM 1जो एक इश्यू को जारी करने के अनुरूप होगा haltया shutdownउस आईएनटी में सभी बच्चों को अनिवार्य रूप से सभी अन्य प्रक्रियाओं को सिग्नल पास किया जाएगा, सिग्नल को सम्मानित करने से पहले।

कृपया ध्यान दें: इस कमांड को करने से आपका सिस्टम बंद हो जाएगा

स्वाद के लिए; एक प्रकार की अन्य प्रक्रिया जो एक SIGKILL को "नजरअंदाज" कर सकती है, वह अबाधित नींद में एक है, जैसे कि i / o की प्रतीक्षा करना। ऐसी प्रक्रिया को जारी करके पाया जा सकता है ps axo stat,commजहां 'D' की स्थिति वाली प्रक्रियाएं निर्बाध हैं।


2
वास्तव में, मेरे परीक्षणों से, kill -TERM 1अधिकांश लिनक्स सिस्टम पर खुद को फिर से क्रियान्वित करने के लिए init के अलावा कुछ भी नहीं होगा, और केवल एक चीज जो आप अपने सिस्टम को बंद करने के लिए सिस्टम को चलाने के लिए कर सकते हैंkill -PWR 1
19

@jsbillings एम्बेडेड लिनक्स एसबीसी पर मैं kill -TERM 1निश्चित रूप से रिबूट जारी करने के साथ काम कर रहा हूं (वास्तव में ::shutdown:प्रवेश और संबंधित स्क्रिप्ट इनटैब के माध्यम से जा रहा है ।)
एसएफ।

यदि init लंबे समय तक डी अवस्था में है तो आपका सिस्टम वास्तव में बीमार है।
जोशुआ

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बनाता है । systemdinit
पाबौक

4

sudo kill -INT 1(व्यवधान) सिस्टम को पुनरारंभ करेगा, और sudo kill -SEGV 1(विभाजन उल्लंघन) या sudo kill -ABRT 1(गर्भपात) एक कर्नेल आतंक पैदा करेगा।

ध्यान दें: sudo की आवश्यकता है।


2

ठीक है, जड़ लिनक्स पर init प्रक्रिया को मार सकता है:

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/... विलय हो गया।
एवगेनी वीरशैगिन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.