สัญญาณ — คำสั่ง Linux/Unix

ลินุกซ์ รองรับสัญญาณที่เชื่อถือได้ทั้ง POSIX (ต่อไปนี้เรียกว่า "สัญญาณมาตรฐาน") และสัญญาณแบบเรียลไทม์ POSIX

การใช้สัญญาณบน Linux

สัญญาณบนระบบ Linux บอก ระบบปฏิบัติการ วิธีจัดการกับโปรแกรมหรือกระบวนการที่ทำงานอยู่ เมื่อคุณปิดโปรแกรมตามปกติ มันจะส่งสัญญาณไปยังระบบเพื่อบอกให้ปิดโปรแกรม คุณสามารถทำได้ด้วยตนเองเช่นกัน

เริ่มต้นด้วยการค้นหากระบวนการที่คุณต้องการปิด คุณสามารถทำได้ด้วย:

ps aux | grep -i 

ดังนั้น หากคุณต้องการปิด Firefox จากบรรทัดคำสั่ง ให้ป้อน:

ps aux | grep -i firefox

คุณจะได้รับรายการกระบวนการมากมายจาก Firefox เพราะมันเป็นแอพพลิเคชั่นแบบมัลติเธรด ค้นหากระบวนการพื้นฐานสำหรับ /usr/lib/firefox มักจะเป็นคนแรก

รายการกระบวนการ Linux Firefox

หากคุณพบว่าล้นหลาม คุณสามารถใช้ pgrep. มันทำงานคล้ายกัน แต่ให้รหัสกระบวนการกับคุณเท่านั้น

pgrep firefox. 

รหัสกระบวนการต่ำสุดจะเป็นกระบวนการพื้นฐานที่คุณต้องการ

Linux pgrep Firefox

เมื่อคุณมีแล้ว ให้ค้นหาหมายเลข ID กระบวนการ สิ่งแรกที่อยู่ในรายการจะเป็นผู้ใช้ที่เรียกใช้กระบวนการเสมอ ถัดไปจะเป็น ID กระบวนการ ในมือคุณสามารถส่ง SIGTERM ส่งสัญญาณไปยังกระบวนการที่จะหยุดมันโดยใช้ คำสั่งฆ่า.

ฆ่า -SIGTERM 4790. 
Linux SIGTERM Firefox

แต่ละสัญญาณยังมีตัวเลขที่สอดคล้องกันสำหรับชวเลข ตัวเลขสำหรับ SIGTERM คือ 15คุณจึงใช้คำนั้นได้เหมือนกับคำเต็ม

ฆ่า -15 4790

SIGTERM เป็นการดำเนินการเริ่มต้นของคำสั่ง kill เป็นผลให้คุณไม่จำเป็นต้องระบุเลย เพียงใช้:

ฆ่า 4790

คุณจะได้ผลลัพธ์ที่เหมือนกันทุกประการ

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

ฆ่า -l
รายการสัญญาณลินุกซ์

ใช่มีจำนวนมาก โชคดีที่คุณจะไม่แตะต้องคนส่วนใหญ่ เว้นแต่ว่าคุณจะเริ่มพัฒนาหรือเขียนสคริปต์การดูแลระบบ บ่อยครั้งเมื่อ SIGTERM ล้มเหลวในการหยุดกระบวนการที่ไม่ตอบสนอง คุณจะต้องมองหาลินุกซ์ที่เทียบเท่า Ctrl+Alt+Delete, ซิกคิลล์.

ไม่เหมือนกับตัวจัดการกระบวนการ Ctrl+Alt+Delete ที่น่าอับอาย SIGKILL ใช้งานได้จริง อันที่จริง คุณควรเพิกเฉยต่อปัจจัยอื่นๆ ทั้งหมดและกำจัดกระบวนการที่ละเมิดออกไป ไม่ว่าจะเกิดอะไรขึ้น นั่นก็หมายความว่า SIGKILL อาจเป็นอันตรายได้หากคุณทำผิดขั้นตอน

เริ่มต้นด้วยวิธีเดียวกันโดยค้นหา ID กระบวนการ

pgrep firefox

ตอนนี้ แทนที่จะใช้ SIGTERM เพื่อหยุดกระบวนการ ให้ใช้ SIGKILL ที่ทำลายล้างมากกว่า

ฆ่า -SIGKILL 4790

แม้ว่ากระบวนการจะถูกล็อคโดยสมบูรณ์ แต่ก็ควรปิดภายในไม่กี่วินาที

Linux SIGKILL Firefox

