คำสั่ง top -c ใน linux เพื่อกรองรายการที่แสดงตาม processname


149
top -c

แสดงรายการกระบวนการทั้งหมดมีตัวเลือกที่ดีในการกรองกระบวนการด้วยชื่อผู้ใช้โดยใช้ตัวเลือก -u แต่ฉันสงสัยว่าถ้ามีวิธีง่าย ๆ ในการกรองกระบวนการตามชื่อกระบวนการที่ระบุไว้ภายใต้คอลัมน์คำสั่งของผลลัพธ์สูงสุด

ตัวอย่างเช่นฉันต้องการตัวเลือกด้านบน - บางส่วน - สตริงของ processname และด้านบนแสดง pids ที่มีสตริงย่อยนี้ในชื่อคำสั่งเท่านั้น

คำตอบ:


214

การใช้ pgrep เพื่อรับ pid ของบรรทัดคำสั่งที่ตรงกัน:

top -c -p $(pgrep -d',' -f string_to_match_in_cmd_line)

ด้านบน-pคาดว่ารายการ pids ที่คั่นด้วยเครื่องหมายจุลภาคดังนั้นเราจึงใช้-d','ใน pgrep การ-fตั้งค่าสถานะใน pgrep ทำให้มันตรงกับบรรทัดคำสั่งแทนชื่อโปรแกรม


12
เพียงจำไว้ว่าหากกระบวนการใหม่เกิดขึ้นสำหรับ 'string_to_match_in_cmd_line' พวกเขาจะไม่ปรากฏขึ้นด้านบน; คุณจะต้องออกจากด้านบนและเรียกใช้คำสั่งนี้อีกครั้ง
eugenevd

1
ดังที่ eugenevd กล่าวว่าสิ่งนี้จะไม่ทำงานสำหรับกระบวนการใหม่ที่เริ่มต้นหลังจากที่เรียกว่าส่วนบน มีวิธีการทำเช่นนั้น? ฉันต้องการเรียกใช้หลายโปรแกรมที่มีคำนำหน้าเหมือนกันในชื่อของมันและฉันชอบที่จะเห็นว่ามีกี่โปรแกรมที่ทำงานในแบบสดๆโดยไม่จำเป็นต้องเรียกใช้งานท็อปใหม่ (หรือเพียงแค่ ps) ทุกครั้ง
ตลก

1
@ ตลก, eugenevd, ฉันมีปัญหาเช่นเดียวกับที่คุณทำ ฉันทำรุ่นใหม่ที่stackoverflow.com/a/27653841/681830หวังว่าจะช่วยได้
Val

5
ผมพบดังนั้นผมจึงใช้นี้top: pid limit (20) exceeded top -c -p $(pgrep -f string_to_match_in_cmd_line | head -20 | tr "\\n" "," | sed 's/,$//')
f01

115

มันสามารถทำได้แบบโต้ตอบ

หลังจากทำงานtop -cให้กดoและเขียนตัวกรองในคอลัมน์เช่นเพื่อแสดงแถวที่คอลัมน์ COMMAND มีสตริง foo เขียนCOMMAND=foo

หากคุณต้องการแค่เอาต์พุตพื้นฐานนี่อาจเพียงพอ:

top -bc |grep name_of_process

7
สิ่งนี้ทำให้ฉันมีตัวเลือกหรือไวยากรณ์ที่ไม่ถูกต้อง: -bc '
shmim

3
top -bc -n 1 สะดวกกว่าเนื่องจาก จำกัด จำนวนการทำซ้ำไว้ที่ 1
กาลา ธ

1
นี่ควรเป็นคำตอบที่ยอมรับได้ มันมีความแม่นยำมากขึ้นและใช้งานได้กับตัวเลือกที่มีให้โดยคำสั่ง 'top' และมันจะแสดงกระบวนการใหม่
อับราฮัม TS

top -c , hit o and write a filter on a columnกระบวนการเก็บในที่หายไปและจมจ่อมอยู่กับ
MrR

92

คุณสามารถเพิ่มตัวกรองtopในขณะที่มันกำลังทำงานอยู่เพียงแค่กดoปุ่มจากนั้นพิมพ์นิพจน์ตัวกรอง ยกตัวอย่างเช่นการตรวจสอบทุกกระบวนการ Java COMMAND=javaใช้นิพจน์ตัวกรอง คุณสามารถเพิ่มตัวกรองหลายตัวโดยกดปุ่มอีกครั้งคุณสามารถกรองโดยผู้ใช้ด้วยuปุ่มและคุณสามารถล้างตัวกรองทั้งหมดด้วย=ปุ่ม


2
นี่เป็นคำตอบที่ดีกว่าคำตอบที่ยอมรับได้ (คำตอบนี้วางไว้ช้ากว่าต้นฉบับ 3 ปี) วิธีนี้ใช้ได้ผลกับกระบวนการที่เพิ่งเกิดใหม่เช่นกัน สำคัญมากหากคุณกำลังตรวจสอบกระบวนการ Apache ที่สร้างขึ้นตามความต้องการ
Nate Lampton

2
แน่นอนทางออกที่ดีกว่าเพราะมันกรองอยู่ วิธีการแก้ปัญหาที่ยอมรับจะแก้ไขรหัสกระบวนการก่อนที่จะทำงานบน กระบวนการผลลัพธ์เป็นเหมือนtop -c -p 920,1345,1346ซึ่งได้รับการแก้ไข
Jérôme Gillard

