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


49

ฉันรู้ว่ามีกฎการกรองมากกว่าpkill killallคำถามของฉันคืออะไรความแตกต่างระหว่าง:

pkill [signal] name

และ

killall [signal] name

ฉันอ่านแล้วว่าkillallมีประสิทธิภาพมากกว่าและฆ่ากระบวนการและกระบวนการย่อยทั้งหมด (และเรียกซ้ำ) ที่ตรงกับnameโปรแกรม pkillไม่ทำเช่นนี้ด้วย?


คำตอบ:


46

pgrepและpkillสาธารณูปโภคถูกแนะนำในดวงอาทิตย์ Solaris 7 และเป็นg33klord ตั้งข้อสังเกตที่พวกเขาใช้รูปแบบเป็นอาร์กิวเมนต์ที่ถูกจับคู่กับชื่อของกระบวนการการทำงานของ ในขณะที่pgrepพิมพ์รายการกระบวนการที่ตรงกันเพียง แต่pkillจะส่งสัญญาณที่ระบุ (หรือSIGTERMโดยค่าเริ่มต้น) ไปยังกระบวนการ ตัวเลือกทั่วไปและซีแมนทิกส์ระหว่างpgrepและpkillมีประโยชน์เมื่อคุณต้องการระวังและตรวจสอบกระบวนการจับคู่รายการด้วยpgrepก่อนแล้วจึงดำเนินการฆ่าpkillต่อ pgrepและpkillให้บริการโดยที่procpsแพคเกจซึ่งนอกจากนี้ยังมีอื่น ๆ/procระบบสาธารณูปโภคไฟล์เช่นps, top, free, uptimeหมู่คนอื่น ๆ

killallคำสั่งที่ให้บริการโดยpsmiscแพคเกจและแตกต่างจากpkillที่ตามค่าเริ่มต้นตรงกับชื่อโต้แย้งว่า (ไม่เกิน 15 ตัวอักษรแรก) เมื่อพิจารณากระบวนการสัญญาณจะถูกส่งไป -e, --exactตัวเลือกที่สามารถระบุยังจำเป็นต้องมีการแข่งขันที่แน่นอนสำหรับชื่อที่ยาวเกิน 15 ตัวอักษร นี้จะทำให้ค่อนข้างปลอดภัยในการใช้เมื่อเทียบกับkillall pkillหากอาร์กิวเมนต์ที่ระบุมี/อักขระสแลช ( ) อาร์กิวเมนต์จะถูกตีความเป็นชื่อไฟล์และกระบวนการที่เรียกใช้ไฟล์นั้นจะถูกเลือกเป็นผู้รับสัญญาณ killallนอกจากนี้ยังสนับสนุนการจับคู่แสดงออกปกติของชื่อกระบวนการผ่าน-r, --regexpตัวเลือก

มีความแตกต่างอื่น ๆ เช่นกัน killallคำสั่งเช่นมีตัวเลือกสำหรับกระบวนการจับคู่ตามอายุ ( -o, --older-thanและ-y, --younger-than) ในขณะที่pkillสามารถบอกว่าจะฆ่าเพียงกระบวนการในขั้วที่เฉพาะเจาะจง (ผ่าน-tตัวเลือก) เห็นได้ชัดว่าทั้งสองคำสั่งมีเฉพาะ niches

โปรดทราบว่าkillallคำสั่งเกี่ยวกับการสืบทอดระบบจากUnix System V (โดยเฉพาะอย่างยิ่งSolaris ของ Sun , AIX ของ IBMและHP-UX ของ HP ) ฆ่ากระบวนการทั้งหมดที่ถูกสังหารได้โดยผู้ใช้รายใดโดยเฉพาะการปิดระบบได้อย่างมีประสิทธิภาพหากรันโดย root

ยูทิลิตี้ psmisc Linux ได้รับการพอร์ตไปยังBSD (และในส่วนขยายMac OS X ) ดังนั้นจึงkillallมีความหมายตาม "ความหมายกระบวนการฆ่าตามชื่อ"


ความแตกต่างหลักที่ฉันพบคือการหยุดคำสั่งของรูปแบบโดยผู้ใช้คือkillall -u <username> -r <process>หรือpkill <process> -U <uid>ทำให้killallฉันใช้ง่ายขึ้นมาก
jeremysprofile

13

pkillpgrepเป็นหนึ่งที่มีมูลค่าการเรียนการสอนรุ่นอนาคตทั้งสองเพราะตัวกรองที่คุณพูดถึงและความจริงที่ว่ามันจับคู่กับนำมาใช้ใหม่อย่างมาก พวกมันฆ่ากระบวนการในลักษณะเดียวกันและไม่ฆ่าแบบวนซ้ำ - แม้ว่าpgrepคุณจะสามารถเลือกตามเซสชั่น (ต่อ tty, คิดเซท) หรือกลุ่มกระบวนการ (คิดว่าการควบคุมงาน)


8

หนึ่งความแตกต่างคือkillallใช้ชื่อกระบวนการที่แน่นอนเป็นอาร์กิวเมนต์ในขณะที่pkillสามารถใช้ชื่อบางส่วนหรือทั้งหมด

คุณสามารถอ้างอิงคำถามนี้เพื่อทราบข้อมูลเชิงลึกเกี่ยวกับ pkill


1

killall- ฆ่ากระบวนการตามชื่อ ใช้killallคำสั่งเพื่อส่งสัญญาณไปยังหนึ่งกระบวนการขึ้นไปที่ตรงกับเกณฑ์การเลือกเช่นชื่อคำสั่งกระบวนการที่เป็นของผู้ใช้เฉพาะหรือกระบวนการทั่วทั้งระบบ

pkill- จะส่งสัญญาณที่ระบุ (โดยค่าเริ่มต้น SIGTERM) ไปยังแต่ละกระบวนการแทนการแสดงไว้ใน stdout pkillสามารถส่งสัญญาณกระบวนการหลายอย่างเช่นkillallแต่ยังสามารถใช้เกณฑ์การเลือกขั้นสูงที่สามารถรวมกันของ:

คำสั่งเทอร์มินัลหลัก UID

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