回答:
最近のJavaにはJava仮想マシンプロセスステータスツール「jps」が付属しています
http://download.oracle.com/javase/1.5.0/docs/tooldocs/share/jps.html
例えば、
[nsushkin@fulton support]$ jps -m
2120 Main --userdir /home/nsushkin/.netbeans/7.0 --branding nb
26546 charles.jar
17600 Jps -m
jps -lV
最も便利です。pidと修飾されたメインクラス名のみを出力します。
2472 com.intellij.idea.Main
11111 sun.tools.jps.Jps
9030 play.server.Server
2752 org.jetbrains.idea.maven.server.RemoteMavenServer
これにより、Linux環境で実行中のすべてのJavaプロセスが返されます。次に、プロセスIDを使用してプロセスを強制終了できます。
ps -e|grep java
ps aux | grep java
または
$ ps -fea|grep -i java
Javaプロセスを単純に一覧表示する場合は、次を使用します。
ps -A | grep java
pgrep -l java
ps -ef | grep java
grep
ps axuwww | grep java | grep -v grep
上記は
(ところで、この例は効果的なものではありませんが、覚えるのは簡単です);)
上記を別のコマンドにパイプできます。次に例を示します。
ps axuwww | grep java | grep -v grep | sed '.....' | while read something
do
something_another $something
done
等...
特定のJavaクラスが実行されているかどうかを知りたいときは、次のコマンドラインを使用します。
ps ww -f -C java | grep "fully.qualified.name.of.class"
OS側から見ると、プロセスのコマンド名は「java」です。「ww」オプションは、列の最大文字数を広げるので、関連クラスのFQNをgrepすることが可能です。
$ top
"java"をコマンドとして指定するだけで、どのプロセスがCPUを消費しているのかを理解しようとするときにあまり役に立ちません。$ ps ww -fC java
不足しているパズルのピースを提供します。
Redhat Linuxでopenjdk-1.8を使用して試したところ、jps&jcmdに結果が表示されませんでした。しかし、たとえそれが実行されたとしても、現在のユーザーのプロセスのみが表示され、私の場合は機能しません。最終的にps | grepを使用することになりますが、一部のJavaアプリのクラスパスは非常に長くなり、結果が読みにくくなるため、sedを使用して削除しました。これはまだ少しラフですが、PID、ユーザー、java-class / jar、argsを除くすべてを削除します。
ps -o pid,user,cmd -C java | sed -e 's/\([0-9]\+ *[^ ]*\) *[^ ]* *\([^$]*\)/\1 \2/' -e 's/-c[^ ]* [^ ]* \|-[^ ]* //g'
結果は次のようになります。
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
Windowsですべてのプロセスを一覧表示する代替方法は次のとおりです。
WMIC path win32_process where "Caption='java.exe'" get ProcessId,Commandline
しかし、それはそれをより読みやすくするためにいくつかの解析が必要になるでしょう。
これを行う方法はたくさんあります。java.lang.ProcessBuilder
「pgrep」を使用して、次のようなプロセスID(PID)を取得できますpgrep -fl java | awk {'print $1'}
。または、Linuxで実行している場合は、/proc
ディレクトリ。
私は知っています、これは恐ろしく、移植性がなく、実装も不十分であると私は同意します。しかし、Javaは実際にはVMで実行されているため、JDKを15年以上使用しても実際に理解できないなんらかの不合理な理由のために、JVM空間の外にあるものを見ることができないのは、あなたにとってはとんでもないことです。それについて考えてください。あなたも、他のすべて、行うことができますfork
し、join
世界は知りませんでしたとき、子プロセス(これらは、マルチタスクの恐ろしい方法でしたが、スレッドやpthreadsの地獄!何は、Javaで上に何が起こっているか、?! :)。
これは私が知っている非常に大きな議論になりますが、とにかく、私はすでにプロジェクトで使用した非常に優れたAPIがあり、十分に安定しています(それはOSSなので、実際にAPIを信頼する前に、使用するすべてのバージョンをストレステストする必要があります)。 https ://github.com/jezhumble/javasysmon
JavaDoc:http : //jezhumble.github.io/javasysmon/、クラスを検索com.jezhumble.javasysmon.OsProcess
、彼女はトリックを行います。それがお役に立てば幸いです。
ps -eaf | grep [j]ava
それはあなた[]
がトリックを行うJava文字列も取得したこのコマンドを含まないアクティブなプロセスのみを表示するのでより良いです
私はこれを使用します(Debian 8で良い):
alias psj='ps --no-headers -ww -C java -o pid,user,start_time,command'