รายการกระบวนการ Java


113

ฉันจะแสดงรายการกระบวนการ Java ทั้งหมดใน bash ได้อย่างไร ฉันต้องการบรรทัดคำสั่ง ฉันรู้ว่ามีคำสั่งpsแต่ฉันไม่รู้ว่าต้องใช้พารามิเตอร์อะไร


1
โปรดแสดงความพยายามอีกเล็กน้อยในการค้นคว้าและอธิบายปัญหาของคุณมีความเป็นไปได้มากมายขึ้นอยู่กับว่าคุณต้องการอะไร
จ้า

3
ถ้าคุณรู้ว่ามีpsแล้วความพยายามครั้งแรกman ps, info psและเรียนรู้เกี่ยวกับเรื่องนี้ในอินเทอร์เน็ต
ssapkota

คำตอบ:



109

Java ล่าสุดมาพร้อมกับ Java Virtual Machine Process Status Tool "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

2
หมายเหตุ: jps มาพร้อมกับ JDK เท่านั้นไม่ใช่ JRE เครื่องที่มีรันไทม์ Java ธรรมดาบนเครื่องจะไม่มีเครื่องมือนี้
aguazales

ฉันจะนับแค่การรันกระบวนการ java ได้อย่างไร
Jet

50
jps -lV

มีประโยชน์มากที่สุด พิมพ์เฉพาะ pid และชื่อคลาสหลักที่ผ่านการรับรอง:

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

31

คุณสามารถใช้pgrepคำสั่งเดียวได้เช่นกัน (ไม่ต้องการให้คุณใช้ไปป์และหลายคำสั่ง):

pgrep -fl java

27

เริ่มต้นจาก Java 7วิธีที่ง่ายที่สุดและมีแนวโน้มที่จะเกิดข้อผิดพลาดน้อยที่สุดคือเพียงใช้คำสั่งjcmd ที่เป็นส่วนหนึ่งของ JDKเพื่อให้มันทำงานในลักษณะเดียวกันกับทุกระบบปฏิบัติการ

ตัวอย่าง:

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

jcmd อนุญาตให้ส่งคำขอคำสั่งวินิจฉัยไปยัง Java Virtual Machine (JVM) ที่รันอยู่

รายละเอียดเพิ่มเติมเกี่ยวกับวิธีการใช้jcmd

ดูเพิ่มเติมยูทิลิตี้jcmd


1
ว้าjps
วดี

15

สำหรับรูปแบบผลลัพธ์ที่ดีขึ้นให้ตรวจสอบคำสั่งนี้:

ps -fC java

ดีผลผลิตที่สะอาด สิ่งที่ฉันกำลังมองหา ขอบคุณ!
Charles Naccio

12

สิ่งนี้จะส่งคืนกระบวนการ java ที่รันอยู่ทั้งหมดในสภาพแวดล้อม linux จากนั้นคุณสามารถฆ่ากระบวนการโดยใช้รหัสกระบวนการ

ps -e|grep java



5
pgrep -l java
ps -ef | grep java

5
ขอบคุณสำหรับข้อมูลโค้ดนี้ซึ่งอาจให้ความช่วยเหลือได้ทันที คำอธิบายที่เหมาะสมจะช่วยเพิ่มคุณค่าทางการศึกษาได้อย่างมากโดยแสดงให้เห็นว่าเหตุใดจึงเป็นวิธีแก้ปัญหาที่ดีและจะทำให้มีประโยชน์มากขึ้นสำหรับผู้อ่านในอนาคตที่มีคำถามที่คล้ายกัน แต่ไม่เหมือนกัน โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบายและระบุข้อ จำกัด และสมมติฐานที่ใช้ โดยเฉพาะอย่างยิ่งเหตุใดส่วนที่สองจึงไม่แสดงgrepกระบวนการ
Toby Speight

4
ps axuwww | grep java | grep -v grep

พินัยกรรมข้างต้น

  • แสดงกระบวนการทั้งหมดที่มีเส้นยาว (arg: www)
  • กรอง (grep) บรรทัดเฉพาะสิ่งที่มีคำว่า java และ
  • กรองบรรทัด "grep java" :)

(btw ตัวอย่างนี้ไม่ใช่ตัวอย่างที่ได้ผล แต่จำง่าย);)

คุณสามารถไปป์ข้างบนไปยังคำสั่งอื่นได้เช่น:

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

ฯลฯ ...


3

เมื่อฉันต้องการทราบว่ามีการเรียกใช้คลาส Java หรือไม่ฉันใช้บรรทัดคำสั่งต่อไปนี้:

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

