สัญญาณ — คำสั่ง Linux/Unix
ลินุกซ์ รองรับสัญญาณที่เชื่อถือได้ทั้ง POSIX (ต่อไปนี้เรียกว่า "สัญญาณมาตรฐาน") และสัญญาณแบบเรียลไทม์ POSIX
การใช้สัญญาณบน Linux
สัญญาณบนระบบ Linux บอก ระบบปฏิบัติการ วิธีจัดการกับโปรแกรมหรือกระบวนการที่ทำงานอยู่ เมื่อคุณปิดโปรแกรมตามปกติ มันจะส่งสัญญาณไปยังระบบเพื่อบอกให้ปิดโปรแกรม คุณสามารถทำได้ด้วยตนเองเช่นกัน
เริ่มต้นด้วยการค้นหากระบวนการที่คุณต้องการปิด คุณสามารถทำได้ด้วย:
ps aux | grep -i
ดังนั้น หากคุณต้องการปิด Firefox จากบรรทัดคำสั่ง ให้ป้อน:
ps aux | grep -i firefox
คุณจะได้รับรายการกระบวนการมากมายจาก Firefox เพราะมันเป็นแอพพลิเคชั่นแบบมัลติเธรด ค้นหากระบวนการพื้นฐานสำหรับ /usr/lib/firefox มักจะเป็นคนแรก

หากคุณพบว่าล้นหลาม คุณสามารถใช้ pgrep. มันทำงานคล้ายกัน แต่ให้รหัสกระบวนการกับคุณเท่านั้น
pgrep firefox.
รหัสกระบวนการต่ำสุดจะเป็นกระบวนการพื้นฐานที่คุณต้องการ

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

แต่ละสัญญาณยังมีตัวเลขที่สอดคล้องกันสำหรับชวเลข ตัวเลขสำหรับ SIGTERM คือ 15คุณจึงใช้คำนั้นได้เหมือนกับคำเต็ม
ฆ่า -15 4790
SIGTERM เป็นการดำเนินการเริ่มต้นของคำสั่ง kill เป็นผลให้คุณไม่จำเป็นต้องระบุเลย เพียงใช้:
ฆ่า 4790
คุณจะได้ผลลัพธ์ที่เหมือนกันทุกประการ
ทั้งหมดนี้ก็ดีและดีถ้ากระบวนการตอบสนองได้ แต่คุณจะไม่ปิดกระบวนการตอบสนองด้วยวิธีนี้ อย่างน้อยก็ไม่ใช่บนเดสก์ท็อป แล้วคุณจะทำอย่างไรกับกระบวนการที่ไม่ตอบสนอง? มีสัญญาณที่เป็นไปได้มากมาย สำหรับแนวคิดที่ดียิ่งขึ้นว่าช่วงกว้างแค่ไหน ให้มองหา
ฆ่า -l

ใช่มีจำนวนมาก โชคดีที่คุณจะไม่แตะต้องคนส่วนใหญ่ เว้นแต่ว่าคุณจะเริ่มพัฒนาหรือเขียนสคริปต์การดูแลระบบ บ่อยครั้งเมื่อ SIGTERM ล้มเหลวในการหยุดกระบวนการที่ไม่ตอบสนอง คุณจะต้องมองหาลินุกซ์ที่เทียบเท่า Ctrl+Alt+Delete, ซิกคิลล์.
ไม่เหมือนกับตัวจัดการกระบวนการ Ctrl+Alt+Delete ที่น่าอับอาย SIGKILL ใช้งานได้จริง อันที่จริง คุณควรเพิกเฉยต่อปัจจัยอื่นๆ ทั้งหมดและกำจัดกระบวนการที่ละเมิดออกไป ไม่ว่าจะเกิดอะไรขึ้น นั่นก็หมายความว่า SIGKILL อาจเป็นอันตรายได้หากคุณทำผิดขั้นตอน
เริ่มต้นด้วยวิธีเดียวกันโดยค้นหา ID กระบวนการ
pgrep firefox
ตอนนี้ แทนที่จะใช้ SIGTERM เพื่อหยุดกระบวนการ ให้ใช้ SIGKILL ที่ทำลายล้างมากกว่า
ฆ่า -SIGKILL 4790
แม้ว่ากระบวนการจะถูกล็อคโดยสมบูรณ์ แต่ก็ควรปิดภายในไม่กี่วินาที

