ฉันจะแสดงรายการกระบวนการ Java ทั้งหมดใน bash ได้อย่างไร ฉันต้องการบรรทัดคำสั่ง ฉันรู้ว่ามีคำสั่งps
แต่ฉันไม่รู้ว่าต้องใช้พารามิเตอร์อะไร
ps
แล้วความพยายามครั้งแรกman ps
, info ps
และเรียนรู้เกี่ยวกับเรื่องนี้ในอินเทอร์เน็ต
ฉันจะแสดงรายการกระบวนการ Java ทั้งหมดใน bash ได้อย่างไร ฉันต้องการบรรทัดคำสั่ง ฉันรู้ว่ามีคำสั่งps
แต่ฉันไม่รู้ว่าต้องใช้พารามิเตอร์อะไร
ps
แล้วความพยายามครั้งแรกman ps
, info ps
และเรียนรู้เกี่ยวกับเรื่องนี้ในอินเทอร์เน็ต
คำตอบ:
ลอง:
ps aux | grep java
และดูว่าคุณก้าวไปอย่างไร
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
jps -lV
มีประโยชน์มากที่สุด พิมพ์เฉพาะ pid และชื่อคลาสหลักที่ผ่านการรับรอง:
2472 com.intellij.idea.Main
11111 sun.tools.jps.Jps
9030 play.server.Server
2752 org.jetbrains.idea.maven.server.RemoteMavenServer
คุณสามารถใช้pgrepคำสั่งเดียวได้เช่นกัน (ไม่ต้องการให้คุณใช้ไปป์และหลายคำสั่ง):
pgrep -fl java
เริ่มต้นจาก Java 7วิธีที่ง่ายที่สุดและมีแนวโน้มที่จะเกิดข้อผิดพลาดน้อยที่สุดคือเพียงใช้คำสั่งjcmd
ที่เป็นส่วนหนึ่งของ JDKเพื่อให้มันทำงานในลักษณะเดียวกันกับทุกระบบปฏิบัติการ
ตัวอย่าง:
> jcmd
5485 sun.tools.jcmd.JCmd
2125 MyProgram
jcmd
อนุญาตให้ส่งคำขอคำสั่งวินิจฉัยไปยัง Java Virtual Machine (JVM) ที่รันอยู่
รายละเอียดเพิ่มเติมเกี่ยวกับวิธีการใช้jcmd
jps
สำหรับรูปแบบผลลัพธ์ที่ดีขึ้นให้ตรวจสอบคำสั่งนี้:
ps -fC java
สิ่งนี้จะส่งคืนกระบวนการ java ที่รันอยู่ทั้งหมดในสภาพแวดล้อม linux จากนั้นคุณสามารถฆ่ากระบวนการโดยใช้รหัสกระบวนการ
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
พินัยกรรมข้างต้น
(btw ตัวอย่างนี้ไม่ใช่ตัวอย่างที่ได้ผล แต่จำง่าย);)
คุณสามารถไปป์ข้างบนไปยังคำสั่งอื่นได้เช่น:
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" จะขยายอักขระสูงสุดของ colum ดังนั้นจึงเป็นไปได้ที่จะ grep FQN ของคลาสที่เกี่ยวข้อง
$ top
เพียงแค่ให้ "java" เป็นคำสั่งซึ่งไม่ได้มีประโยชน์อะไรเลยเมื่อพยายามคิดว่ากระบวนการใดที่ใช้ cpu $ ps ww -fC java
ให้ชิ้นส่วนปริศนาที่ขาดหายไป
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
แต่ต้องมีการแยกวิเคราะห์เพื่อให้อ่านง่ายขึ้น
มีหลายวิธีในการทำเช่นนี้ คุณสามารถใช้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
เธอจะทำเคล็ดลับ หวังว่ามันจะช่วยโชคดี
ps -eaf | grep [j]ava
จะดีกว่าเนื่องจากจะแสดงให้คุณเห็นเฉพาะกระบวนการที่ใช้งานอยู่ซึ่งไม่รวมคำสั่งนี้ที่มีสตริง java ด้วยซึ่ง[]
เป็นเคล็ดลับ
ฉันใช้สิ่งนี้ (ใช้ได้ดีกับ Debian 8):
alias psj='ps --no-headers -ww -C java -o pid,user,start_time,command'
หากต้องการทราบรายการจาวาที่ทำงานบนเครื่อง linux ps -e | grep java