Giới hạn đầu ra của lệnh TOP đối với một tên quy trình cụ thể


81

Nếu bạn gọi lệnh trên cùng, bạn sẽ nhận được tất cả các quy trình đang chạy. Nhưng làm thế nào tôi có thể giới hạn đầu ra chỉ ở một tên quy trình nhất định như "java" ?

Tôi đã thử top 2 này | grep java nhưng bằng cách này bạn chỉ nhận được ảnh chụp nhanh chứ không phải danh sách cập nhật liên tục. Và top -l 0 | grep java không thực sự rõ ràng.


5
Thật không may cho đến nay vẫn chưa có câu trả lời hợp lệ vì -p & -b không được hỗ trợ bởi lệnh trên cùng của OS X.
Alex,

Tôi đã đăng những gì có thể là giải pháp OSX đầu tiên dưới đây - và chỉ trong nick của thời gian;)
Chống Trái đất

Câu trả lời:


131

Tôi thích điều sau hơn để tôi vẫn có thể sử dụng top một cách tương tác mà không cần phải tra cứu pids mỗi khi tôi chạy nó:

top -p `pgrep process-name | tr "\\n" "," | sed 's/,$//'`

Tất nhiên nếu các quy trình thay đổi, bạn sẽ phải chạy lại lệnh.

Giải trình:

  • pgrep process-name trả về danh sách các id quy trình được phân tách bằng các dòng mới
  • tr "\\n" "," dịch những dòng mới này thành dấu phẩy, vì top muốn có một danh sách id quy trình được phân tách bằng dấu phẩy
  • sedlà một trình chỉnh sửa luồng và sed 's/,$//'được sử dụng ở đây để xóa dấu phẩy ở cuối

2
Câu trả lời hay nhất, cải tiến trên dogbane để bạn có thể nhập tên thực tế hơn là dán nhiều PID. (Và đây là SO)
sabgenton

1
Tôi sẽ bỏ phiếu cho bạn nhiều lần nếu tôi có thể, đây thực sự phải là câu trả lời "được chấp nhận", tôi nghĩ.
spuriousdata

6
Tôi nhận được top: pid limit (20) exceeded. Có dù sao xung quanh giới hạn đó?
celwell

7
@celwell, hãy thử top -p $(pgrep process-name | head -20 | tr "\\n" "," | sed 's/,$//'). Điều này sẽ hiển thị dữ liệu cho tối đa 20 PID đầu tiên được trả về pgrep.
Acumenus

3
Đối với Yosemite (hoặc sớm hơn?) Nó -pidthay vì -p.
tối đa

53

Tìm pids của các quá trình bạn muốn theo dõi và sau đó sử dụng -ptùy chọn cho phép bạn cung cấp danh sách các pids cho toplệnh.

Thí dụ:

top -p 18884 -p 18892 -p 18919

  PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME CPU COMMAND
18884 user  25   0  672M  95M  9476 S     0.0  1.1   0:02   1 java
18892 user  25   0 2280M 123M 12252 S     0.0  1.5   0:05   1 java
18919 user  22   0 1492M 198M 28708 S     0.0  2.4   0:07   1 java

(Tôi tin rằng bạn cũng có thể chuyển vào danh sách được phân tách bằng dấu phẩy.)


7
Trên Mac, nó phải là "top -pid ID" nhưng quy trình Java có thể có một số ID riêng biệt vì có thể có một số quy trình java.
Alex

32

làm thế nào về top -b | grep java


1
Không hoạt động trên Mac vì Mac sử dụng công cụ BSD chứ không phải công cụ GPL. Và có một số khác biệt. Tôi cho rằng phiên bản "-b" tương tự như "-l 0" nhưng cũng in tiêu đề của bảng?
Alex,

29

Mở rộng câu trả lời của @ dogbane , bạn có thể nhận được tất cả các PID cho một quy trình được đặt tên pgrepđể thực hiện như sau:

top -p "$(pgrep -d ',' java)"

2
Này có giới hạn tối đa là 20 PID
MRP

top -p "$(pgrep -d ',' php)" top: pid limit (20) exceeded
mrP

Bạn đúng! man topcho biết "Tùy chọn này có thể được cung cấp tối đa 20 lần hoặc bạn có thể cung cấp danh sách được phân tách bằng dấu phẩy với tối đa 20 giá thầu." Chà.
l0b0

6

Sử dụng lệnh đồng hồ

watch -d 'top -n1 | grep mysql'

Nên là "watch --d". Tuy nhiên, tôi không nhận được kết quả thực thi lệnh này.
Alex

-1:: man watch" watch chạy lệnh lặp đi lặp lại, hiển thị đầu ra và lỗi của nó "; nó không hiển thị các tiến trình đang chạy như topkhông
sdaau

@AlexanderOrlov, không có phép thuật đặc biệt nào ở đây, chỉ cần sử dụng top -n1 để in và thoát ra, và sử dụng đồng hồ để theo dõi liên tục.
tszming

@sdaau, bình luận của bạn không liên quan đến câu trả lời của tôi, vui lòng trả lời cẩn thận hơn vào lần sau.
tszming

1
Tôi nghĩ chúng ta nên thêm tùy chọn -b. watch -d 'top -b -n1 | grep mysql'
Reyes Yang

6

Sử dụng câu trả lời từ đây, tôi đã có thể tạo một lớp lót