4
การใช้oเป็นตัวกรองไม่มีอยู่ในบางรุ่น (เก่ากว่า) ของด้านบน: top: procps version 3.2.8มีตัวกรองผู้ใช้อยู่แล้วจึงใช้งานได้
Manwe

13

คำสั่งของ @ perreal ใช้งานได้ดี! หากคุณลืมลองในสองขั้นตอน ...

ตัวอย่าง: ตัวกรองด้านบนเพื่อแสดงเฉพาะแอปพลิเคชันที่เรียกว่า yakuake:

$ pgrep yakuake
1755

$ top -p 1755

คำสั่งแบบโต้ตอบที่มีประโยชน์สูงสุด 'c': สลับเส้นทางแบบเต็มกับชื่อคำสั่ง 'k': kill โดย PID 'F': กรองโดย ... เลือกด้วยลูกศร ... จากนั้นกด 's' เพื่อตั้งค่าการเรียงลำดับ

คำตอบด้านล่างก็ดีเช่นกัน ... ฉันกำลังค้นหาในวันนี้ แต่หาไม่เจอ ขอบคุณ


7

หลังจากมองหาคำตอบมากมายใน StackOverflow ฉันไม่เห็นคำตอบที่ตรงกับความต้องการของฉัน

นั่นคือการทำให้คำสั่งด้านบนเพื่อรักษาความสดชื่นด้วยคำหลักที่กำหนดและเราไม่จำเป็นต้อง CTRL + C / top อีกครั้งและอีกครั้งเมื่อกระบวนการใหม่วางไข่

ดังนั้นฉันจึงสร้างใหม่ ...

ต่อไปนี้เป็นเวอร์ชันที่ไม่ต้องรีสตาร์ท

__keyword=name_of_process; (while :; do __arg=$(pgrep -d',' -f $__keyword); if [ -z "$__arg" ]; then top -u 65536 -n 1; else top -c -n 1 -p $__arg; fi; sleep 1; done;)

แก้ไข __keyword และควรใช้งานได้ (Ubuntu 2.6.38 ทดสอบแล้ว)

2.14.2015 เพิ่ม: ส่วนปริมาณงานระบบจะหายไปด้วยรหัสข้างต้น สำหรับผู้ที่ใส่ใจเกี่ยวกับส่วน "ค่าเฉลี่ยการโหลด":

__keyword=name_of_process; (while :; do __arg=$(pgrep -d',' -f $__keyword); if [ -z "$__arg" ]; then top -u 65536 -n 1; else top -c -n 1 -p $__arg; fi; uptime; sleep 1; done;)

สิ่งนี้ขาดภาพรวมเกี่ยวกับปริมาณงานของระบบ เพิ่ม "เวลาทำงาน" ก่อนนอนสำหรับรายการกระบวนการที่สั้นนี่เป็น IMHO ที่เพียงพอ
Sevyls

1
@Sevyls ขอบคุณที่ชี้นำ! หลังจากความพยายามอื่น ๆ สองสามครั้ง (ซึ่งไม่ได้ผลดีเท่า) เวอร์ชันของคุณอาจเป็นเวอร์ชั่นที่ดีที่สุด แก้ไขคำตอบแล้ว
Val

ใช้งานได้ดีถ้าฉันมีหนึ่งกระบวนการขึ้นไปที่ใช้การจับคู่นั้น แต่ฉันได้รับ "top: ผู้ใช้ไม่ถูกต้อง" เมื่อหยุดทั้งหมด มันจะกู้คืนเมื่อกระบวนการอื่นเริ่มต้นขึ้น ฉันใช้ Raspbian FYI ขอบคุณ
Mike

1

แล้วเรื่องนี้ล่ะ

top -c -p <PID>

4
เรากำลังพยายามกรองโดย processname (หรือสตริงย่อยของมัน) และเมื่อคุณรีสตาร์ทกระบวนการของคุณคุณจะได้รับ pid ใหม่
Srujan Kumar Gulla

1

ฉันลงเอยด้วยการใช้เชลล์สคริปต์ด้วยรหัสต่อไปนี้:

#!/bin/bash

while [ 1 == 1 ]
do
    clear
    ps auxf |grep -ve "grep" |grep -E "MSG[^\ ]*" --color=auto
    sleep 5
done

1

คำตอบส่วนใหญ่ล้มเหลวที่นี่เมื่อรายการกระบวนการเกินกว่า 20 กระบวนการ นั่นคือการtop -pจำกัด ตัวเลือก สำหรับผู้ที่มีอันดับต้น ๆ ที่ไม่สนับสนุนการกรองด้วยoตัวเลือกต่อไปนี้เป็นตัวอย่างสคริปต์สำหรับรับแบบเต็มหน้าจอ / คอนโซล outuput (ข้อมูลสรุปหายไปจากผลลัพธ์นี้)

__keyword="YOUR_FILTER" ; ( FILL=""; for i in  $( seq 1 $(stty size|cut -f1 -d" ")); do FILL=$'\n'$FILL; done ;  while :; do HSIZE=$(( $(stty size|cut -f1 -d" ")  - 1 ));  (top -bcn1 | grep "$__keyword"; echo "$FILL" )|head -n$HSIZE; sleep 1;done )

คำอธิบายบางอย่าง

__keyword = your grep filter keyword
HSIZE=console height
FILL=new lines to fill the screen if list is shorter than console height
top -bcn1 = batch, full commandline, repeat once

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