เช่นเดียวกับ SIGTERM มีตัวเลขที่ตรงกับ SIGKILL ในกรณีนี้คือ 9.

ฆ่า -9 4790

เช่นเดียวกับก่อนหน้านี้ กระบวนการควรจะตายเกือบจะในทันที

คุณควรทราบด้วย SIGINT. นี่เป็นการขัดจังหวะจากแป้นพิมพ์ และเป็นคำสั่งมากกว่าที่คุณคิดในบรรทัดคำสั่ง เมื่อคุณกด Ctrl+C ในการหยุดกระบวนการจากหน้าต่างเทอร์มินัล คุณกำลังออก SIGINT จริงๆ รหัสของมันคือ 2และคุณสามารถใช้มันได้เหมือนกับคำสั่งอื่นๆ ที่มีคำสั่ง kill

ฆ่า -2 4790

นี่ไม่ใช่เรื่องธรรมดาเลยเพราะคุณมีแนวโน้มที่จะไปกับ Ctrl+Cแต่ก็ดีแล้วที่รู้ตัว

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

รายละเอียดทางเทคนิค

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

สัญญาณมาตรฐาน

Linux รองรับสัญญาณมาตรฐานตามรายการด้านล่าง หมายเลขสัญญาณหลายหมายเลขขึ้นอยู่กับสถาปัตยกรรม ตามที่ระบุในคอลัมน์ "ค่า" (ในกรณีที่ให้ค่าสามค่า ค่าแรกมักจะใช้ได้กับ alpha และ sparc ค่ากลางสำหรับ i386, ppc และ sh และค่าสุดท้ายสำหรับ mips เอ - แสดงว่าไม่มีสัญญาณในสถาปัตยกรรมที่เกี่ยวข้อง)

รายการในคอลัมน์ "การดำเนินการ" ของตารางจะระบุการดำเนินการเริ่มต้นสำหรับสัญญาณดังนี้:

ภาคเรียน:Default การกระทำคือการยุติกระบวนการ

อิก:การดำเนินการเริ่มต้นคือการละเว้นสัญญาณ

แกน: การดำเนินการเริ่มต้นคือการยุติกระบวนการและดัมพ์คอร์

หยุด: การดำเนินการเริ่มต้นคือการหยุดกระบวนการ

อย่างแรก สัญญาณที่อธิบายไว้ในมาตรฐาน POSIX.1 ดั้งเดิม

สัญญาณ ค่า การกระทำ ความคิดเห็น
หรือตายจากกระบวนการควบคุม
SIGINT 2 ภาคเรียน ขัดจังหวะจากแป้นพิมพ์
SIGQUIT 3 แกน ออกจากแป้นพิมพ์
SIGILL 4 แกน คำสั่งที่ผิดกฎหมาย
SIGABRT 6 แกน ยกเลิกสัญญาณจาก ยกเลิก(3)
SIGFPE 8 แกน ข้อยกเว้นจุดลอยตัว
ซิกคิลล์ 9 ภาคเรียน ฆ่าสัญญาณ
SIGSEGV 11 แกน การอ้างอิงหน่วยความจำไม่ถูกต้อง
SIGPIPE 13 ภาคเรียน ไปป์แตก: เขียนถึงไปป์ที่ไม่มีผู้อ่าน
SIGALRM 14 ภาคเรียน สัญญาณจับเวลาจาก เตือน(2)
SIGTERM 15 ภาคเรียน สัญญาณสิ้นสุด
SIGUSR1 30,10,16 ภาคเรียน สัญญาณที่ผู้ใช้กำหนด 1
SIGUSR2 31,12,17 ภาคเรียน ผู้ใช้กำหนดสัญญาณ2
SIGCHLD 20,17,18 อิก เด็กหยุดหรือสิ้นสุด
ซิกคอน 19,18,25 ดำเนินการต่อหากหยุด
SIGSTOP 17,19,23 หยุด หยุดกระบวนการ
SIGTSTP 18,20,24 หยุด หยุดพิมพ์ที่ tty
SIGTTIN 21,21,26 หยุด อินพุต tty สำหรับกระบวนการพื้นหลัง
ซิกโตว 22,22,27 หยุด เอาต์พุต tty สำหรับกระบวนการพื้นหลัง

สัญญาณ ซิกคิลล์ และ SIGSTOP ไม่สามารถจับ ปิดกั้น หรือเพิกเฉยได้

