คำสั่ง killall: หยุดโปรเซสตามชื่อ สัญญาณ -9 และการติดตั้ง psmisc
คำสั่ง killall เป็นคำสั่ง Linux ที่เลือกโปรเซสที่กำลังทำงานจากชื่อโปรแกรมแทนหมายเลขโปรเซส (PID) แล้วส่งสัญญาณไปให้ ถ้าคุณไม่ระบุสัญญาณ คำสั่งจะส่ง SIGTERM (ตามคู่มืออย่างเป็นทางการ) เนื่องจากคำสั่งนี้หยุดโปรเซสที่มีชื่อเดียวกันทั้งหมดในคราวเดียว เราจึงตรวจสอบโปรเซสสี่ตัวที่รันจากสำเนาของ sleep ในชื่ออื่นบนเซิร์ฟเวอร์ AlmaLinux 9 ด้วย pgrep และ ps ก่อน และพบว่าไฟล์ที่รันได้ซึ่งชื่อยาวเกิน 15 ตัวอักษรจะเหลือเพียง 15 ตัวอักษรแรกในชื่อโปรเซส
เรารัน killall เฉพาะกับโปรเซส xxsleep ที่เปิดไว้เพื่อทดสอบด้วยบัญชีผู้ใช้ทั่วไปบนเซิร์ฟเวอร์ Debian 12 เท่านั้น กล่องผลลัพธ์แสดงเอาต์พุตของ rpm, pgrep, ps, pidof, cat และ kill ที่รันด้วยบัญชี root บนเซิร์ฟเวอร์ AlmaLinux 9.8 และเอาต์พุตของ killall ที่รันบนเซิร์ฟเวอร์ Debian 12 หมายเลขโปรเซส (PID) ชื่อโปรเซส พาธของไฟล์ที่รันได้ และชื่อบัญชีถูกเปลี่ยนเป็นค่าตัวอย่าง
1️⃣ ติดตั้งคำสั่ง killall
killall อยู่ในแพ็กเกจ psmisc เมื่อตรวจสอบด้วย rpm บนเซิร์ฟเวอร์ AlmaLinux 9.8 ว่า /usr/bin/killall เป็นของแพ็กเกจใด ผลที่ได้คือเวอร์ชัน psmisc 23.4
rpm -qf --qf '%{NAME} %{VERSION}\n' /usr/bin/killallpsmisc 23.4รายการไฟล์ของแพ็กเกจเดียวกันที่ดูด้วย rpm -ql มี pstree และ fuser อยู่ด้วย
ถ้าเห็น [command not found] ซึ่งหมายถึงหาคำสั่งไม่พบ ให้ติดตั้งแพ็กเกจ psmisc ตระกูล RHEL ใช้ [dnf install psmisc] และตระกูล Debian ใช้ [apt install psmisc] บนเซิร์ฟเวอร์ Debian 12 มี psmisc 23.6 ติดตั้งอยู่แล้ว และ killall อยู่ที่ /usr/bin/killall
เมื่อตรวจสอบบนเซิร์ฟเวอร์ AlmaLinux 9.8 พบว่า pkill ที่ชื่อคล้ายกันอยู่ในแพ็กเกจ procps-ng ส่วน kill เป็นคำสั่งในตัวของเชลล์
2️⃣ วิธีใช้คำสั่ง killall
รูปแบบพื้นฐานคือ [killall ชื่อโปรเซส] คำสั่งจะค้นหาโปรเซสที่กำลังทำงานด้วยชื่อที่ระบุทั้งหมดแล้วส่งสัญญาณไปให้ ถ้าระบุหลายชื่อ ก็จะทำแบบเดียวกันกับทุกชื่อ (ตามคู่มืออย่างเป็นทางการ)
เนื่องจากโปรเซสที่มีชื่อเดียวกันจะหยุดพร้อมกันทั้งหมด ให้ตรวจสอบด้วย pgrep ก่อนว่ามีอะไรทำงานอยู่ในชื่อนั้น เราคัดลอก sleep ไปไว้ในโฟลเดอร์งานในชื่อ xxsleep-a1, xxsleep-a2 และ xxsleep-longname-x1 แล้วรัน xxsleep-a1 สองครั้ง รวมเป็นสี่โปรเซส จากนั้นแสดงหมายเลขและชื่อด้วย -l
pgrep -l xxsleep2141 xxsleep-a1
2142 xxsleep-a1
2150 xxsleep-a2
2155 xxsleep-longnamบรรทัดที่สี่มีชื่อไฟล์ที่รันได้เป็น xxsleep-longname-x1 แต่ชื่อโปรเซสถูกตัดไว้ที่ xxsleep-longnam
เมื่อเพิ่ม -a จะแสดงบรรทัดคำสั่งที่รันทั้งหมด xxsleep-a1 สองตัวที่ชื่อเหมือนกันแยกได้จากอาร์กิวเมนต์วินาทีท้ายคำสั่ง คือ 300 และ 310
pgrep -a xxsleep2141 /root/work/xxsleep-a1 300
2142 /root/work/xxsleep-a1 310
2150 /root/work/xxsleep-a2 320
2155 /root/work/xxsleep-longname-x1 330ถ้าต้องการหาเฉพาะโปรเซสที่ชื่อตรงกันทุกตัวอักษร ให้เพิ่ม -x ผลของ xxsleep-a1 คือหมายเลขสองตัว
pgrep -x xxsleep-a12141
2142ถ้าต้องการใส่ชื่อเดียวตามที่เป็นแล้วดูเฉพาะหมายเลข ให้ใช้ pidof เมื่อค้นหา xxsleep-a1 หมายเลขทั้งสองแสดงในบรรทัดเดียว
pidof xxsleep-a12142 2141ps จะแสดงเฉพาะโปรเซสที่ชื่อตรงกันทุกตัวอักษร เมื่อระบุหลายชื่อคั่นด้วยจุลภาคหลัง -C
ps -o pid,comm -C xxsleep-a1,xxsleep-a2 PID COMMAND
2141 xxsleep-a1
2142 xxsleep-a1
2150 xxsleep-a2บนเซิร์ฟเวอร์ Debian 12 เราเปิดสี่โปรเซสด้วยชื่อเดียวกันแล้วรัน [killall xxsleep-a1] ปรากฏว่าไม่มีเอาต์พุตใดและจบด้วยรหัสออก 0 เมื่อค้นหาอีกครั้งด้วย pgrep พบว่า xxsleep-a1 ทั้งสองหายไป เหลือเพียง xxsleep-a2 และ xxsleep-longname-x1 ถ้าระบุพาธที่มีเครื่องหมายทับ (/) แทนชื่อ คำสั่งจะเลือกโปรเซสที่รันไฟล์นั้นโดยไม่สนชื่อ (ตามคู่มืออย่างเป็นทางการ)
เมื่อระบุชื่อที่ไม่มีอยู่คือ xxsleep-zz จะมีบรรทัดที่ต่อท้ายชื่อด้วย [no process found] และจบด้วยรหัสออก 1 รหัสออกจะเป็น 0 ก็ต่อเมื่อหยุดโปรเซสได้อย่างน้อยหนึ่งตัวสำหรับทุกชื่อที่ระบุ (ตามคู่มืออย่างเป็นทางการ)
killall xxsleep-zzxxsleep-zz: no process foundถ้าต้องการหยุดเพียงโปรเซสเดียวที่รู้หมายเลขอยู่แล้ว ให้ใช้ คำสั่ง kill ของ Linux ส่งสัญญาณไปยังหมายเลขนั้นเท่านั้น
3️⃣ ตัวเลือกของคำสั่ง killall
เมื่ออ่านชื่อของโปรเซสที่เปิดด้วย xxsleep-longname-x1 จาก /proc/PID/comm พบว่าเหลือเพียง 15 ตัวอักษรแรกคือ xxsleep-longnam
cat /proc/2155/commxxsleep-longnamเรารัน pgrep ด้วย xxsleep-longname ที่ยาว 16 ตัวอักษร
pgrep -a xxsleep-longnameคำสั่งจบโดยไม่มีเอาต์พุตด้วยรหัสออก 1 และเมื่อค้นหาอีกครั้งด้วย xxsleep-longnam ที่ยาว 15 ตัวอักษร โปรเซสนั้นก็ปรากฏ
pgrep -l xxsleep-longnam2155 xxsleep-longnamเมื่อ killall ได้รับชื่อที่ยาวเกิน 15 ตัวอักษร และมีโปรเซสที่อ่านชื่อเต็มไม่ได้ คำสั่งจะเลือกทุกโปรเซสที่ 15 ตัวอักษรแรกตรงกันเป็นเป้าหมาย ถ้าเพิ่ม -e จะข้ามรายการเหล่านั้น (ตามคู่มืออย่างเป็นทางการ) บนเซิร์ฟเวอร์ Debian 12 เมื่อระบุ 15 ตัวอักษรแรก xxsleep-longnam พร้อม -e และ -v จะมีบรรทัดแจ้งว่าข้ามโปรเซสอื่นสามตัวที่ชื่อถูกตัดที่ 15 ตัวอักษร แล้วจบด้วย [no process found]
killall -e -v xxsleep-longnamkillall: skipping partial match quota_events_un(37)
killall: skipping partial match acpi_thermal_pm(112)
killall: skipping partial match ext4-rsv-conver(246)
xxsleep-longnam: no process foundเมื่อระบุชื่อเต็ม xxsleep-longname-x1 หลังบรรทัดข้ามแบบเดียวกันจะมีบรรทัดที่แสดงว่าส่งสัญญาณไปยังโปรเซสนั้นแล้ว
killall -e -v xxsleep-longname-x1killall: skipping partial match quota_events_un(37)
killall: skipping partial match acpi_thermal_pm(112)
killall: skipping partial match ext4-rsv-conver(246)
Killed xxsleep-longname-x1(2155) with signal 15เมื่อเพิ่ม -v จะมีบรรทัดที่มีชื่อ หมายเลข และหมายเลขสัญญาณ แสดงสำหรับทุกโปรเซสที่ได้รับสัญญาณ
killall -v xxsleep-a2Killed xxsleep-a2(2150) with signal 15-i จะถามทีละโปรเซสว่าจะหยุดหรือไม่ เราเปิด xxsleep-a1 สองตัวอีกครั้งแล้วส่ง y และ n ตามลำดับผ่านอินพุตมาตรฐาน คำถามทั้งสองแสดงต่อกันในบรรทัดเดียว และมีเพียง xxsleep-a1 ตัวแรกที่หยุด ส่วนตัวที่สองยังอยู่
printf 'y\nn\n' | killall -i xxsleep-a1Kill xxsleep-a1(2171) ? (y/N) Kill xxsleep-a1(2172) ? (y/N)-u จะเลือกเฉพาะโปรเซสที่บัญชีนั้นเป็นเจ้าของ และถ้าไม่ระบุชื่อ โปรเซสทั้งหมดของบัญชีนั้นจะเป็นเป้าหมาย เมื่อระบุ xxsleep-a1 ต่อท้ายชื่อบัญชีด้วย สัญญาณก็ส่งไปยัง xxsleep-a1 ที่เหลืออยู่เท่านั้น
killall -v -u user xxsleep-a1Killed xxsleep-a1(2172) with signal 15-o และ -y เลือกตามเวลาที่เริ่มทำงาน โดยเขียนเวลาเป็นตัวเลขตามด้วยหน่วย s, m, h, d, w, M หรือ y เช่น [-o 30m]
-r อ่านชื่อเป็นนิพจน์ปกติแบบขยาย เมื่อส่งรูปแบบ ^xxsleep-a ให้ pgrep จะได้สามโปรเซสที่ขึ้นต้นด้วย xxsleep-a
pgrep -l '^xxsleep-a'2141 xxsleep-a1
2142 xxsleep-a1
2150 xxsleep-a2-w จะรอโดยตรวจสอบทุกวินาทีจนกว่าโปรเซสที่ได้รับสัญญาณจะหายไปทั้งหมด ถ้ามีโปรเซสที่เพิกเฉยต่อสัญญาณหรือค้างอยู่ในสถานะซอมบี้ ก็อาจรอไม่สิ้นสุด
ตารางแรกด้านล่างคือคำสั่งตรวจสอบและตัวเลือก killall ที่รันจริงในบทความนี้ ส่วนตัวเลือก killall ที่ไม่ได้รันรวบรวมไว้ในตารางที่สองตามคู่มืออย่างเป็นทางการ
📌 การตรวจสอบโปรเซสและ killall: ผลที่รันในบทความนี้
| คำสั่ง | หน้าที่ | ผลที่เห็นในบทความนี้ | |
|---|---|---|---|
| pgrep -l ชื่อ | หมายเลขและชื่อของโปรเซสที่ชื่อมีคำนั้น | xxsleep ได้สี่บรรทัด ชื่อยาวแสดงแค่ 15 ตัวอักษรแรก xxsleep-longnam | |
| pgrep -a ชื่อ | หมายเลขและบรรทัดคำสั่งทั้งหมด | แยก xxsleep-a1 สองตัวที่ชื่อเหมือนกันด้วยอาร์กิวเมนต์ท้าย 300 และ 310 | |
| pgrep -x ชื่อ | เฉพาะหมายเลขของโปรเซสที่ชื่อตรงกันทุกตัวอักษร | xxsleep-a1 ได้สองบรรทัดคือ 2141 และ 2142 | |
| pidof ชื่อ | หมายเลขที่ทำงานด้วยชื่อนั้นในบรรทัดเดียว | xxsleep-a1 ได้ 2142 2141 | |
| ps -o pid,comm -C ชื่อ | หมายเลขและชื่อของโปรเซสที่ชื่อตรงกันทุกตัวอักษร ระบุหลายชื่อคั่นด้วยจุลภาค | xxsleep-a1 สองบรรทัดและ xxsleep-a2 หนึ่งบรรทัด | |
| cat /proc/PID/comm | ชื่อโปรเซส (ไม่เกิน 15 ตัวอักษรแรก) | 2155 คือ xxsleep-longnam | |
| killall ชื่อ | SIGTERM ไปยังโปรเซสที่มีชื่อนั้น | xxsleep-a1 สองตัวหยุดและได้รหัสออก 0 ส่วนชื่อที่ไม่มีอยู่ xxsleep-zz ได้ no process found และรหัสออก 1 | |
| killall -e ชื่อ | ชื่อที่ยาวเกิน 15 ตัวอักษรเฉพาะเมื่อชื่อเต็มตรงกัน | xxsleep-longnam ได้ no process found ส่วน xxsleep-longname-x1 หยุด | |
| killall -v ชื่อ | แสดงผลสำหรับทุกโปรเซสที่ส่งสัญญาณไป | Killed xxsleep-a2(2150) with signal 15 | |
| killall -i ชื่อ | ถามยืนยันทีละโปรเซสก่อนหยุด | เมื่อใส่ y และ n มีเพียง xxsleep-a1 ตัวแรกที่หยุด | |
| killall -u ชื่อบัญชี | เฉพาะโปรเซสที่บัญชีนั้นเป็นเจ้าของ | เมื่อระบุพร้อมชื่อ มีเพียง xxsleep-a1 ของบัญชีนั้นที่หยุด | |
| killall -9 ชื่อ | SIGKILL แทน SIGTERM | Killed xxsleep-a2(2173) with signal 9 |
📎 ตัวเลือกอื่น: ตามคู่มือทางการ
| ตัวเลือก | หน้าที่ | |
|---|---|---|
| -I, --ignore-case | เปรียบเทียบชื่อโดยไม่แยกตัวพิมพ์ใหญ่และพิมพ์เล็ก | |
| -g, --process-group | ส่งสัญญาณไปยังกลุ่มโปรเซสแทนตัวโปรเซส (กลุ่มละหนึ่งครั้ง) | |
| -l, --list | รายชื่อสัญญาณที่รู้จัก | |
| -n, --ns PID | เฉพาะโปรเซสใน PID namespace เดียวกับ PID นั้น ค่าเริ่มต้นคือทุก namespace | |
| -o, --older-than เวลา | เฉพาะโปรเซสที่เริ่มก่อนเวลานั้น (หน่วย s, m, h, d, w, M, y) | |
| -q, --quiet | ไม่แจ้งแม้ไม่มีโปรเซสใดถูกหยุด | |
| -r, --regexp | อ่านชื่อเป็นนิพจน์ปกติแบบขยาย | |
| -s, --signal สัญญาณ | สัญญาณที่จะส่งแทน SIGTERM | |
| -V, --version | แสดงข้อมูลเวอร์ชัน | |
| -w, --wait | รอจนกว่าโปรเซสที่ได้รับสัญญาณจะหายไปทั้งหมด | |
| -y, --younger-than เวลา | เฉพาะโปรเซสที่เริ่มหลังเวลานั้น | |
| -Z, --context รูปแบบ | เฉพาะโปรเซสที่บริบทความปลอดภัยตรงกับรูปแบบนิพจน์ปกติแบบขยาย เขียนไว้ก่อนอาร์กิวเมนต์อื่น และละชื่อได้ |
🔲 ตัวจำลองคำสั่ง killall
ตัวจำลองด้านล่างเริ่มต้นด้วยรายการโปรเซส xxsleep สี่ตัวและ xxsleep-a2 ของบัญชีตัวอย่าง user1 แตะชิปเพื่อเปรียบเทียบว่าบรรทัดใดหายไปจากรายการเมื่อใช้ [killall -v], [-i] และ [-u] ข้อความเอาต์พุตของ killall เลียนแบบเอาต์พุตที่ได้จากการรันบนเซิร์ฟเวอร์ Debian 12
4️⃣ สัญญาณของ killall
สัญญาณที่จะส่งระบุได้ด้วยชื่อ เช่น [-HUP] หรือ [-SIGHUP] ด้วยหมายเลข เช่น [-1] หรือหลังตัวเลือก -s (ตามคู่มืออย่างเป็นทางการ) [killall -9 ชื่อโปรเซส] จะส่งสัญญาณหมายเลข 9 คือ SIGKILL ซึ่งเป็นสัญญาณที่โปรเซสดักจับหรือเพิกเฉยไม่ได้ (ตามคู่มืออย่างเป็นทางการ) โปรเซสจึงหยุดโดยไม่ได้เก็บกวาดงาน ด้วยเหตุนี้จึงใช้ส่งเมื่อสัญญาณเริ่มต้น SIGTERM หยุดโปรเซสไม่ได้
บนเซิร์ฟเวอร์ Debian 12 เมื่อเพิ่ม -9 พร้อม -v ให้ xxsleep-a2 ที่เปิดใหม่ จะมีบรรทัดที่แสดงหมายเลขสัญญาณ 9
killall -9 -v xxsleep-a2Killed xxsleep-a2(2173) with signal 9เราตรวจสอบชื่อและหมายเลขสัญญาณด้วย [kill -l] ซึ่ง killall เองก็มีตัวเลือก -l ที่แสดงชื่อสัญญาณที่รู้จัก
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เมื่อใส่หมายเลขเดียว จะแสดงเฉพาะชื่อของสัญญาณนั้น 15 ที่ killall ส่งเป็นค่าเริ่มต้นคือ TERM และ 9 ที่ส่งด้วย -9 คือ KILL
kill -l 15TERMkill -l 9KILLถ้าระบุชื่อสัญญาณที่ไม่มีในรายการ จะมีข้อความรูปแบบ [FOO: unknown signal; killall -l lists signals.] (ตามคู่มืออย่างเป็นทางการและข้อความของโปรแกรม)
🔢 FAQ & เนื้อหาแนะนำ
ตรวจสอบแบบเรียลไทม์
คำสั่ง top ของ Linux (ตรวจการใช้ CPU และหน่วยความจำ)
คำสั่งที่แสดงแบบเรียลไทม์ว่าแต่ละโปรเซสใช้ CPU และหน่วยความจำเท่าใด
การควบคุมงาน
เบื้องหลัง (Back Ground) และเบื้องหน้า (Fore Ground) ใน Linux: การควบคุมโปรเซส
วิธีควบคุมงานโดยส่งคำสั่งไปทำงานเบื้องหลังแล้วเรียกกลับมาเบื้องหน้า
ไฟล์ที่เปิดอยู่
[Linux] คำสั่ง lsof: แสดงข้อมูลไฟล์ที่กำลังใช้งาน
คำสั่งที่แสดงไฟล์และซ็อกเก็ตที่โปรเซสเปิดอยู่พร้อม PID
ℹ️ ประกาศเรื่องลิงก์แอฟฟิลิเอต
เนื้อหาของเว็บไซต์นี้มีลิงก์แอฟฟิลิเอต หากผู้เข้าชมซื้อสินค้าหรือบริการผ่านลิงก์เหล่านี้ เว็บไซต์นี้จะได้รับค่าคอมมิชชันจากผู้ขาย ในกระบวนการนี้ ราคาที่ผู้ซื้อจ่าย(ราคาจะลดลงเมื่อมีโปรโมชัน↓)จะไม่สูงขึ้นแต่อย่างใด ราคา ส่วนลด และข้อมูลสต็อกที่แสดงเป็นข้อมูล ณ เวลาที่เขียนและอาจต่างจากความเป็นจริง โปรดตรวจสอบกับผู้ขายอีกครั้งก่อนซื้อ การเลือกและการประเมินสินค้าเขียนตามเกณฑ์ของเราเอง และการได้รับค่าคอมมิชชันหรือไม่ไม่มีผลต่อลำดับการแนะนำหรือเนื้อหาการประเมิน