Lệnh top -c trong linux để lọc các quy trình được liệt kê dựa trên processname


149
top -c

Top liệt kê tất cả các quy trình, có các tùy chọn tốt để lọc các quy trình theo tên người dùng bằng cách sử dụng tùy chọn -u nhưng tôi tự hỏi liệu có cách nào dễ dàng để lọc các quy trình dựa trên tên quy trình được liệt kê dưới cột LỰA của đầu ra hàng đầu.

Ví dụ, tôi muốn có tùy chọn hàng đầu -sub chuỗi của processname và top hiển thị các pids chỉ có chuỗi con này trong tên lệnh của nó

Câu trả lời:


213

Sử dụng pgrep để lấy pid's của các dòng lệnh phù hợp:

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

top -pmong đợi một danh sách các dấu phẩy được phân tách bằng dấu phẩy để chúng tôi sử dụng -d','trong pgrep. Các -fcờ trong pgrep làm cho nó phù hợp với dòng lệnh thay vì tên chương trình.


12
chỉ cần nhớ rằng nếu các quy trình mới được sinh ra cho 'string_to_match_in_cmd_line' thì chúng sẽ không hiển thị ở trên cùng; bạn phải thoát khỏi top và chạy lại lệnh này
eugenevd

1
Như eugenevd đã nói, điều này sẽ không hoạt động đối với các quy trình mới được bắt đầu sau khi đỉnh được gọi. Có cách nào để làm như vậy? Tôi cần chạy một số chương trình có cùng tiền tố với tên của nó và tôi rất muốn xem có bao nhiêu chương trình đang chạy theo cách trực tiếp, không cần phải thực hiện một đỉnh mới (hoặc chỉ là một ps) mỗi lần.
Jester

1
@Jester, eugenevd, tôi có vấn đề tương tự như bạn đã làm. Tôi đã tạo một phiên bản mới tại stackoverflow.com/a/27653841/681830 , hy vọng điều đó có ích.
Val

5
Tôi gặp phải top: pid limit (20) exceededvì vậy tôi sử dụng này : top -c -p $(pgrep -f string_to_match_in_cmd_line | head -20 | tr "\\n" "," | sed 's/,$//').
f01

115

Nó có thể được thực hiện tương tác

Sau khi chạy top -c, nhấn ovà viết bộ lọc trên một cột, ví dụ: để hiển thị các hàng trong đó cột LỰA chứa chuỗi foo, ghiCOMMAND=foo

Nếu bạn chỉ muốn một số đầu ra cơ bản thì điều này có thể là đủ:

top -bc |grep name_of_process

7
Điều này mang lại cho tôi 'tùy chọn hoặc cú pháp không hợp lệ: -bc'
shmim

3
top -bc -n 1 thuận tiện hơn, vì nó giới hạn số lần lặp lại là 1.
galath

1
Đây phải là câu trả lời được chấp nhận. Nó hiệu quả hơn và hoạt động chỉ với các tùy chọn được cung cấp bởi lệnh 'top'. Và nó cho thấy các quy trình mới.
Abraham TS

Các quá trình tiếp tục biến mất và xuất hiện trở lại với top -c , hit o and write a filter on a column.
MrR

92

Bạn có thể thêm các bộ lọc vào toptrong khi nó đang chạy, chỉ cần nhấn ophím và sau đó nhập vào biểu thức lọc. Ví dụ: để giám sát tất cả các quy trình java, hãy sử dụng biểu thức lọc COMMAND=java. Bạn có thể thêm nhiều bộ lọc bằng cách nhấn lại phím, bạn có thể lọc theo người dùng bằng uphím và bạn có thể xóa tất cả các bộ lọc bằng =phím.


2
Đây là một giải pháp tốt hơn câu trả lời được chấp nhận (giải pháp này đặt ra muộn hơn 3 năm so với ban đầu). Không giống như bản gốc, giải pháp này thực sự cũng hoạt động trên các quy trình mới được sinh ra. Rất quan trọng nếu bạn đang theo dõi các quy trình Apache được tạo theo yêu cầu.
Nate Lampton

