ทำไมต้องเป็นเลข 9 ในคำสั่ง kill -9 ในยูนิกซ์ [ปิด]


101

ฉันเข้าใจว่ามันไม่ตรงกับหัวข้อฉันไม่พบที่ไหนทางออนไลน์และฉันคิดว่าบางทีผู้เชี่ยวชาญด้านการเขียนโปรแกรมในชุมชนอาจรู้เรื่องนี้
ฉันมักจะใช้

kill -9 pid

เพื่อฆ่างาน ฉันมักจะสงสัยที่มาของ 9 ฉันค้นหามันทางออนไลน์และมันบอก

"9 หมายถึงสัญญาณ KILL ที่ไม่สามารถจับได้หรือไม่สามารถมองเห็นได้กล่าวอีกนัยหนึ่งก็คือการส่งสัญญาณให้กระบวนการ (แอปพลิเคชันที่กำลังทำงานอยู่) หยุดทำงานทันที" (ที่มา: http://wiki.answers.com/Q/What_does_kill_-9_do_in_unix_in_its_entirety )

แต่ทำไม 9? แล้วตัวเลขอื่น ๆ ล่ะ? มีความสำคัญทางประวัติศาสตร์หรือเป็นเพราะสถาปัตยกรรมของ Unix?


6
ฉันคิดว่าคำถามนี้ดีกว่าเป็นของ superuser.com
Rafał Rawicki

คำตอบ:


91

ดูบทความวิกิพีเดียเกี่ยวกับสัญญาณ Unixสำหรับรายการสัญญาณอื่น ๆ SIGKILL เพิ่งเกิดขึ้นเพื่อรับหมายเลข 9

คุณสามารถใช้การจำได้เช่นกันเป็นตัวเลข:

kill -SIGKILL pid

6
ย้อนกลับไปในวันนี้ (ซึ่งฉันหมายถึง 4.xBSD หรือมากกว่านั้น) คุณไม่สามารถใช้การจำด้วยคำสั่งเชลล์ได้ซึ่งเป็นสาเหตุที่ทำให้หมายเลข 9 ถูกเขียนลงในสคริปต์เชลล์เด็คที่เต็มไปด้วยฝุ่นจำนวนมาก
zwol


52

ฉันคิดว่าคำตอบที่ดีกว่ามีเพียงแค่นี้:

mike@sleepycat:~☺  kill -l
 1) SIGHUP   2) SIGINT   3) SIGQUIT  4) SIGILL   5) SIGTRAP  
 6) SIGABRT  7) SIGBUS   8) SIGFPE   9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG  24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF 28) SIGWINCH    29) SIGIO   30) SIGPWR
31) SIGSYS  34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX    

สำหรับ "นัยสำคัญ" ของ 9 ... จะว่าไปก็คงไม่มี ตามอินเทอร์เฟซการเขียนโปรแกรม Linux (หน้า 388) :

แต่ละสัญญาณถูกกำหนดให้เป็นจำนวนเต็ม (เล็ก) ที่ไม่ซ้ำกันโดยเริ่มจาก 1 จำนวนเต็มเหล่านี้ถูกกำหนดด้วยชื่อสัญลักษณ์ของรูปแบบ SIGxxxx เนื่องจากตัวเลขจริงที่ใช้สำหรับแต่ละสัญญาณจะแตกต่างกันไปตามการนำไปใช้งานจึงเป็นชื่อสัญลักษณ์ที่ใช้ในโปรแกรมเสมอ


32

ก่อนอื่นคุณต้องรู้ว่าSignalsในระบบที่เหมือน Unix คืออะไร(ใช้เวลาเพียงไม่กี่นาที)

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

เหตุการณ์อาจแตกต่างกันไปตั้งแต่คำขอของผู้ใช้ไปจนถึงข้อผิดพลาดในการเข้าถึงหน่วยความจำที่ผิดกฎหมาย สัญญาณบางอย่างเช่นสัญญาณขัดจังหวะแสดงว่าผู้ใช้ขอให้โปรแกรมทำบางสิ่งที่ไม่อยู่ในขั้นตอนการควบคุมตามปกติ

มีสัญญาณหลายประเภทที่เราสามารถใช้ได้ - เพื่อรับรายการสัญญาณทั้งหมดที่มี / เป็นไปได้ให้ใช้คำสั่ง" $ kill -l ": ป้อนคำอธิบายภาพที่นี่

ในเอาต์พุตด้านบนจะเห็นได้ชัดเจนว่าแต่ละสัญญาณมี ' หมายเลขสัญญาณ ' (เช่น 1, 2, 3) และ ' ชื่อสัญญาณ ' (เช่น SIGUP, SIGINT, SIGQUIT) เชื่อมโยงอยู่ หากต้องการดูรายละเอียดว่าแต่ละสัญญาณทำอะไรได้บ้างโปรดไปที่ลิงค์นี้

ในที่สุดก็มาถึงคำถาม "Why number 9 in kill -9 command":

มีหลายวิธีในการส่งสัญญาณไปยังโปรแกรมหรือสคริปต์ วิธีหนึ่งที่ใช้กันทั่วไปในการส่งสัญญาณคือการใช้คำสั่งkill - ไวยากรณ์พื้นฐานคือ:

$ kill -signal pid

โดยที่สัญญาณคือหมายเลขหรือชื่อของสัญญาณตามด้วยรหัสกระบวนการ (pid) ที่สัญญาณจะถูกส่ง

ตัวอย่างเช่น - -SIGKILL (หรือ-9 ) สัญญาณจะฆ่ากระบวนการทันที

$ kill -SIGKILL 1001

และ

$ kill -9 1001