top -pid $(pgrep process_name | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ -pid /g')

Điều này phù hợp với tôi trên MacOS 10.12 (Sierra)


2

Tôi đã giải quyết vấn đề của mình bằng cách sử dụng:

đầu -n1 -b | grep "tên truy cập"

trong trường hợp này: -n được sử dụng để đặt số lần truy cập cao nhất
và -b được sử dụng để hiển thị tất cả các pids

nó ngăn các lỗi như: top: pid limit (20) vượt quá


2

Đoạn mã sau cập nhật danh sách các quy trình sau mỗi 5 giây thông qua lệnh watch:

watch -n 5 -t top -b -n 1 -p$(pgrep java | head -20 | tr "\\n" "," | sed 's/,$//')



1

Giả sử .. nếu chúng ta có hơn 20 tiến trình đang chạy trên máy chủ có cùng tên ... điều này sẽ không hữu ích

đầu -p pgrep oracle | head -n 20 | tr "\\n" "," | sed 's/,$//'

Nó sẽ cố gắng liệt kê và cung cấp đầu ra thời gian thực của 20 tiến trình mà chúng ta có khả năng bỏ sót các prcesses khác tiêu tốn nhiều tài nguyên hơn ....

Tôi vẫn đang tìm kiếm lựa chọn tốt hơn về việc này


0

Một trường hợp cụ thể hơn, giống như tôi thực sự đang tìm kiếm:

Đối với Java xử lý bạn cũng có thể sử dụng jps -qtheo đó JPS là một công cụ từ $ JAVA_HOME / bin và do đó phải ở trong $ PATH của bạn.


0

Tôi đến đây để tìm câu trả lời cho điều này trên OSX. Tôi đã đạt được những gì tôi muốn với bash và awk:

topfiltered() {
  [[ -z "$1" ]] && return
  dump="/tmp/top_dump"
  rm -f "$dump"
  while :; do
    clear
    [[ -s "$dump" ]] && head -n $(( $LINES - 1 )) "$dump"
    top -l 1 -o cpu -ncols $(( $COLUMNS / 8 )) | awk -v p="$(pgrep -d ' ' $@)" '
        BEGIN { split(p, arr); for (k in arr) pids[arr[k]]=1 }
        NR<=12 || ($1 in pids)
    ' >"$dump"
  done
}

Tôi lặp lại trên cùng trong chế độ ghi nhật ký và lọc nó bằng awk, xây dựng một mảng liên kết từ đầu ra của pgrep. Awk in 12 dòng đầu tiên, trong đó dòng 12 là tiêu đề cột và sau đó là mọi dòng có pid là một khóa trong mảng. Tệp kết xuất được sử dụng cho một vòng lặp dễ xem hơn.


Trên OSX, bạn có thể sử dụng một cái gì đó như pgrep <process_name>; top -pid <pid_specified_by_pgrep>
bergercookie

0

chỉ top -bn 1 | grep javasẽ làm thủ thuật cho bạn


0

Chạy phần bên dưới sẽ cập nhật liên tục trong bảng điều khiển:

bcsmc2rtese001 [~]$ echo $SHELL  
/bin/bash  
bcsmc2rtese001 [~]$ top | grep efare  or watch -d 'top | grep efare' or top -p pid
27728 efare     15   0 75184 3180 1124 S  0.3  0.0 728:28.93 tclsh  
27728 efare     15   0 75184 3180 1124 S  0.7  0.0 728:28.95 tclsh

0

Đây là giải pháp duy nhất cho đến nay cho MacOS:

top -pid `pgrep java | awk 'ORS=" -pid "' | sed 's/.\{6\}$//'`

mặc dù điều này chắc chắn sẽ báo cáo invalid option or syntax: -pidnếu không có javaquy trình nào còn tồn tại.

GIẢI TRÌNH

Các giải pháp khác được đăng ở đây sử dụng định dạng top -p id1,id2,id3, nhưng MacOS ' topchỉ hỗ trợ định dạng khó sử dụng top -pid id1 -pid id2 -pid id3.

Vì vậy, trước tiên, chúng tôi nhận được danh sách các id quy trình có tên quy trình là "java":

pgrep java

và chúng tôi chuyển điều này tới awkkết nối kết quả với dấu phân tách" -pid "

| awk 'ORS=" -pid "'

Than ôi, điều này để lại một dấu phân cách cuối cùng! Ví dụ, cho đến nay chúng tôi có thể đã lấy được chuỗi"123 -pid 456 -pid 789 -pid " .

Sau đó, chúng tôi chỉ sử dụng sedđể loại bỏ 6 ký tự cuối cùng của dấu phân cách.

| sed 's/.\{6\}$//'`

Chúng tôi sẵn sàng chuyển kết quả cho top:

top -pid `...`

0

nhận pid của quá trình:

# pidof <process>

cho biết (các) pid quy trình sẽ hiển thị

# top -p <pid1>,<pid2>, etc

thí dụ:

landis@linux-e6510:~>pidof konsole
1841 1709
landis@linux-e6510:~>top -p 1841,1709

Top sẽ chỉ hiển thị 2 quy trình 'konsole'. Điều này hữu ích trên một máy chủ bận thông qua ssh, không cần phải chuyển qua grep.


xin lỗi, không thấy thẻ macos được đề cập. của tôi hoạt động trên tất cả các hộp linux của tôi.
Landis Reed

-1

Sử dụng cách tiếp cận được đề cập trong câu trả lời của Rick Byers:

top -p `pgrep java | paste -sd "," -`

nhưng tôi đã có hơn 20 quy trình đang chạy vì vậy lệnh sau có thể hữu ích cho những người gặp phải tình huống tương tự.

top -p `pgrep java | head -n 20 | paste -sd "," -`

pgreplấy danh sách các tiến trình với tên đã cho - java trong trường hợp này. headđược sử dụng để nhận 20 pids đầu tiên vì top không thể xử lý nhiều hơn 20 pids khi sử dụng đối số -p. Cuối cùng pastetham gia danh sách các pids với ','.

Bạn có thể kiểm soát tên quy trình bạn đang tìm kiếm trong lệnh trên và số lượng quy trình có tên đó mà bạn muốn xem. Bạn có thể bỏ qua head -n 20phần này nếu số lượng quy trình của bạn có tên đã cho ít hơn 20.

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.