“ kill <PID>” ไม่ฆ่ากระบวนการจริงๆทำไม?


118

ฉันพยายามพัฒนาทักษะบรรทัดคำสั่งของฉันและฉันพบปัญหาที่ฉันไม่สามารถฆ่ากระบวนการ ฉันพิมพ์kill 2200โดยที่ 2200 เป็น PID ของฉันและกระบวนการไม่ได้ถูกฆ่า หลังจากนั้นไม่กี่นาทีรอยังอยู่ในและtop ps auxฉันได้ลองพิมพ์ด้วย sudo - ไม่มีผลลัพธ์

ความคิดใดที่ว่าทำไมถึงเป็นเช่นนั้น


แก้ไข

ฉันได้พบการพึ่งพาที่แปลกที่fgอัปเดตรายการกระบวนการ:

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2200 pts/0    00:00:00 top
 2202 pts/0    00:00:00 top
 2258 pts/0    00:00:00 ps
x@xxx:/etc/grub.d$ fg
top

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2200 pts/0    00:00:00 top
 2620 pts/0    00:00:00 ps
x@xxx:/etc/grub.d$ fg
top

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2621 pts/0    00:00:00 ps

กระบวนการอะไรเป็นอย่างนั้น? คุณตรวจสอบว่ากระบวนการนี้อาจจะหมดอายุหรือไม่? ในกรณีนี้คุณจะต้องฆ่ากระบวนการผู้ปกครอง
htorque

กระบวนการนี้เป็นtop(ตามที่ระบุไว้ในการแก้ไข) ฉันแค่อยากลองวางโปรแกรมเพื่อทำงานเป็นพื้นหลังแล้วนำมันกลับมา
Patryk

2
หากคุณระงับกระบวนการด้วย CTRL-z มันจะบล็อกสัญญาณส่วนใหญ่ตราบใดที่มันถูกระงับ (เช่นจนกว่าคุณจะทำกระบวนการfgหรือbgสำหรับกระบวนการ)
nos

คำตอบ:


179

กระบวนการสามารถละเว้นสัญญาณบางอย่าง หากคุณส่ง SIGKILL คุณจะไม่สามารถเพิกเฉยได้ (และไม่จับมันเพื่อทำการสะสาง) ลอง:

kill -9 {PID}

เรียนรู้เพิ่มเติมโดยการอ่านหน้าคู่มือ:

man kill

22
โปรดทราบว่าในบางสถานการณ์ที่เฉพาะเจาะจงกระบวนการสามารถอยู่ในสถานะ zombie / defunct ที่แม้ SIGKILL จะไม่สามารถฆ่ากระบวนการ ในกรณีนี้คุณจะต้องค้นหากระบวนการหลักและฆ่ากระบวนการหลัก
Lie Ryan

15
หากกระบวนการนั้นก้าวออกไปจากสายคุณจะต้องฆ่า KASH DINE NINE !
กอตต์

4
และบางครั้งไม่มีกระบวนการผู้ปกครองซึ่งในกรณีนี้คุณเพียงแค่เมา วิธีเดียวที่จะลบกระบวนการดังกล่าวคือรีบูตเครื่อง
606723

2
ชื่อของคำสั่ง kill ยังคงสร้างความเข้าใจผิดต่อผู้ใช้หลายคนหลายคน (รวมถึงฉันตอนเริ่มต้น) หนึ่งสมมติว่าเมื่อคุณพูดว่า "kill X" นี่หมายถึงฆ่า X จริงๆและไม่ทำอย่างอื่น ผมเข้าใจนี้จะไม่เปลี่ยนแปลงสิ่ง แต่ฉันหวังว่าพวกเขาได้เลือกชื่อ elaborative เพิ่มเติม ...
rbaleksandar

1
แม้หลังจากkill -9ใช้งานไม่ได้อะไรและกระบวนการยังคงวนเวียนอยู่
Douglas Gaskell

42

หากkillมีการเรียกใช้โดยไม่มีพารามิเตอร์ใด ๆ ก็จะส่งหมายเลขสัญญาณ 15 ( SIGTERM) กระบวนการนี้สามารถละเว้นสัญญาณได้ สัญญาณนี้แจ้งให้กระบวนการทำความสะอาดสิ่งต่าง ๆ ของเขาและจบลงอย่างถูกต้องด้วยตัวเอง นั่นเป็นวิธีที่ดี

นอกจากนี้คุณยังสามารถ "ส่ง" หมายเลขสัญญาณ 9 ( SIGKILL) ที่กระบวนการไม่สามารถเพิกเฉยได้ กระบวนการจะไม่รู้จักเพราะเคอร์เนลจบกระบวนการไม่ใช่กระบวนการเอง นั่นเป็นวิธีที่ชั่วร้าย

