ความแตกต่างระหว่าง 'killall' และ 'pkill' คืออะไร


92

หลังจากที่ใช้ธรรมดาเพียงkill <some_pid>บนระบบปฏิบัติการยูนิกซ์เป็นเวลาหลายปีที่ผ่านมาผมได้เรียนรู้pkillจากน้องลินุกซ์เข้าใจเพื่อนร่วมงานเพื่อนร่วมงาน1

ในไม่ช้าฉันก็ยอมรับวิธี Linux การทำpgrepและpkillผ่านหลายวันตลอดคืนตามเงื่อนไขการชะลอตัวและการแข่งขัน ทั้งหมดนี้เป็นเรื่องดีและดี

แต่ตอนนี้ฉันไม่เห็นอะไรkillallเลย ดูเหมือนวิธีการพูดถึงเท่านั้นkillallและฉันไม่แน่ใจว่านี่คือการพัฒนาแบบขนานบางอย่างหรือหากkillallผู้สืบทอดpkillหรืออย่างอื่น

ดูเหมือนว่าจะทำงานเป็นเป้าหมายมากกว่าpkillแต่ฉันแน่ใจว่าฉันทำอะไรบางอย่างหายไป

คนที่ใช้ Ubuntu / Debian-savvy 2 สามารถอธิบายได้ว่าkillallควรใช้เมื่อไร (หรือเพราะเหตุใด) โดยเฉพาะอย่างยิ่งถ้ามันควรจะใช้ในการตั้งค่าpkill(เมื่อpkillมักจะดูง่ายกว่าเพราะฉันสามารถเป็นคนจับคู่กับชื่อ

เมื่อพูดถึงkillallฉันไม่ได้คิดถึงคำสั่งที่ว่าในบางระบบ Unix (Solaris, AIX,?) จะฆ่ากระบวนการผู้ใช้ทั้งหมด นี่คือคำอธิบายของเวอร์ชันนั้นจากmanpage สำหรับ AIX ของ IBM :

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

1 'เพื่อนร่วมงาน' ได้รับการอัปเกรดฟรีจาก 'เพื่อนร่วมงาน' ดังนั้นอาจทำได้เช่นกัน
2ตอนแรกฉันคิดว่านี่เป็น Linux หรือ Debian แต่บางแหล่งกล่าวว่า Linux killallนั้นมาจาก Unix ที่มี BSD ปรุงแต่ง

คำตอบ:


68

ฉันคิดว่าคุณเห็น killall ในวิธีการเพราะโดยค่าเริ่มต้นมันต้องมีชื่อกระบวนการที่แม่นยำในขณะที่ pkill ทำรูปแบบการจับคู่ขั้นพื้นฐาน ดังนั้น killall จึงปลอดภัยกว่าสำหรับผู้ใช้ในการคัดลอกและวางสุ่มสี่สุ่มห้า

Pkill และ killall ทั้งสองมีตัวเลือกที่แตกต่าง Killall มีการตั้งค่าสถานะเพื่อจับคู่ตามอายุของกระบวนการ pkill มีค่าสถานะเพื่อฆ่ากระบวนการใน tty ที่กำหนดเท่านั้น อาการคลื่นไส้เป็นต้น ไม่ดีกว่าพวกเขามีความเชี่ยวชาญที่แตกต่างกัน

ฉันเห็นจากหน้าเพจของพวกเขาที่ killall นั้นมาจากแพ็คเกจ psmiscซึ่งมีกระบวนการจัดการยูทิลิตี้หลายpsอย่าง เป็นแพ็คเกจ procpsที่มี ps, top, kill, และ pkill (รวมถึงอื่น ๆ ) ฉันจะเดิมพัน procps ไม่ได้มี pkill ดังนั้น psmisc คันและมากับ killall

หน้าคน pkill / pgrepกล่าวว่าพวกเขาเป็นที่รู้จักใน Solaris 7. ในขณะที่คุณพูดถึงjgbelacqua , killall Solaris เป็นไม่ psmisc ยูทิลิตี้ให้จึง Solaris อาจจะมีเพียงแพคเกจ procps มีคนต้องการเครื่องมือจับคู่รูปแบบดังนั้น pkill และ pgrep ไม่ว่าจะพัฒนาโดยผู้พัฒนา dev หรือเพิ่มในภายหลังฉันไม่รู้ มันทำให้มันกลายเป็นส่วนหนึ่งของ * ทุกที่

แหล่งข้อมูลเพิ่มเติม:


1
อืม - มีkillallระบบ Solaris แบบเปิด (เก่าหรือไม่) แต่มันทำงานต่างออกไป มันฆ่าทุกอย่าง
belacqua

6
@ manish - er มี killall ที่แตกต่างกันในระบบ SysV
belacqua

1
@djeikyb ความคิดเกี่ยวกับ killall นั้นฟังดูปลอดภัยกว่าหรืออย่างน้อยก็สามารถอธิบายความนิยมได้มากมาย
belacqua

5
@ สเปน: pkill (ไม่ฆ่า) ไม่จำเป็นต้องมีหมายเลข pid หรือชื่อกระบวนการ มันไม่ตรงกับชื่อกระบวนการ
Javier Rivera

3
killall is safer for users to blindly copy and pasteยกเว้นว่าคุณอยู่ในเครื่องที่ killall ฆ่าได้จริงทั้งหมด โชคไม่ดีที่ทั้งสองระบบสาธารณูปโภคต่างกันมีชื่อเหมือนกัน
โกหก Ryan

7

โปรดระวังด้วย "killall" ในบางระบบ (ฉันลืมที่), killall ฆ่ากระบวนการทั้งหมด มันจะไม่สนใจข้อโต้แย้งและทำให้ระบบของคุณหยุดชะงักโดยสมบูรณ์


5
นี่ไม่เป็นความจริง. killall ที่ไม่มีอาร์กิวเมนต์จะไม่ทำอะไรเลยและ killall จะไม่เพิกเฉยต่อข้อโต้แย้ง kill -9 -1อาจฆ่าระบบของคุณและkillall -9 -1อาจเช่นกัน แต่ไม่ใช่เพียงkillall [program]
Thomas Ward

6
เป็นจริงในระบบ SysV ดังที่ได้กล่าวไว้ในคำถามเดิม
alanc

3

หากคุณเปิดใช้งาน / etc / bash_completion, หลังจากkillall <part_of_process_name>และแท็บกด - อัตโนมัติจะเสร็จสมบูรณ์ชื่อกระบวนการจากรายการของกระบวนการทำงาน


2
การเติมข้อความอัตโนมัติแบบเดียวกันจะทำด้วย pgrep / pkill สิ่งที่ฉันมักทำคือpkill plug<tab>การฆ่าปลั๊กอินแฟลชสำหรับ firefox เมื่อฉันรู้ว่าฉันไม่มีอะไรที่ฉันต้องการใช้ในขณะที่ยังคงต้องการใช้ Firefox อย่างแข็งขัน นี่เป็นหน้าที่ของเชลล์ไม่ใช่ความแตกต่างระหว่าง killall และ pgrep / pkill
Arcege

1
ฉันไม่ได้บอกว่าเป็นความแตกต่าง - เป็นคุณสมบัติที่ดีที่จะหลีกเลี่ยงการค้นหา PID ชื่อกระบวนการและอื่น ๆ
jet

2

หากคุณดูตัวเลือกของทั้งสองโปรแกรมคุณจะเห็นว่าทั้งคู่ทำในสิ่งเดียวกัน แต่ต่างกัน

pkill จะทำการจับคู่กับคุณสมบัติต่าง ๆ ของกระบวนการ (CMD, PID, PPID, UID ... ) และจะส่งสัญญาณที่กำหนดไปยังแต่ละกระบวนการที่ตรงกับ (สำหรับ CMD จะใช้การแสดงออกปกติสำหรับคนอื่น ๆ มันเป็นสตริง) pkill ไม่ได้เป็นแบบโต้ตอบ แต่ดีกว่าสำหรับโปรแกรมแบทช์

killall จะทำการจับคู่กับชื่อกระบวนการ (comm) หรือผู้ใช้ (ผู้ใช้) ไม่ใช่ในสตริงคำสั่งทั้งหมด อาร์กิวเมนต์ถูกใช้เป็นสตริงอย่างง่ายและต้องตรงกับค่า 'comm' ทั้งหมด (นอกจากนี้ยังมีตัวเลือก --regexp เพื่อเปลี่ยนค่านี้) killall มีตัวเลือก - แบบโต้ตอบและ - อายุน้อยกว่าซึ่ง pkill ไม่มี

นอกจากนี้ยังมี killall5 จาก SysV days และถูกส่งไปยัง UNIX รุ่นอื่น ๆ พฤติกรรมนี้แตกต่างกันไปในลักษณะแฟชั่นแบบเก่า สิ่งนี้มักถูกใช้ภายในกับสคริปต์ init เพื่อปิดหรือเปลี่ยนเป็นโหมดผู้ใช้คนเดียว


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