Danh sách các quy trình Java


113

Làm cách nào để liệt kê tất cả các quy trình Java trong bash? Tôi cần một dòng lệnh. Tôi biết có lệnh psnhưng tôi không biết mình cần sử dụng những tham số nào.


1
vui lòng cố gắng hơn một chút trong việc nghiên cứu vấn đề này và mô tả vấn đề của bạn, có rất nhiều khả năng tùy thuộc vào chính xác những gì bạn đang theo đuổi.
Mat

3
Nếu bạn biết có psthì trước tiên cố gắng man ps, info psvà tìm hiểu về nó trên mạng Internet.
ssapkota

Câu trả lời:



109

Java gần đây đi kèm với Công cụ trạng thái quy trình máy ảo Java "jps"

http://download.oracle.com/javase/1.5.0/docs/tooldocs/share/jps.html

Ví dụ,

[nsushkin@fulton support]$ jps -m
2120 Main --userdir /home/nsushkin/.netbeans/7.0 --branding nb
26546 charles.jar
17600 Jps -m

2
Chỉ cần lưu ý: jps chỉ giao hàng với JDK, không phải JRE. Các máy có thời gian chạy Java thuần túy sẽ không có công cụ này.
aguazales

làm thế nào tôi có thể chỉ cần đếm tiến trình java đang chạy?
Máy bay phản lực

50
jps -lV

hữu ích nhất. Chỉ in pid và tên lớp chính đủ điều kiện:

2472 com.intellij.idea.Main
11111 sun.tools.jps.Jps
9030 play.server.Server
2752 org.jetbrains.idea.maven.server.RemoteMavenServer

31

Bạn cũng có thể sử dụng một lệnh pgrep (không yêu cầu bạn sử dụng đường dẫn và nhiều lệnh):

pgrep -fl java

27

Bắt đầu từ Java 7 , cách đơn giản nhất và ít bị lỗi hơn là chỉ cần sử dụng lệnh jcmd là một phần của JDK để nó hoạt động theo cùng một cách trên tất cả các hệ điều hành.

Thí dụ:

> jcmd
5485 sun.tools.jcmd.JCmd
2125 MyProgram

jcmd cho phép gửi các yêu cầu lệnh chẩn đoán đến Máy ảo Java (JVM) đang chạy.

Thêm chi tiết về cách sử dụngjcmd .

Xem thêm các jcmdtiện ích


1
Wow, thậm chí còn tốt hơn so vớijps
Sridhar Sarnobat

15

Để có định dạng đầu ra tốt hơn, hãy kiểm tra lệnh này:

ps -fC java

Đẹp một đầu ra sạch; Chính xác những gì tôi đang tìm kiếm. Cảm ơn!
Charles Naccio

12

Điều này sẽ trả về tất cả các tiến trình java đang chạy trong môi trường linux. Sau đó, bạn có thể hủy quá trình bằng cách sử dụng ID quá trình.

ps -e|grep java


6

Nếu tôi chỉ muốn liệt kê các quy trình java, hãy sử dụng:

ps -A | grep java

5
pgrep -l java
ps -ef | grep java

5
Cảm ơn bạn vì đoạn mã này, đoạn mã này có thể cung cấp một số trợ giúp ngay lập tức. Một lời giải thích phù hợp sẽ cải thiện đáng kể giá trị giáo dục của nó bằng cách chỉ ra lý do tại sao đây là một giải pháp tốt cho vấn đề và sẽ làm cho nó hữu ích hơn cho những độc giả trong tương lai với những câu hỏi tương tự, nhưng không giống hệt nhau. Vui lòng chỉnh sửa câu trả lời của bạn để thêm giải thích và đưa ra dấu hiệu về những giới hạn và giả định nào được áp dụng. Đặc biệt, tại sao phần thứ hai trong số đó không hiển thị grepquá trình?
Toby Speight

4
ps axuwww | grep java | grep -v grep

Trên sẽ

  • hiển thị cho bạn tất cả các quy trình với các dòng dài (arg: www)
  • bộ lọc (grep) chỉ những dòng chứa từ java và
  • lọc ra dòng "grep java" :)

(btw, ví dụ này không phải là ví dụ hiệu quả, nhưng đơn giản để nhớ);)

bạn có thể chuyển phần trên sang các lệnh khác, ví dụ:

ps axuwww | grep java | grep -v grep | sed '.....'  | while read something
do
    something_another $something
done

Vân vân...


3

Khi tôi muốn biết liệu một lớp Java nhất định có được thực thi hay không, tôi sử dụng dòng lệnh sau:

ps ww -f -C java | grep "fully.qualified.name.of.class"

