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 ps
nhưng tôi không biết mình cần sử dụng những tham số nào.
ps
thì trước tiên cố gắng man ps
, info ps
và tìm hiểu về nó trên mạng Internet.
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 ps
nhưng tôi không biết mình cần sử dụng những tham số nào.
ps
thì trước tiên cố gắng man ps
, info ps
và tìm hiểu về nó trên mạng Internet.
Câu trả lời:
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
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
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 jcmd
tiện ích
jps
Để có định dạng đầu ra tốt hơn, hãy kiểm tra lệnh này:
ps -fC java
Đ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
ps aux | grep java
hoặc là
$ ps -fea|grep -i java
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
pgrep -l java
ps -ef | grep java
grep
quá trình?
ps axuwww | grep java | grep -v grep
Trên sẽ
(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...
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.
$ top
chỉ 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 java
cung cấp các phần còn thiếu của câu đố.
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.
Có rất nhiều cách để làm điều này. Bạn có thể sử dụng java.lang.ProcessBuilder
và "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 /proc
thư 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ả fork
và join
cá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.
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 []
.
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'
Để biết danh sách java đang chạy trên máy linux. ps -e | grep java