2
Quả thực là một giải pháp tốt hơn vì nó lọc trực tiếp. Giải pháp được chấp nhận giải quyết id quá trình trước khi chạy top. Quá trình kết quả giống như đã top -c -p 920,1345,1346được cố định.
Jérôme Gillard

4
Sử dụng olàm bộ lọc không tồn tại trong một số phiên bản (cũ) hàng đầu: top: procps version 3.2.8Bộ lọc người dùng tồn tại, do đó, nó hoạt động.
Manwe

13

Lệnh của perreal hoạt động rất tốt! Nếu bạn quên, hãy thử trong hai bước ...

ví dụ: bộ lọc hàng đầu để chỉ hiển thị ứng dụng có tên yakuake:

$ pgrep yakuake
1755

$ top -p 1755

các lệnh tương tác hàng đầu hữu ích 'c': chuyển đổi đường dẫn đầy đủ so với tên lệnh 'k': kill bởi PID 'F': lọc bằng ... chọn bằng mũi tên ... sau đó nhấn 's' để đặt sắp xếp

câu trả lời dưới đây cũng tốt ... Tôi đã tìm kiếm nó ngày hôm nay nhưng không thể tìm thấy nó. Cảm ơn


7

Sau khi tìm kiếm rất nhiều câu trả lời trên StackOverflow, tôi chưa thấy câu trả lời nào phù hợp với nhu cầu của mình.

Đó là, để thực hiện lệnh hàng đầu để tiếp tục làm mới với từ khóa đã cho và chúng tôi không phải lặp lại CTRL + C / top khi các quy trình mới sinh ra.

Vì vậy, tôi tạo một cái mới ...

Đây là phiên bản không cần khởi động lại.

__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;)

Sửa đổi __keyword và nó sẽ hoạt động. (Đã thử nghiệm Ubuntu 2.6,38)

2.14.2015 đã thêm: Phần khối lượng công việc hệ thống bị thiếu với mã ở trên. Đối với những người quan tâm đến phần "tải trung bình":

__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;)

điều này thiếu một cái nhìn tổng quan về khối lượng công việc của hệ thống. thêm "thời gian hoạt động" trước khi ngủ, đối với các danh sách quy trình ngắn, đây là IMHO đủ.
Sevyls 16/2/2015

1
@Sevyls Cảm ơn bạn đã chỉ ra! Sau một vài lần thử khác (không hoạt động tốt như) phiên bản của bạn có thể là một trong những phiên bản tốt nhất. Trả lời sửa đổi.
Val

Hoạt động tuyệt vời nếu tôi có một hoặc nhiều quy trình chạy phù hợp nhưng tôi nhận được "top: Người dùng không hợp lệ" khi tất cả dừng lại. Nó phục hồi khi một quá trình khác bắt đầu. Tôi đang chạy trên Raspbian FYI. Cảm ơn.
Mike

1

cái này thì sao?

top -c -p <PID>

4
chúng tôi đang cố gắng lọc theo tên tiến trình (hoặc chuỗi con của nó) và khi bạn khởi động lại quy trình của mình, bạn sẽ nhận được một thông báo mới.
Srujan Kumar Gulla

1

Tôi đã kết thúc bằng cách sử dụng tập lệnh shell với đoạn mã sau:

#!/bin/bash

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

1

Hầu hết các câu trả lời thất bại ở đây, khi danh sách quy trình vượt quá 20 quy trình. Đó là top -pgiới hạn tùy chọn. Đối với những người có đầu cũ hơn không hỗ trợ lọc với ocác tùy chọn, đây là một ví dụ có thể viết được để lấy hết màn hình / bảng điều khiển (thông tin tóm tắt bị thiếu từ đầu ra này).

__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 )

Một số giải thích

__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

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.