Lọc đầu ra lệnh hàng đầu


12

Tôi đang chạy Mac và muốn lọc đầu ra của toplệnh cho một quy trình cụ thể sao cho chỉ các cột CPU, CPU và% CPU được hiển thị.

Sau khi nhận được PID của quá trình, tôi chạy:

top -pid 1234

Tuy nhiên, điều này hiển thị hơn 15 cột cho quá trình đó. Tôi có thể dẫn đầu ra của 'lệnh vào awk và chỉ hiển thị:

PID COMMAND %CPU

cột?

Tôi không muốn lưu trữ đầu ra trong một tệp văn bản và sau đó xử lý nó. Tôi quan tâm đến việc theo dõi quá trình trong thời gian thực.

Câu trả lời:


8
top -pid 3907 -stats "pid,command,cpu"
  • -pid 3907: ID tiến trình của bạn
  • -stats pid,command,cpu: chỉ hiển thị ID tiến trình, tên và CPU%

Không cần phải chạy awktrên đầu ra.


Nếu bạn muốn xử lý hậu kỳ đầu ra, hãy sử dụng -l 0để chạy trong chế độ ghi nhật ký (0 có nghĩa là vô thời hạn, mọi thứ khác đều giới hạn số lượng mẫu). Đầu ra sẽ trông như thế này (hai lần lặp lại):

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 

Sử dụng awkhoặc một công cụ tương tự để chỉ hiển thị mỗi dòng thứ 13 (vì các dòng này chứa các giá trị trong ví dụ đó):

$ 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 Làm việc cho tôi. Lưu ý rằng đây là một câu hỏi Mac OS, có một câu hỏi khác topvới Linux.
Daniel Beck

6

Điều này chắc chắn có thể được thực hiện và tôi sẽ giải thích làm thế nào tôi sẽ làm điều đó. Tôi không giả vờ đây là một cách tiếp cận tối ưu, nhưng nó thực hiện công việc. Tôi đang sử dụng Linux (và bash shell), vì vậy hành vi mặc định của phần trên của tôi có thể hơi khác nhau. Do đó, bạn có thể cần phải điều chỉnh mini-howto này cho kịch bản cụ thể của mình.

  1. Chỉ cần chạy hàng đầu , không có bất kỳ đối số:

    $ top

    Đây là tiêu đề và một dòng có liên quan từ đầu ra của tôi:

    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

    Tôi đã chọn một quá trình lưu lại trong bộ nhớ một thời gian và thực sự tiêu tốn CPU, tôi sẽ sử dụng nó làm quy trình thử nghiệm để đạt được mục tiêu cuối cùng.

  2. Theo mặc định, hàng đầu chạy trong chế độ tương tác. Điều này không phù hợp với tôi, tôi muốn thu thập dữ liệu liên quan và in nó. Tôi sẽ xử lý nhiệm vụ hiển thị dữ liệu tương tác sau đó. Báo giá có liên quan từ trang chủ hàng đầu:

    -b: Hoạt động ở chế độ hàng loạt Bắt đầu hàng đầu trong 'Chế độ hàng loạt', có thể hữu ích cho việc gửi đầu ra từ đầu đến các chương trình khác hoặc đến một tệp. Trong chế độ này, top sẽ không chấp nhận đầu vào và chạy cho đến khi giới hạn lặp bạn đã đặt với tùy chọn dòng lệnh '-n' hoặc cho đến khi bị giết.

    -n: Số lần lặp giới hạn là: -n số Chỉ định số lần lặp tối đa hoặc khung, đỉnh sẽ tạo ra trước khi kết thúc.

    Đây là lệnh trên được điều chỉnh chỉ in đầu ra một lần, sau đó thoát:

    $ top -b -n 1

  3. Tôi biết PID tôi muốn xem, vì vậy tôi sẽ thêm một hạn chế nữa vào đầu, để nó chỉ in dữ liệu về quy trình đó:

    $ top -b -n 1 -p 2569

  4. Ngay cả trong chế độ hàng loạt, hàng đầu vẫn in một tiêu đề, chứa các số liệu thống kê trên toàn hệ thống như thời gian hoạt động, bộ nhớ / trao đổi miễn phí, v.v. Tôi không cần điều này. Tất cả những gì tôi cần chỉ là một dòng - dòng chứa dữ liệu về quy trình của tôi, vì vậy tôi sẽ cắt nó từ toàn bộ đầu ra như thế này:

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

    Như bạn thấy, tôi đã có dòng thứ hai từ 1.

  5. Tôi sẽ chuyển dòng này sang awk để chỉ trích xuất các cột tôi cần:

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

  6. Cho đến bây giờ, tôi đã thực hiện các thao tác này trong dòng lệnh, bây giờ là lúc để thêm một chút kiên trì và linh hoạt cho trường hợp cụ thể được mã hóa cứng của chúng tôi. Tôi đang chuyển toàn bộ dòng thành một kịch bản shell đơn giản. Tôi sẽ gọi nó là 3top , tên được nhấn mạnh vì nó sẽ được sử dụng sau:

    #!/bin/bash

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

  7. Số PID được mã hóa cứng, đây là cách tạo tập lệnh để chấp nhận nó làm đối số dòng lệnh:

    #!/bin/bash

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

    Để tạo số liệu thống kê hiển thị 3top về PID 2569, nó phải được gọi như thế này:

    $ ./3top 2569

  8. Tôi cũng muốn phần trăm hiển thị sau khi tải CPU, vì vậy tôi đang điều chỉnh tập lệnh 3top của mình như thế này:

    #!/bin/bash

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

    echo "$out%"

    Tôi đã chuyển hướng toàn bộ đầu ra của một chuỗi các lệnh (được kết nối qua các đường ống) thành một biến. Sau đó, tôi chỉ in nó bằng echo và thêm '%' ở cuối, vì tải CPU là trường cuối cùng

  9. Tại thời điểm này, tôi có một tập lệnh bó chấp nhận một PID làm đối số và in các số liệu thống kê một lần. Bạn muốn theo dõi thời gian thực thay thế? Thật dễ dàng, bởi vì đồng hồ có thể làm điều đó! Chạy đoạn script như thế này:

    $ watch -n 1 3top 2569

    Nó sẽ thực hiện giám sát thời gian thực bằng cách chạy 3top mỗi giây một lần.


