Bagaimana saya bisa mengetahui, file jar Java mana yang sedang berjalan (dan PID-nya)?

12

Saya memiliki .jarfile yang terkenal karena kerusakan. Ketika kerusakan terjadi, hanya restart yang membantu. Saya punya cara untuk mendeteksi kerusakan itu (membaca file log dari kata .jar) Jadi saya ingin menulis skrip, yang membunuh proses setiap kali kerusakan terjadi. Masalahnya adalah:

confus@confusion:~$ ps -A
...
4438 ?        00:00:00 java
4439 ?        00:00:00 java
4443 ?        00:00:00 java
...

Nama proses semua yang dijalankan .jaradalah "java" secara alami. Bagaimana saya mengetahuinya, yang mana dari "java" -proses ini yang ingin saya bunuh, yaitu yang berjalan foobar.jar?

membingungkan
sumber
Perhatikan bahwa jika Anda menjalankan sebagai pengguna yang sama, Anda dapat melampirkannya menggunakan misalnya visualvm dan memeriksanya sebelum Anda membunuhnya.
Thorbjørn Ravn Andersen

Jawaban:

11

Anda dapat menjalankan lsofperintah, yang mencantumkan proses mana yang memiliki file terbuka, dengan file jar Anda diberikan sebagai argumen. Contoh melihat file dengan lebih sedikit:

egil@mutter:~$ lsof foo.c
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
less    18871 egil    4r   REG    8,2        0 53862540 foo.c
egil@mutter:~$

Untuk menggunakan kembali pid dengan mudah, Anda dapat menjalankannya dalam mode singkat:

egil@mutter:~$ lsof -t foo.c
18871
Egil
sumber
Jawaban ini bahkan lebih baik. +1.
Octavian A. Damiean
7

Menggunakan ps ax akan membantu.

Ini akan menampilkan pohon proses dalam gaya BSD yang hanya menunjukkan informasi lebih lanjut.

Untuk menemukan proses khusus Anda, Anda hanya perlu mencari nama JAR. ps ax | grep JARNAMEakan melakukannya.

Oktavianus A. Damiean
sumber
1

Anda dapat melakukan ini asli atau jika "lsof" tidak diinstal melalui / proc // fd Contoh:

ps -ef|grep -w java
...
0c4       6917  6916  0 12:22 pts/7    00:00:00 java
...

ls -la /proc/6917/fd/
total 0
dr-x------ 2 0c4 svauser  0 Apr  2 12:23 .
dr-xr-xr-x 9 0c4 svauser  0 Apr  2 12:22 ..
lrwx------ 1 0c4 svauser 64 Apr  2 12:23 0 -> /dev/pts/7
lrwx------ 1 0c4 svauser 64 Apr  2 12:23 1 -> /dev/pts/7
lrwx------ 1 0c4 svauser 64 Apr  2 12:23 2 -> /dev/pts/7
lr-x------ 1 0c4 svauser 64 Apr  2 12:23 3 -> /opt/jdk1.8.0_191/jre/lib/rt.jar
lr-x------ 1 0c4 svauser 64 Apr  2 12:23 4 -> /media/veracrypt1/Downloads/rr/testone.jar
lr-x------ 1 0c4 svauser 64 Apr  2 12:23 5 -> /usr/share/java/gnu-getopt-1.0.14.jar
0x0C4
sumber
0

Anda bisa menggunakan jpsdengan -lopsi yang akan mengembalikan file .jar digunakan dengan path lengkap.

-l Menampilkan nama paket lengkap untuk kelas utama aplikasi atau nama path lengkap ke file JAR aplikasi.

froblesmartin
sumber
jps tidak ada dalam Java runtimes yang tersedia saat pertanyaan diajukan. Ini tersedia dalam yang tersedia hari ini.
Thorbjørn Ravn Andersen
Saya dapat melihatnya di Java SE 6 docs: docs.oracle.com/javase/6/docs/technotes/tools/share/jps.html , dan itu dari Desember 2006 seperti yang saya lihat di sini: en.wikipedia.org/ wiki / Java_version_history # Java_SE_7
froblesmartin