หนึ่งกล่าวว่าใช้kill -9 <pid>งานได้เสมอ นั่นเป็นความเชื่อถือศรัทธาในทางที่ผิด มีบางสถานการณ์ที่kill -9ไม่สามารถฆ่ากระบวนการได้ ตัวอย่างเช่นเมื่อกระบวนการมีสถานะD(สลีปที่ไม่สามารถขัดจังหวะได้) กระบวนการเข้าสู่สถานะนี้ทุกครั้งที่รอ I / O (ปกติไม่นานมาก) ดังนั้นหากกระบวนการรอ I / O (บนฮาร์ดดิสก์ข้อบกพร่อง) และไม่ได้ตั้งโปรแกรมอย่างถูกต้อง (ด้วยการหมดเวลา) คุณจะไม่สามารถฆ่ากระบวนการได้ ไม่ว่าคุณจะทำอะไร คุณเพียงแค่พยายามทำให้ไฟล์สามารถเข้าถึงได้ซึ่งกระบวนการดำเนินการต่อ


2
สิ่งนี้มีประโยชน์มากฉันมีประสบการณ์นี้หลายครั้งเนื่องจากการเข้าถึง I / O ที่แขวนอยู่บนดิสก์เครือข่ายและฉันก็สงสัยว่าทำไมฉันไม่สามารถฆ่ากระบวนการที่ล้มเหลว มีเอกสารเพิ่มเติมเกี่ยวกับปัญหาเฉพาะนี้และวิธีแก้ไขหรือไม่
Sheljohn

7

แม้ว่าชื่อการฆ่าจะไม่ฆ่ากระบวนการ แต่ก็ส่งสัญญาณไปยังกระบวนการ จากหน้าคน:

kill - send a signal to a process

สัญญาณเริ่มต้นที่ส่งโดยkill [pid]คือSIGTERMซึ่งโดยปกติแล้วไม่จำเป็นต้องขอให้กระบวนการยุติ มันค่อนข้างเป็นไปได้ที่จะเขียนโปรแกรมที่มีความสุขเมื่อคุณส่งสัญญาณSIGTERMแต่ไม่แนะนำ

สัญญาณทั่วไปอีกอย่างคือSIGHUPซึ่งมักจะใช้เพื่อขอให้โปรแกรมอ่านไฟล์การกำหนดค่าอีกครั้ง

ถ้าคุณอยากจะฆ่าโปรแกรมที่คุณจำเป็นต้องใช้SIGKILLkill -9 [pid]สัญญาณด้วยการทำ


2

ดูเหมือนว่าคุณอาจระงับกระบวนการ (อาจกด Ctrl-Z ในเทอร์มินัล) ในสถานะนี้กระบวนการของคุณจะไม่ตอบสนองต่อ SIGTERM เนื่องจากถูกแช่แข็ง ใช้ 'fg' ละลายกระบวนการดังนั้นจึงสามารถรับสัญญาณและสิ้นสุดด้วยตนเอง นั่นอาจอธิบายได้ว่าเหตุใด 'fg' จึงปรากฏขึ้นเพื่ออัพเดตรายการกระบวนการ


1
ดังนั้นวิธีการหาขั้วที่แนบมา?
ruX

0

จากภายใน C ++ ฉันดำเนินการ:

kill(4024, SIGKILL);

และในเทอร์มินัล linux (Ubuntu)

$ ps -ax | grep my_su

ผลลัพธ์คือ:

4024 pts/1    Z+     0:00 [my_subscriber] <defunct>

ดูเหมือนว่ามัน (4024) ยังคงมีชีวิตรอด อย่างไรก็ตามทันทีที่ฉันยุติกระบวนการผู้ปกครองซึ่งเรียกว่าคำสั่ง "kill" ข้างต้น 4024 จะไม่ปรากฏอีกต่อไป ตอนนี้ฉันตัดสินกระบวนการ "ตาย" ไม่มีอะไรมากไปกว่าบรรทัดที่แสดงและตัดสินใจที่จะเพิกเฉย ฉันหวังว่าประสบการณ์ของฉันจะช่วยให้ใครบางคนที่นั่น ไชโย!


0

คุณอาจใช้kill -lเพื่อแสดงสัญญาณที่สนับสนุนโดยสถาปัตยกรรมของคุณและเรียนรู้เพิ่มเติมเกี่ยวกับสัญญาณที่คุณอาจต้องการใช้เพื่อส่งสัญญาณอย่างถูกต้อง

หมายเหตุ: ตามที่คนอื่น ๆ อาจกล่าวถึงการใช้kill -9 {PID}ไม่แนะนำเว้นแต่จะเป็นกระบวนการซอมบี้ เมื่อกระบวนการได้รับ SIGKILL จะปิดทันทีโดยไม่ต้องทำความสะอาดหรือขั้นตอนอื่นใดที่เหมาะสม


0

นี่คือสิ่งที่ฉันเคยใช้ยา localhost ทำงานบนพอร์ต 80 (โดย angi cli) เรียกใช้ข้อมูลแอพที่พอร์ต 80

sudo lsof -i tcp:80

After That 
sudo kill -9 3348

โดยที่3348pid ของกระบวนการกำลังทำงานอยู่

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