เช่นเดียวกับ 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 ไปใช้นั้นใช้สัญญาณเรียลไทม์สามตัวแรก)
การดำเนินการเริ่มต้นสำหรับสัญญาณตามเวลาจริงที่ไม่สามารถจัดการได้คือการยุติกระบวนการรับ
สัญญาณเรียลไทม์มีความโดดเด่นดังต่อไปนี้:
- สามารถจัดคิวสัญญาณเรียลไทม์ได้หลายอินสแตนซ์ ในทางตรงกันข้าม หากมีการส่งสัญญาณมาตรฐานหลายอินสแตนซ์ในขณะที่สัญญาณนั้นถูกบล็อกอยู่ อินสแตนซ์เดียวเท่านั้นที่จะเข้าคิว
- หากส่งสัญญาณโดยใช้ ซิกคิว(2) ค่าที่มาพร้อมกัน (ไม่ว่าจะเป็นจำนวนเต็มหรือตัวชี้) สามารถส่งพร้อมกับสัญญาณได้ หากกระบวนการรับสร้างตัวจัดการสำหรับสัญญาณนี้โดยใช้ SA_SIGACTION ตั้งค่าสถานะเป็น sigaction(2) จากนั้นสามารถรับข้อมูลนี้ผ่านทางsi_value สนามของ siginfo_t โครงสร้างส่งผ่านเป็นอาร์กิวเมนต์ที่สองไปยังตัวจัดการ นอกจากนี้ si_pid และ si_uid ฟิลด์ของโครงสร้างนี้สามารถใช้เพื่อรับ PID และ ID ผู้ใช้จริงของกระบวนการที่ส่งสัญญาณ
- สัญญาณเรียลไทม์จะถูกส่งในคำสั่งซื้อที่รับประกัน มีการส่งสัญญาณเรียลไทม์ประเภทเดียวกันหลายรายการตามลำดับที่ส่ง หากมีการส่งสัญญาณแบบเรียลไทม์ที่แตกต่างกันไปยังกระบวนการ สัญญาณเหล่านั้นจะถูกส่งโดยเริ่มจากสัญญาณที่มีตัวเลขต่ำสุด (เช่น สัญญาณเลขต่ำจะมีลำดับความสำคัญสูงสุด)
หากทั้งสัญญาณมาตรฐานและเรียลไทม์กำลังรอดำเนินการสำหรับกระบวนการ POSIX จะไม่ระบุสัญญาณซึ่งจะถูกส่งก่อน Linux เช่นเดียวกับการใช้งานอื่นๆ ให้ความสำคัญกับสัญญาณมาตรฐานในกรณีนี้
ตาม POSIX การใช้งานควรอนุญาตให้สัญญาณแบบเรียลไทม์อย่างน้อย _POSIX_SIGQUEUE_MAX (32) ถูกจัดคิวไปยังกระบวนการ อย่างไรก็ตาม แทนที่จะวางขีดจำกัดต่อกระบวนการ Linux กำหนดขีดจำกัดทั้งระบบสำหรับจำนวนของสัญญาณแบบเรียลไทม์ที่เข้าคิวสำหรับกระบวนการทั้งหมด สามารถดูขีดจำกัดนี้ (และมีสิทธิ์) เปลี่ยนแปลงได้ผ่านปุ่ม /proc/sys/kernel/rtsig-max ไฟล์. ไฟล์ที่เกี่ยวข้อง/proc/sys/kernel/rtsig-maxสามารถใช้เพื่อค้นหาจำนวนสัญญาณตามเวลาจริงที่อยู่ในคิวในปัจจุบัน
สอดคล้องกับ
POSIX.1.
ใช้ ชาย สั่งการ (% ชาย) เพื่อดูวิธีการใช้คำสั่งบนคอมพิวเตอร์เฉพาะของคุณ