ฉันจะฆ่ากระบวนการทั้งหมดของผู้ใช้โดยใช้ UID ของพวกเขาได้อย่างไร


41

ฉันต้องการที่จะฆ่ากระบวนการที่กำลังทำงานทั้งหมดของผู้ใช้เฉพาะจากทั้งเชลล์สคริปต์หรือโค้ดเนทีฟบนระบบ Linux

ฉันต้องอ่านไดเร็กทอรี / proc แล้วมองหาสิ่งเหล่านี้หรือไม่?

ความคิดใด ๆ มีการแม็พแบบไดนามิกของ pids ภายใต้ UID ใน Linux หรือไม่? นี่ไม่ใช่ใน proc หรือ

ถ้าไม่เช่นนั้นรายการนี้จะอยู่ที่ไหน? ฉันควรอ่านจากมันไหม? นอกจากนี้รายการแบบคงที่ของ UID ทั้งหมดในระบบเพื่อให้ฉันสามารถตรวจสอบผู้ใช้นี้อยู่แล้วดำเนินการเพื่อฆ่ากระบวนการทั้งหมดที่ทำงานภายใต้มัน


6
คุณต้องการเครื่องมือในการทำเช่นนี้ (pkill, slay, others) หรือคุณต้องการเขียนด้วยตัวเอง? หากก่อนหน้านี้ไซต์แลกเปลี่ยน superuser สแต็กน่าจะดีกว่า หากหลังการสแกน / proc และทำบันทึกสำหรับกระบวนการทั้งหมดโดยผู้ใช้ที่เฉพาะเจาะจงเป็นวิธีที่จะไป ตัวอย่างซอร์สโค้ดสำหรับยูทิลิตี้ pkill จะแสดงวิธีการทำเช่นนั้น

คุณช่วยอธิบายได้ไหมว่าคำถามนี้เกี่ยวกับอะไรในแง่ของความคิดเห็นของ @ LarsWirzenius ขอบคุณ!
Caleb

@Caleb: ฉันต้องการที่จะฆ่ากระบวนการโดยการอ่าน / proc ที่ฉันไม่ทราบว่าเครื่องมือใด ๆ ที่ทำมัน ตอนนี้ฉันก็พบว่านอกจาก "kill", "pkill", "skill" และอื่น ๆ ไม่สามารถใช้ได้ในระบบของฉัน ในกรณีนี้ฉันเดาว่าฉันต้องดูทางเลือกเชลล์สคริปต์เพื่ออ่าน / proc และหาวิธีรับกระบวนการภายใต้ผู้ใช้รายหนึ่ง ความคิดใด ๆ
user489152

1
เกี่ยวกับ "รายการคงที่ของ UID ทั้งหมด ... เพื่อให้ฉันสามารถตรวจสอบผู้ใช้นี้มีอยู่": ไม่มีสิ่งเช่นการตรวจสอบ ID ผู้ใช้ ชื่อผู้ใช้มาจากฐานข้อมูล แต่ ID ผู้ใช้เป็นสิ่งที่กระบวนการเรียกใช้setuid()เลือก
Gilles 'หยุดความชั่วร้าย'

คำตอบ:


52

ใช้pkill -U UIDหรือpkill -u UIDชื่อผู้ใช้แทน UID บางครั้งอาจจะทำงานเป็นเครื่องมืออีกอย่างก็คือskill -u USERNAMEkillall -u USERNAME

ความสามารถเป็นลินุกซ์ที่เฉพาะเจาะจงและตอนนี้ล้าสมัยและpkillเป็นแบบพกพามากขึ้น (Linux, Solaris, BSD)

pkill อนุญาตให้ใช้ทั้ง UID ที่เป็นตัวเลขและเป็นสัญลักษณ์http://man7.org/linux/man-pages/man1/pkill.1.html ที่มีประสิทธิภาพและแท้จริง

pkill - ... กระบวนการสัญญาณขึ้นอยู่กับชื่อและคุณลักษณะอื่น ๆ

    -u, --euid euid,...
         Only match processes whose effective user ID is listed.
         Either the numerical or symbolical value may be used.
    -U, --uid uid,...
         Only match processes whose real user ID is listed.  Either the
         numerical or symbolical value may be used.

Man page of skill กล่าวว่าอนุญาตให้ใช้ชื่อผู้ใช้ไม่ใช่รหัสผู้ใช้: http://man7.org/linux/man-pages/man1/skill.1.html