คำสั่งทั้งสองเป็นสิ่งเดียวกันเช่นข้างต้นเราใช้ 'ชื่อสัญญาณ' และต่อมาเราได้ใช้ 'หมายเลขสัญญาณ'

คำตัดสิน : เรามีทางเลือกที่เปิดกว้างว่าจะใช้ 'ชื่อสัญญาณ' หรือ 'หมายเลขสัญญาณ' ด้วยคำสั่งkill


19

เป็นการอ้างอิงถึง "Revoulution 9" ของ The Beatles คอลเลกชันของคลิปเสียงที่ร้อยเข้าด้วยกันและพบว่าเสียงบันทึกนี้มีลักษณะการบันทึกของจอห์นเลนนอนซ้ำไปซ้ำมา "หมายเลข 9 หมายเลข 9 ... " นอกจากนี้เพลงนี้ยังดึงดูดความสนใจมากขึ้นในปี 1969 เมื่อพบว่าเมื่อเล่นย้อนกลับจอห์นดูเหมือน ที่จะพูดว่า "เปิดหน่อยคนตาย ... "

ดังนั้นสัญญาณที่เก้าจึงถูกกำหนดให้เป็นสัญญาณสังหารที่อันตรายที่สุด


17
ไม่สามารถบอกได้จริงๆว่าคุณกำลังดึงมันออกจากตูดของคุณหรือมีโอกาสที่จะเป็นจริง
Jonathon Reinhart

จุดจบของหัวข้อนั้นเป็นเรื่องที่ยิ่งใหญ่จริงๆโดยเฉพาะสองความคิดเห็นก่อนหน้าฉัน ฉันยังสะดุดกับบทความเกี่ยวกับการฆ่าและลำดับที่จะใช้: pthree.org/2012/08/14/app suitable
use

ฉันอยากให้เรื่องนี้เป็นจริงมาก ... :)
nafas

คนที่พูดว่า 'หมายเลข 9' ไม่ใช่เลนนอน ฉันสงสัยว่ามีความจริงมากพอ ๆ กับเรื่องที่เหลือ (คือไม่มี) แต่ใครจะรู้ :)
Stephen Kennedy

8

มีรายการที่ยาวมากของสัญญาณ Unix ซึ่งคุณสามารถดูข้อมูลของวิกิพีเดีย ค่อนข้างสับสนคุณสามารถใช้killเพื่อส่งสัญญาณไปยังกระบวนการได้ ตัวอย่างเช่นkill -SIGSTOP 12345บังคับให้กระบวนการ 12345 หยุดการดำเนินการชั่วคราวในขณะที่kill -SIGCONT 12345บอกให้ดำเนินการต่อ รุ่นเล็กน้อยคลุมเครือน้อยมีkill -9kill -SIGKILL


2
เรียกระบบพื้นฐานที่ส่งสัญญาณkillด้วย อาจเป็นเพราะพฤติกรรมเริ่มต้นสำหรับสัญญาณชุดเดิมส่วนใหญ่ (หมายเลข 1 ถึง 15) คือการยุติกระบวนการ
zwol

4

ฉันไม่คิดว่าจะมีความสำคัญกับหมายเลข 9 นอกจากนี้แม้จะมีความเชื่อทั่วไป แต่killก็ไม่ได้ใช้เพื่อฆ่ากระบวนการเท่านั้น แต่ยังส่งสัญญาณไปยังกระบวนการด้วย หากคุณอยากรู้จริงๆคุณสามารถอ่านที่นี่และที่นี่



3

SIGKILLใช้เพื่อฆ่ากระบวนการ SIGKILLไม่สามารถละเลยหรือจัดการได้ ใน Linux SIGKILLวิธีที่จะให้

kill -9 <process_pid> 
kill -SIGKILL <process_pid> 
killall -SIGKILL <process_name>
killall -9 <process_name>

1

พิมพ์คำสั่ง kill -l บนเชลล์ของคุณ

คุณจะพบว่าที่หมายเลข9 [ 9) SIGKILL ] ดังนั้นเราสามารถใช้ kill -9 หรือ kill -SIGKILL

SIGKILL เป็นสัญญาณฆ่าอย่างแน่นอนไม่สามารถปลดตำแหน่งเพิกเฉยหรือจัดการได้ มันทำงานร่วมกับพฤติกรรมเริ่มต้นเสมอนั่นคือการฆ่ากระบวนการ


1

-9เป็น signal_number และระบุว่าได้ส่งข้อความฆ่าควรจะฆ่า (ไม่ใช่ catchable ไม่เพิกเฉย) ประเภท

kill -9 pid

ซึ่งเหมือนกับด้านล่าง

kill -SIGKILL pid

โดยไม่ระบุ signal_number ค่าเริ่มต้นคือ -15 ซึ่งก็คือ TERM (สัญญาณการยุติซอฟต์แวร์) พิมพ์ดีดเป็นเช่นเดียวกับkill <pid>kill -15 <pid>


0

ทั้งสองเหมือนกับ kill -sigkill processID, kill -9 processID โดยพื้นฐานแล้วสำหรับการบังคับให้ยุติกระบวนการ


0

มีกระบวนการบางอย่างที่ฆ่าไม่ได้เช่นนี้ "kill% 1" หากเราต้องยุติกระบวนการนั้นดังนั้นจึงใช้คำสั่งพิเศษเพื่อฆ่ากระบวนการนั้นซึ่งก็คือ kill -9 เช่นเปิดเป็นกลุ่มและหยุดถ้าโดยใช้ ctrl + z แล้วดูงานและหลังจากใช้กระบวนการฆ่ากว่ากระบวนการนี้จะไม่สิ้นสุดดังนั้นที่นี่เราใช้คำสั่ง kill -9 สำหรับการยุติ

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