จากมุมมองด้าน OS ชื่อคำสั่งของกระบวนการคือ "java" อ็อพชัน "ww" จะขยายอักขระสูงสุดของ colum ดังนั้นจึงเป็นไปได้ที่จะ grep FQN ของคลาสที่เกี่ยวข้อง


นี่คือสิ่งที่ฉันกำลังมองหา - $ topเพียงแค่ให้ "java" เป็นคำสั่งซึ่งไม่ได้มีประโยชน์อะไรเลยเมื่อพยายามคิดว่ากระบวนการใดที่ใช้ cpu $ ps ww -fC javaให้ชิ้นส่วนปริศนาที่ขาดหายไป
David Clarke

2

jps & jcmd ไม่แสดงผลลัพธ์ใด ๆ เมื่อฉันลองใช้โดยใช้ openjdk-1.8 บน redhat linux แต่ถึงแม้ว่ามันจะแสดงเฉพาะกระบวนการภายใต้ผู้ใช้ปัจจุบันซึ่งไม่ได้ผลในกรณีของฉัน การใช้ ps | grep เป็นสิ่งที่ฉันทำ แต่เส้นทางคลาสสำหรับแอป java บางตัวอาจยาวมากซึ่งทำให้ผลลัพธ์อ่านไม่ออกดังนั้นฉันจึงใช้ sed เพื่อลบออก สิ่งนี้ค่อนข้างหยาบ แต่จะลบทุกอย่างยกเว้น: PID, User, 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

แต่ต้องมีการแยกวิเคราะห์เพื่อให้อ่านง่ายขึ้น


1

มีหลายวิธีในการทำเช่นนี้ คุณสามารถใช้java.lang.ProcessBuilderและ "pgrep" เพื่อรับกระบวนการ ID (PID) pgrep -fl java | awk {'print $1'}กับสิ่งที่ต้องการ: หรือหากคุณใช้งานภายใต้ Linux คุณสามารถค้นหา/procไดเร็กทอรี

ฉันรู้ว่าสิ่งนี้ดูน่ากลัวและไม่พกพาและแม้แต่การนำไปใช้งานไม่ดีฉันก็เห็นด้วย แต่เนื่องจาก Java ทำงานใน VM ด้วยเหตุผลไร้เหตุผลบางอย่างที่ฉันไม่สามารถเข้าใจได้หลังจากใช้งาน JDK มานานกว่า 15 ปีจึงเป็นเหตุผลว่าทำไมจึงไม่สามารถมองเห็นสิ่งต่าง ๆ นอกพื้นที่ JVM ได้จึงเป็นเรื่องไร้สาระจริงๆสำหรับคุณ ลองคิดดู คุณสามารถทำทุกอย่างอื่นแม้forkและjoinกระบวนการที่เด็ก (เหล่านั้นเป็นวิธีที่น่ากลัวของการทำงานแบบ multitasking เมื่อโลกไม่ทราบเกี่ยวกับหัวข้อหรือpthreadsสิ่งที่นรก! สิ่งที่เกิดขึ้นในกับ Java ?! :)

สิ่งนี้จะให้การสนทนาที่ยิ่งใหญ่ที่ฉันรู้ แต่อย่างไรก็ตามมี API ที่ดีมากที่ฉันใช้ในโครงการของฉันอยู่แล้วและมีความเสถียรเพียงพอ ( เป็น OSS ดังนั้นคุณยังต้องทดสอบความเครียดทุกเวอร์ชันที่คุณใช้ก่อนที่จะเชื่อถือ API จริงๆ ): https : //github.com/jezhumble/javasysmon

JavaDoc: http://jezhumble.github.io/javasysmon/ค้นหาคลาสcom.jezhumble.javasysmon.OsProcessเธอจะทำเคล็ดลับ หวังว่ามันจะช่วยโชคดี


1
 ps -eaf | grep [j]ava

จะดีกว่าเนื่องจากจะแสดงให้คุณเห็นเฉพาะกระบวนการที่ใช้งานอยู่ซึ่งไม่รวมคำสั่งนี้ที่มีสตริง java ด้วยซึ่ง[]เป็นเคล็ดลับ


ควรเป็น ps -eaf | grep Java not [j] ava
vaquar khan

@vaquarkhan เพื่อนเพียงแค่พยายามเรียกใช้ทั้งของคุณและคำแนะนำของฉันและดูว่าอะไรคือความแตกต่างพวกเขาทั้งสองจะได้ผล
Ilya Gazman

ทั้งสองให้ผลลัพธ์เหมือนกันอย่างไรก็ตาม [j] ava สับสน
vaquar khan


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.