ถัดไป สัญญาณไม่อยู่ในมาตรฐาน POSIX.1 แต่อธิบายไว้ใน SUSv2 และ SUSv3 / POSIX 1003.1-2001

สัญญาณ ค่า การกระทำ ความคิดเห็น
ซิกโพล ภาคเรียน เหตุการณ์แบบสำรวจได้ (Sys V) คำพ้องความหมายของ SIGIO
SIGPROF 27,27,29 ภาคเรียน ตัวจับเวลาการทำโปรไฟล์หมดอายุ
ซิกซิส 12,-,12 แกน อาร์กิวเมนต์ไม่ถูกต้องสำหรับรูทีน (SVID)
ซิกแทรป 5 แกน กับดักร่องรอย/เบรกพอยต์
SIGURG 16,23,21 อิก สภาพด่วนบนซ็อกเก็ต (4.2 BSD)
SIGVTALRM 26,26,28 ภาคเรียน นาฬิกาปลุกเสมือน (4.2 BSD)
SIGXCPU 24,24,30 แกน เกินขีดจำกัดเวลาของ CPU (4.2 BSD)
SIGXFSZ 25,25,31 แกน เกินขีดจำกัดขนาดไฟล์ (4.2 BSD)

มากถึงและรวมถึง Linux 2.2 ลักษณะการทำงานเริ่มต้นสำหรับ ซิกซิส, SIGXCPU, SIGXFSZและ (บนสถาปัตยกรรมอื่นที่ไม่ใช่ SPARC และ MIPS) ซิกบัส คือการยุติกระบวนการ (โดยไม่มีคอร์ดัมพ์) (ใน Unices อื่น ๆ การดำเนินการเริ่มต้นสำหรับ SIGXCPU และ SIGXFSZ คือยุติกระบวนการโดยไม่มีคอร์ดัมพ์) Linux 2.4 เป็นไปตามข้อกำหนด POSIX 1003.1-2001 สำหรับสัญญาณเหล่านี้ ซึ่งจะยุติกระบวนการด้วยคอร์ดัมพ์

ต่อไปเป็นสัญญาณอื่นๆ

สัญญาณ ค่า การกระทำ ความคิดเห็น
SIGEMT 7,-,7 ภาคเรียน
SIGSTKFLT -,16,- ภาคเรียน ข้อผิดพลาดของสแต็กบนตัวประมวลผลร่วม (ไม่ได้ใช้)
SIGIO 23,29,22 ภาคเรียน I/O สามารถทำได้แล้ว (4.2 BSD)
SIGCLD -,-,18 อิก คำพ้องความหมายสำหรับ SIGCHLD
SIGPWR 29,30,19 ภาคเรียน ไฟฟ้าขัดข้อง (ระบบ V)
ซิกอินโฟ 29,-,- คำพ้องความหมายสำหรับ SIGPWR
SIGLOST -,-,- ภาคเรียน ล็อกไฟล์หาย
ซิกวินช์ 28,28,20 อิก สัญญาณปรับขนาดหน้าต่าง (4.3 BSD, Sun)
SIGUNUSED -,31,- ภาคเรียน สัญญาณที่ไม่ได้ใช้ (จะเป็น SIGSYS)

(สัญญาณ 29 คือ ซิกอินโฟ / SIGPWR บนอัลฟ่าแต่ SIGLOST บนสปาร์ก)

SIGEMT ไม่ได้ระบุไว้ใน POSIX 1003.1-2001 แต่ยังคงปรากฏบน Unices อื่น ๆ ส่วนใหญ่ ซึ่งโดยทั่วไปการดำเนินการเริ่มต้นจะยุติกระบวนการด้วยการถ่ายโอนข้อมูลหลัก

SIGPWR (ซึ่งไม่ได้ระบุไว้ใน POSIX 1003.1-2001) โดยทั่วไปแล้วจะละเว้นโดยค่าเริ่มต้นบน Unices อื่นๆ ที่ปรากฏ

SIGIO (ซึ่งไม่ได้ระบุไว้ใน POSIX 1003.1-2001) จะถูกละเว้นโดยค่าเริ่มต้นใน Unices อื่นๆ

สัญญาณเรียลไทม์

Linux รองรับสัญญาณแบบเรียลไทม์ตามที่กำหนดไว้ในส่วนขยายแบบเรียลไทม์ของ POSIX.4 (และตอนนี้รวมอยู่ใน POSIX 1003.1-2001) Linux รองรับสัญญาณเรียลไทม์ 32 สัญญาณ ตัวเลขจาก 32 (SIGRTMIN) ถึง 63 (SIGRTMAX). (โปรแกรมควรอ้างถึงสัญญาณแบบเรียลไทม์โดยใช้สัญกรณ์ SIGRTMIN+n เนื่องจากช่วงของหมายเลขสัญญาณตามเวลาจริงจะแตกต่างกันไปตาม Unices)