11
Người dùng đang sử dụng OS X và không có Gnu top. tùy chọn hoặc cú pháp không hợp lệ: -b . Không có lý do tại sao điều này đã nhiều lần được nâng cấp.
Daniel Beck

5
Không thể cài đặt Gnu top(in procps) bằng Homebrew, MacPorts hoặc Fink và không thể được biên dịch từ nguồn bằng cách sử dụng makehoặc cc top.c.
Daniel Beck

2

Các topđịnh dạng hiển thị là tùy chỉnh, nhưng không có một cách để xác định tùy chọn hiển thị tại dòng lệnh. Tuy nhiên, nếu bạn là người sáng tạo, có lẽ bạn có thể làm những gì bạn cần bằng cách khéo léo xử lý ~/.toprctệp.

Giả sử bạn chưa tùy chỉnh hiển thị top(và không có ~/.toprctệp):

  1. Ra mắt top.
  2. Nhấn fđể vào chế độ chọn trường.
  3. Đối với mỗi trường có một trường *bên cạnh mà bạn không muốn, hãy nhấn chữ cái tương ứng để bỏ chọn trường đó. Ví dụ, nhấn eđể bỏ chọn User Nametrường. Khi bạn làm xong, bạn chỉ nên có một *bên cạnh Process Id, CPU usageCommand name/line.
  4. Nhấn Spaceđể trở về cửa sổ chính.
  5. Nhấn W(tức là Shift+ w) để lưu bố cục hiện tại vào ~/.toprctệp của bạn .
  6. Thoát top, sau đó khởi chạy lại để xác minh rằng các cài đặt của bạn đã được lưu.
  7. Khi bạn muốn trở về bố cục mặc định, đổi tên ~/.toprcthành một cái gì đó như ~/min.toprctrước khi khởi chạy top. Khi bạn muốn chuyển sang bố cục tối thiểu, đổi tên ~/min.toprctrở lại ~/.toprctrước khi khởi chạy top.

Việc đổi tên và khởi chạy tệp này topcó thể có thể được xử lý thành một tập lệnh shell đơn giản bởi một người có nhiều kinh nghiệm và kiến ​​thức hơn tôi. Bạn sẽ cần xem xét đặc biệt nếu topbố cục thường xuyên của bạn đã được tùy chỉnh.


Có thể thêm bộ lọc (ngay cả khi thủ công) vào .toprc? Tôi thích thêm bộ lọc RUID>999khi khởi động.
Bác sĩ Beco
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.