การกรองเอาต์พุตคำสั่งด้านบน


12

ฉันใช้ Mac และต้องการกรองผลลัพธ์ของtopคำสั่งสำหรับกระบวนการเฉพาะเช่นคอลัมน์ PID, COMMAND และ% CPU เท่านั้นที่จะแสดง

หลังจากรับ PID ของกระบวนการฉันเรียกใช้:

top -pid 1234

อย่างไรก็ตามจะแสดงมากกว่า 15 คอลัมน์สำหรับกระบวนการนั้น ฉันสามารถไพพ์เอาต์พุตของ 'คำสั่งใน awk และแสดงเฉพาะ:

PID COMMAND %CPU

คอลัมน์?

ฉันไม่ต้องการเก็บผลลัพธ์ในไฟล์ข้อความและประมวลผล ฉันสนใจที่จะตรวจสอบกระบวนการตามเวลาจริง

คำตอบ:


8
top -pid 3907 -stats "pid,command,cpu"
  • -pid 3907: ID กระบวนการของคุณ
  • -stats pid,command,cpu: แสดง ID กระบวนการชื่อและ CPU% เท่านั้น

ไม่จำเป็นต้องรันawkบนเอาต์พุต


หากคุณต้องการประมวลผลเอาต์พุตให้ใช้-l 0เพื่อรันในโหมดการบันทึก (0 หมายถึงไม่ จำกัด ทุกอย่างจะ จำกัด จำนวนตัวอย่าง) ผลลัพธ์จะมีลักษณะดังนี้ (การทำซ้ำสองครั้ง):

Processes: 72 total, 3 running, 1 stuck, 68 sleeping, 326 threads 
2011/05/10 19:15:13
Load Avg: 0.14, 0.14, 0.09 
CPU usage: 20.0% user, 26.66% sys, 53.33% idle 
SharedLibs: 5304K resident, 5208K data, 0B linkedit.
MemRegions: 16345 total, 1048M resident, 54M private, 338M shared.
PhysMem: 726M wired, 1802M active, 687M inactive, 3215M used, 750M free.
VM: 169G vsize, 1036M framework vsize, 5261732(0) pageins, 552476(0) pageouts.
Networks: packets: 46747406/52G in, 32528901/3715M out.
Disks: 9452898/244G read, 11226269/293G written.

PID   COMMAND      %CPU
3907  WindowServer 0.0 
Processes: 72 total, 3 running, 1 stuck, 68 sleeping, 326 threads 
2011/05/10 19:15:14
Load Avg: 0.13, 0.14, 0.09 
CPU usage: 0.95% user, 1.90% sys, 97.14% idle 
SharedLibs: 5304K resident, 5208K data, 0B linkedit.
MemRegions: 16346 total, 906M resident, 54M private, 386M shared.
PhysMem: 726M wired, 1802M active, 687M inactive, 3215M used, 751M free.
VM: 169G vsize, 1036M framework vsize, 5261732(0) pageins, 552476(0) pageouts.
Networks: packets: 46747406/52G in, 32528901/3715M out.
Disks: 9452898/244G read, 11226269/293G written.

PID   COMMAND      %CPU
3907  WindowServer 2.7 

ใช้awkหรือเครื่องมือที่คล้ายกันเพื่อแสดงเฉพาะทุกบรรทัดที่ 13 (เนื่องจากบรรทัดเหล่านี้มีค่าในตัวอย่างนั้น):

$ top -l 0 -pid 3907 -stats pid,command,cpu | awk 'NR%13==0'
3907  WindowServer 0.0 
3907  WindowServer 1.3 
3907  WindowServer 2.2 

# top -p1 -stats "pid,command,cpu" top: unknown option 't'
AstraSerg

@AstraSerg ใช้งานได้สำหรับฉัน โปรดทราบว่านี่เป็นคำถามของ Mac OS ซึ่งแตกต่างtopจาก Linux
Daniel Beck

6