ต่างจากสัญญาณมาตรฐานตรง สัญญาณเรียลไทม์ไม่มีความหมายที่กำหนดไว้ล่วงหน้า: สามารถใช้สัญญาณเรียลไทม์ทั้งชุดเพื่อวัตถุประสงค์ที่กำหนดโดยแอปพลิเคชัน (อย่างไรก็ตาม โปรดทราบว่าการนำ LinuxThreads ไปใช้นั้นใช้สัญญาณเรียลไทม์สามตัวแรก)

การดำเนินการเริ่มต้นสำหรับสัญญาณตามเวลาจริงที่ไม่สามารถจัดการได้คือการยุติกระบวนการรับ

สัญญาณเรียลไทม์มีความโดดเด่นดังต่อไปนี้:

  1. สามารถจัดคิวสัญญาณเรียลไทม์ได้หลายอินสแตนซ์ ในทางตรงกันข้าม หากมีการส่งสัญญาณมาตรฐานหลายอินสแตนซ์ในขณะที่สัญญาณนั้นถูกบล็อกอยู่ อินสแตนซ์เดียวเท่านั้นที่จะเข้าคิว
  2. หากส่งสัญญาณโดยใช้ ซิกคิว(2) ค่าที่มาพร้อมกัน (ไม่ว่าจะเป็นจำนวนเต็มหรือตัวชี้) สามารถส่งพร้อมกับสัญญาณได้ หากกระบวนการรับสร้างตัวจัดการสำหรับสัญญาณนี้โดยใช้ SA_SIGACTION ตั้งค่าสถานะเป็น sigaction(2) จากนั้นสามารถรับข้อมูลนี้ผ่านทางsi_value สนามของ siginfo_t โครงสร้างส่งผ่านเป็นอาร์กิวเมนต์ที่สองไปยังตัวจัดการ นอกจากนี้ si_pid และ si_uid ฟิลด์ของโครงสร้างนี้สามารถใช้เพื่อรับ PID และ ID ผู้ใช้จริงของกระบวนการที่ส่งสัญญาณ
  3. สัญญาณเรียลไทม์จะถูกส่งในคำสั่งซื้อที่รับประกัน มีการส่งสัญญาณเรียลไทม์ประเภทเดียวกันหลายรายการตามลำดับที่ส่ง หากมีการส่งสัญญาณแบบเรียลไทม์ที่แตกต่างกันไปยังกระบวนการ สัญญาณเหล่านั้นจะถูกส่งโดยเริ่มจากสัญญาณที่มีตัวเลขต่ำสุด (เช่น สัญญาณเลขต่ำจะมีลำดับความสำคัญสูงสุด)

หากทั้งสัญญาณมาตรฐานและเรียลไทม์กำลังรอดำเนินการสำหรับกระบวนการ POSIX จะไม่ระบุสัญญาณซึ่งจะถูกส่งก่อน Linux เช่นเดียวกับการใช้งานอื่นๆ ให้ความสำคัญกับสัญญาณมาตรฐานในกรณีนี้

ตาม POSIX การใช้งานควรอนุญาตให้สัญญาณแบบเรียลไทม์อย่างน้อย _POSIX_SIGQUEUE_MAX (32) ถูกจัดคิวไปยังกระบวนการ อย่างไรก็ตาม แทนที่จะวางขีดจำกัดต่อกระบวนการ Linux กำหนดขีดจำกัดทั้งระบบสำหรับจำนวนของสัญญาณแบบเรียลไทม์ที่เข้าคิวสำหรับกระบวนการทั้งหมด สามารถดูขีดจำกัดนี้ (และมีสิทธิ์) เปลี่ยนแปลงได้ผ่านปุ่ม /proc/sys/kernel/rtsig-max ไฟล์. ไฟล์ที่เกี่ยวข้อง/proc/sys/kernel/rtsig-maxสามารถใช้เพื่อค้นหาจำนวนสัญญาณตามเวลาจริงที่อยู่ในคิวในปัจจุบัน

สอดคล้องกับ

POSIX.1.

ใช้ ชาย สั่งการ (% ชาย) เพื่อดูวิธีการใช้คำสั่งบนคอมพิวเตอร์เฉพาะของคุณ