ฆ่าแผนผังกระบวนการใน top / htop


12

ฮ็อปช่วยให้ฉันเห็นต้นไม้ของกระบวนการภายในเปลือก ฉันสามารถฆ่ากระบวนการด้วยการกดF9 (KILL)และจากนั้นเลือกสัญญาณ (เช่น15 SIGTERM) ฉันต้องการส่งงานไปฆ่า

อย่างไรก็ตามนี่ช่วยให้ฉันสามารถฆ่าหนึ่งกระบวนการในเวลาเดียว มีวิธีฆ่าต้นไม้เต็มของกระบวนการใช้htopหรือไม่

คำตอบ:


16

จากman htop:

คำสั่งแบบโต้ตอบ

Space Tag หรือ untag กระบวนการ คำสั่งที่สามารถทำงานกับหลาย ๆ กระบวนการเช่น "ฆ่า" จะใช้กับรายการของกระบวนการที่ติดแท็กแทนที่จะเป็นกระบวนการที่ถูกเน้นสีในปัจจุบัน

U Untag กระบวนการทั้งหมด (ลบแท็กทั้งหมดที่เพิ่มด้วยปุ่ม Space)

กระบวนการ F9, k "ฆ่า": ส่งสัญญาณซึ่งถูกเลือกในเมนูไปยังหนึ่งหรือกลุ่มของกระบวนการ หากกระบวนการถูกแท็กส่งสัญญาณไปยังกระบวนการที่ติดแท็กทั้งหมด หากไม่มีการแท็กให้ส่งไปยังกระบวนการที่เลือกในปัจจุบัน

ไม่ใช่คำตอบที่คุณมองหา แต่อยู่ใกล้ นอกจากนี้คุณยังสามารถกำจัดกลุ่มกระบวนการหรือลูกที่มีการฆ่าดู:

/programming/392022/best-way-to-kill-all-child-processes


1

จาก mantop htop:

F5, t มุมมองแบบต้นไม้: จัดระเบียบกระบวนการตามความเป็นพ่อแม่และจัดวางความสัมพันธ์ระหว่างพวกเขาเป็นแบบต้นไม้ การสลับคีย์จะสลับระหว่างแผนผังและมุมมองการเรียงลำดับที่คุณเลือกไว้ก่อนหน้านี้ การเลือกมุมมองการเรียงลำดับจะออกจากมุมมองแบบต้นไม้

ดังนั้นกด F5 และคุณอาจต้องกด 't' นั่นจะให้คุณฆ่าต้นไม้ทั้งหมด


1
สิ่งนี้จะใช้ได้ก็ต่อเมื่อ "ต้นไม้" ถูกผูกไว้กับแม่อย่างหลีกเลี่ยงไม่ได้ โปรดสังเกตว่า htop แสดงกลุ่มเธรดเป็นต้นไม้ (ในกรณีนี้กิ่งไม้ไม่ใช่กระบวนการจริง) มิฉะนั้นเด็กกำพร้าจะได้รับการอุปถัมภ์อีกครั้งโดยประทับจิตดังนั้นอย่าฆ่า
goldilocks

ฉันเห็นด้วยอย่างยิ่งแม้ว่าสิ่งนี้จะขึ้นอยู่กับกระบวนการที่เกี่ยวข้องอย่างเคร่งครัด การฆ่าเซสชันของ ssh tree จะเป็นการฆ่า procs ลูกที่อยู่ข้างใต้ตัวอย่างเช่น OP ไม่เจาะจงเป็นพิเศษเกี่ยวกับสาเหตุที่เขาต้องการฆ่าต้นไม้ทั้งต้น
เตฟาน

1

คุณสามารถจี้htop's sคำสั่ง ในhtopการกดจะเรียกsstrace -p <the-pid-of-the-selected-process>

จากนั้นสิ่งที่คุณสามารถทำได้คือสร้างstraceคำสั่งที่มีลักษณะดังนี้:

#! /bin/sh -
pids=$(ps -eo pid= -o ppid= |
  awk -v exclude="$PPID" -v pid="$2" '
    function descends(p) {
      if (p == exclude) return 0
      if (p == pid) return 1
      if (p <= 1) return 0
      return descends(parent[p])
    }
    { parent[$1]=$2 }
    END {
      for (p in parent)
        if (descends(p))
         print p
    }'
)
if [ -z "$pids" ]; then
  echo >&2 "No process found to kill"
else
  echo >&2 Killing $pids
  kill $pids
fi

และวางไว้ในไดเรกทอรีเช่น~/.htop-hijackและเรียก htop เป็น:

PATH=~/.htop-hijack:$PATH htop

จากนั้นการกดsจะเรียกใช้คำสั่งนั้นแทนstrace(คุณต้องกด Esc เพื่อกลับไปที่หน้าจอหลักหลังจากนั้น)


1

มีคุณลักษณะนี้มาเป็นเวลานาน แต่มันหายไปจากคู่มือจนถึงปี 2018: กดcปุ่มเพื่อเลือกกระบวนการที่ไฮไลต์อยู่ในขณะนี้รวมถึงลูก ๆ ทั้งหมดของมัน จากนั้นการดำเนินการที่ใช้กับกระบวนการที่เลือก (เช่นการฆ่าโดยใช้kคีย์) จะใช้กับกระบวนการและลูก ๆ

นี่ไม่ใช่อะตอม หากเด็กใหม่เกิดขึ้นระหว่างช่วงเวลาที่คุณกดcและช่วงเวลาที่เคอร์เนลฆ่ากระบวนการทั้งหมดพวกเขาจะไม่ถูกฆ่าและมีแนวโน้มที่จะถูกติดเข้ากับกระบวนการเริ่มต้นอีกครั้ง นี่เป็นเพราะ htop กำลังวนซ้ำกระบวนการที่เลือกและฆ่าทีละตัว

ฉันได้เสนอแพทช์เพื่อเพิ่มคุณสมบัติการฆ่ากลุ่มอะตอมเพื่อ htop ในขณะที่ผ่านมา แต่การใช้งานไม่ได้รับความยินยอมเพียงพอที่จะรวมเข้าด้วยกัน ด้วยมันเป็นไปได้ที่จะฆ่ากลุ่มกระบวนการทั้งหมดแบบอะตอมจาก htop มันไม่เหมือนกับการฆ่าต้นไม้ทั้งหมด แต่ AFAIK เคอร์เนลไม่มีวิธีการใด ๆ ในการฆ่าต้นไม้ตามอำเภอใจ

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