สามารถทำได้อย่างแน่นอนและฉันจะอธิบายว่าฉันจะทำอย่างไร ฉันไม่ได้แกล้งทำเป็นว่านี่เป็นวิธีที่ดีที่สุด แต่ก็ใช้ได้ผล ฉันใช้ Linux (และ bash shell) ดังนั้นพฤติกรรมเริ่มต้นของด้านบนของฉันอาจแตกต่างกันเล็กน้อย ดังนั้นคุณอาจต้องปรับ mini-howto นี้สำหรับสถานการณ์เฉพาะของคุณ

  1. เพียงแค่วิ่งบนโดยไม่มีข้อโต้แย้งใด ๆ :

    $ top

    นี่คือส่วนหัวและบรรทัดที่เกี่ยวข้องจากผลลัพธ์ของฉัน:

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

    2569 user 20 0 339m 86m 10m S 7.8 6.9 6:42.99 java

    ฉันเลือกกระบวนการที่ยังคงอยู่ในหน่วยความจำระยะเวลาหนึ่งและใช้ CPU จริง ๆ ฉันจะใช้มันเป็นกระบวนการทดสอบเพื่อบรรลุเป้าหมายสุดท้าย

  2. โดยค่าเริ่มต้นด้านบนจะทำงานในโหมดโต้ตอบ ไม่เหมาะกับฉันฉันต้องการรวบรวมข้อมูลที่เกี่ยวข้องและพิมพ์ ฉันจะจัดการงานในการแสดงข้อมูลแบบโต้ตอบหลังจากนั้น คำพูดที่เกี่ยวข้องจาก manpage ด้านบน:

    -b: การทำงานของโหมดแบตช์เริ่มต้นที่ด้านบนใน 'โหมดแบทช์' ซึ่งอาจมีประโยชน์สำหรับการส่งเอาต์พุตจากด้านบนไปยังโปรแกรมอื่นหรือไปยังไฟล์ ในโหมดนี้ด้านบนจะไม่รับอินพุตและทำงานจนกว่าจะมีการทำซ้ำ จำกัด คุณได้ตั้งค่าด้วยตัวเลือกบรรทัดคำสั่ง '-n' หรือจนกว่าจะถูกฆ่า

    -n: จำนวนการวนซ้ำ จำกัด เป็น: -n number ระบุจำนวนการวนซ้ำสูงสุดหรือเฟรมส่วนบนควรสร้างก่อนสิ้นสุด

    นี่คือคำสั่งด้านบนที่ปรับแล้วซึ่งพิมพ์เอาต์พุตเพียงครั้งเดียวจากนั้นออก:

    $ top -b -n 1

  3. ฉันรู้ PID ที่ฉันต้องการดูดังนั้นฉันจะเพิ่มข้อ จำกัด อีกหนึ่งข้อไว้ด้านบนดังนั้นมันจะพิมพ์ข้อมูลเกี่ยวกับกระบวนการนั้นเท่านั้น:

    $ top -b -n 1 -p 2569

  4. แม้ในโหมดแบทช์ด้านบนยังคงพิมพ์ส่วนหัวที่มีสถิติทั่วทั้งระบบเช่น uptime, หน่วยความจำว่าง / การสลับ ฯลฯ ฉันไม่ต้องการสิ่งนี้ ทั้งหมดที่ฉันต้องการคือเพียงหนึ่งบรรทัด - บรรทัดที่มีข้อมูลเกี่ยวกับกระบวนการของฉันดังนั้นฉันจะตัดมันออกจากผลลัพธ์ทั้งหมดเช่นนี้

    $ top -b -n 1 -p 2569 | tail -n 2 | head -n 1

    อย่างที่คุณเห็นฉันได้บรรทัดที่สองจาก 1

  5. ฉันจะไปป์ไลน์นี้เพื่อ awk เพื่อแยกเฉพาะคอลัมน์ที่ฉันต้องการ:

    $ top -b -n 1 -p 2569 | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'

  6. จนถึงตอนนี้ฉันได้ทำกิจวัตรเหล่านี้ในบรรทัดคำสั่งตอนนี้มันเป็นเวลาที่จะเพิ่มการคงอยู่และความยืดหยุ่นให้กับเคสของเราโดยเฉพาะ ฉันกำลังย้ายทั้งบรรทัดไปเป็นสคริปต์เชลล์แบบง่าย ๆ ฉันจะเรียกมันว่า3topชื่อจะถูกเน้นเพราะจะถูกใช้ในภายหลัง:

    #!/bin/bash

    top -b -n 1 -p 2569 | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'

  7. หมายเลข PID คือฮาร์ดโค้ดต่อไปนี้เป็นวิธีทำให้สคริปต์ยอมรับว่าเป็นอาร์กิวเมนต์บรรทัดคำสั่ง:

    #!/bin/bash

    top -b -n 1 -p "$1" | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'

    ในการสร้างสถิติการแสดงผล 3top เกี่ยวกับ PID 2569 จะต้องมีการเรียกดังนี้:

    $ ./3top 2569

  8. ฉันต้องการเปอร์เซ็นต์ที่แสดงหลังจากโหลด CPU ดังนั้นฉันจึงปรับสคริปต์ 3top แบบนี้:

    #!/bin/bash

    out=$(top -b -n 1 -p "$1" | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}')

    echo "$out%"

    ฉันได้เปลี่ยนเส้นทางผลลัพธ์ทั้งหมดของ chain of command (เชื่อมต่อผ่านไพพ์) ไปยังตัวแปร จากนั้นฉันก็พิมพ์โดยใช้ echo และเพิ่ม '%' ที่ส่วนท้ายเนื่องจากโหลด CPU เป็นฟิลด์สุดท้าย

  9. ณ จุดนี้ฉันมีชุดสคริปต์ที่ยอมรับ PID เป็นอาร์กิวเมนต์และพิมพ์สถิติหนึ่งครั้ง ต้องการการตรวจสอบตามเวลาจริงแทนหรือไม่ ง่ายเพราะนาฬิกาสามารถทำได้! เรียกใช้สคริปต์เช่นนี้:

    $ watch -n 1 3top 2569

    มันจะทำการตรวจสอบเวลาจริงโดยการเรียกใช้ 3top หนึ่งครั้งต่อวินาที