Từ giao diện hệ điều hành, tên lệnh của quy trình là "java". Tùy chọn "ww" mở rộng các ký tự tối đa của cột, vì vậy có thể thu thập FQN của lớp liên quan.


Đây là những gì tôi đang tìm kiếm - $ topchỉ cần cung cấp "java" làm lệnh, điều này không hữu ích khi cố gắng tìm ra quy trình nào đang làm hỏng cpu. $ ps ww -fC javacung cấp các phần còn thiếu của câu đố.
David Clarke,

2

jps & jcmd không hiển thị cho tôi bất kỳ kết quả nào khi tôi thử nó bằng cách sử dụng openjdk-1.8 trên redhat linux. Nhưng ngay cả khi nó đã làm, nó chỉ hiển thị các quy trình dưới người dùng hiện tại mà không hoạt động trong trường hợp của tôi. Sử dụng ps | grep là những gì tôi đã làm nhưng đường dẫn lớp cho một số ứng dụng java có thể rất dài khiến kết quả không đọc được vì vậy tôi đã sử dụng sed để xóa nó. Điều này vẫn còn một chút khó khăn nhưng loại bỏ tất cả mọi thứ ngoại trừ: PID, Người dùng, java-class / jar, args.

ps -o pid,user,cmd -C java | sed -e 's/\([0-9]\+ *[^ ]*\) *[^ ]* *\([^$]*\)/\1 \2/' -e 's/-c[^ ]* [^ ]* \|-[^ ]* //g'

Kết quả trông giống như sau:

  PID USER     CMD
11251 userb org.apache.zookeeper.server.quorum.QuorumPeerMain ../config/zookeeper.properties
19574 userb com.intellij.idea.Main
28807 root org.apache.nifi.bootstrap.RunNiFi run
28829 root org.apache.nifi.NiFi

Một thay thế trên windows để liệt kê tất cả các quy trình là:

WMIC path win32_process where "Caption='java.exe'" get ProcessId,Commandline

Nhưng điều đó sẽ cần một số phân tích cú pháp để làm cho nó dễ đọc hơn.


1

Có rất nhiều cách để làm điều này. Bạn có thể sử dụng java.lang.ProcessBuildervà "pgrep" để có được quá trình id (PID) với một cái gì đó như: pgrep -fl java | awk {'print $1'}. Hoặc, nếu bạn đang chạy trong Linux, bạn có thể truy vấn /procthư mục.

Tôi biết, điều này có vẻ kinh khủng, và không di động, và thậm chí được triển khai kém, tôi đồng ý. Nhưng vì Java thực sự chạy trong một máy ảo, vì một lý do vô lý nào đó mà tôi thực sự không thể tìm ra sau hơn 15 năm làm việc với JDK, đó là lý do tại sao không thể nhìn thấy mọi thứ bên ngoài không gian JVM, điều đó thực sự nực cười với bạn. nghĩ về nó. Bạn có thể làm mọi thứ khác, ngay cả forkjoincác quy trình con (đó là một cách đa nhiệm kinh khủng khi cả thế giới không biết về luồng hay pthreads , thật là quái quỷ! Chuyện gì đang xảy ra với Java ?! :).

Điều này sẽ đưa ra một cuộc thảo luận rộng lớn mà tôi biết, nhưng dù sao, có một API rất tốt mà tôi đã sử dụng trong các dự án của mình và nó đủ ổn định ( đó là OSS, vì vậy bạn vẫn cần phải kiểm tra mọi phiên bản bạn sử dụng trước khi thực sự tin tưởng API ): https : //github.com/jezhumble/javasysmon

JavaDoc: http://jezhumble.github.io/javasysmon/ , tìm kiếm lớp học com.jezhumble.javasysmon.OsProcess, cô ấy sẽ thực hiện thủ thuật. Hy vọng nó sẽ giúp, chúc may mắn.


1
 ps -eaf | grep [j]ava

Nó tốt hơn vì nó sẽ chỉ hiển thị cho bạn các quy trình đang hoạt động không bao gồm lệnh này cũng có chuỗi java [].


nó phải là ps -eaf | grep Java not [j] ava
vaquar khan

anh chàng @vaquarkhan chỉ cố gắng chạy cả bạn và đề nghị tôi và xem whats sự khác biệt, cả hai đều sẽ làm việc
Ilya Gazman

Cả hai cho kết quả tương tự tuy nhiên [j] ava là khó hiểu
vaquar khan

0

Tôi sử dụng cái này (tốt trên Debian 8): alias psj='ps --no-headers -ww -C java -o pid,user,start_time,command'


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.