ทักษะ, snice ... เครื่องมือเหล่านี้ล้าสมัยและไม่สามารถพกพาได้ ไวยากรณ์คำสั่งถูกกำหนดอย่างไม่ดี พิจารณาใช้ killall, pkill

  -u, --user user
         The next expression is a username.

killall ไม่ได้ทำเครื่องหมายว่าล้าสมัยใน Linux แต่จะไม่ทำงานกับ UID ที่เป็นตัวเลข ชื่อผู้ใช้เท่านั้น: http://man7.org/linux/man-pages/man1/killall.1.html

killall - ฆ่ากระบวนการตามชื่อ

   -u, --user
         Kill only processes the specified user owns.  Command names
         are optional.

ฉันคิดว่ายูทิลิตี้ใด ๆ ที่ใช้ในการค้นหากระบวนการใน Linux / Solaris style / proc (procfs) จะใช้รายการทั้งหมดของกระบวนการ (ทำ readdir บางส่วนของ/proc) ฉันคิดว่าพวกเขาจะทำซ้ำมากกว่า/procโฟลเดอร์ย่อยดิจิทัลและตรวจสอบทุกกระบวนการที่ตรงกัน

หากต้องการรับรายชื่อผู้ใช้ให้ใช้getpwent(จะได้รับหนึ่งผู้ใช้ต่อการโทรหนึ่งครั้ง)

ทักษะ (procps & procps-ng) และkillall (psmisc) เครื่องมือทั้งสองใช้การgetpwnamเรียกไลบรารี่เพื่อแยกอาร์กิวเมนต์ของ-uตัวเลือกและจะมีการแยกชื่อผู้ใช้เท่านั้น pkill(procps & procps-ng) ใช้ทั้ง atol และ getpwnamในการแยกวิเคราะห์-u/ -Uโต้แย้งและอนุญาตให้ใช้ตัวระบุผู้ใช้ทั้งแบบตัวเลขและแบบข้อความ


1
pkill ไม่ล้าสมัย มันอาจจะไม่สามารถทำการแปลได้นอก Linux แต่คำถามนั้นเกี่ยวกับ Linux โดยเฉพาะ

1
เพื่อรับรายการผู้ใช้ใช้หนึ่งซับ: getent passwd | awk -F: '{print $ 1}'
Petesh

สิ่งที่เกี่ยวกับฉันให้คำสั่งเช่น: "kill -ju UID" จากการเรียกระบบ C ()

1
มันเป็นลินุกซ์ฝังตัว? คุณไม่มีทักษะ, pkill และ killall? แม้แต่ busybox ที่ฝังตัวเชลล์มี pkill และ killall
osgx

2
killall -u USERNAMEทำงานอย่างมีเสน่ห์
michalzuber

8

หากคุณส่ง -1 เป็นอาร์กิวเมนต์ ID กระบวนการไปยังkillคำสั่ง shellหรือkillฟังก์ชัน Cสัญญาณจะถูกส่งไปยังกระบวนการทั้งหมดที่สามารถเข้าถึงได้ซึ่งในทางปฏิบัติหมายถึงกระบวนการทั้งหมดของผู้ใช้ที่รันkillคำสั่งหรือ syscall

su -c 'kill -TERM -1' bob

ใน C (ละเว้นการตรวจสอบข้อผิดพลาด):

if (fork() == 0) {
    setuid(uid);
    signal(SIGTERM, SIG_DFL);
    kill(-1, SIGTERM);
}

5

หากฟังก์ชัน pkill ไม่สามารถใช้งานได้ในการกระจาย UNIX / Linux ของคุณคุณสามารถเรียกใช้คำสั่งต่อไปนี้ในฐานะผู้ใช้รูท:

ps -ef | grep username | grep -v grep | awk '{print $2}' | xargs kill

โดยที่ชื่อผู้ใช้คือผู้ใช้ที่คุณต้องการลบ


pkill -U usernameหรือเพียงแค่
osgx


0

สิ่งนี้ได้ผลดีสำหรับฉัน คุณสามารถค้นหา pid ทั้งหมดของกระบวนการด้วยชื่อผู้ใช้โดยการทำps U <username>และไปจากที่นั่น ลองสิ่งนี้:

ps U <username> | cut -d " " -f 1 | xargs kill
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.