11
ผู้ใช้ที่อยู่บน OS X และไม่มี topGnu ตัวเลือกที่ไม่ถูกต้องหรือไวยากรณ์: -b ไม่รู้เลยว่าทำไมมันถึงถูกยกระดับซ้ำ ๆ
Daniel Beck

5
Gnu top(ในprocps) ไม่สามารถติดตั้งโดยใช้ Homebrew, MacPorts หรือตำรวจและไม่สามารถรวบรวมจากแหล่งที่มาใช้อย่างใดอย่างหนึ่งหรือmake cc top.c
Daniel Beck

2

topรูปแบบการแสดงสามารถปรับแต่งได้ แต่ไม่มีทางที่จะระบุตัวเลือกการแสดงผลที่บรรทัดคำสั่ง อย่างไรก็ตามหากคุณมีความคิดสร้างสรรค์คุณสามารถทำสิ่งที่คุณต้องการโดยจัดการ~/.toprcไฟล์อย่างชาญฉลาด

สมมติว่าคุณยังไม่ได้ปรับแต่งการแสดงtop(และไม่มี~/.toprcไฟล์):

  1. topยิง
  2. กดfเพื่อเข้าสู่โหมดการเลือกฟิลด์
  3. สำหรับแต่ละฟิลด์ที่มี*ถัดจากฟิลด์ที่คุณไม่ต้องการให้กดตัวอักษรที่เกี่ยวข้องเพื่อยกเลิกการเลือกฟิลด์นั้น ตัวอย่างเช่นกดeเพื่อยกเลิกการเลือกUser Nameฟิลด์ เมื่อคุณทำคุณควรจะมีเพียง*ติดกับProcess Id, และCPU usageCommand name/line
  4. กดSpaceเพื่อกลับไปที่หน้าต่างหลัก
  5. กดW(เช่นShift+ w) เพื่อบันทึกเค้าโครงปัจจุบันลงใน~/.toprcไฟล์ของคุณ
  6. ออกจากtopนั้นเปิดอีกครั้งเพื่อตรวจสอบว่าการตั้งค่าของคุณถูกบันทึกแล้ว
  7. เมื่อคุณต้องการที่จะกลับไปยังรูปแบบเริ่มต้นเปลี่ยนชื่อ~/.toprcเพื่อสิ่งที่ต้องการก่อนที่จะเปิดตัว~/min.toprc topเมื่อคุณต้องการเปลี่ยนเป็นเค้าโครงที่น้อยที่สุดให้เปลี่ยน~/min.toprcกลับเป็น~/.toprcก่อนเปิดtopใช้

การเปลี่ยนชื่อและเปิดตัวไฟล์นี้topอาจจะสามารถทำงานเป็นเชลล์สคริปต์ง่ายๆโดยบางคนที่มีประสบการณ์และความรู้มากกว่าฉัน คุณจะต้องพิจารณาเป็นพิเศษหากtopรูปแบบปกติของคุณได้รับการปรับแต่งแล้ว


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