ฆ่ากระบวนการ Java เดียวเท่านั้น


17

ฉันมักจะใช้งานจาวาแอปพลิเคชั่นไม่กี่อันหนึ่งสำหรับเซิร์ฟเวอร์ที่ใช้งานในเครื่องและอื่น ๆ สำหรับ IDE บางตัวเช่น NetBeans และเป็นครั้งคราวหลังจากมีการปรับใช้มากมายเซิร์ฟเวอร์ของฉันติดอยู่ที่ OutOfMemoryException ดังนั้นฉันต้องฆ่ากระบวนการ Java เพื่อเริ่มต้นใหม่

ดังนั้นฉันจึงทำเช่นpkill -9 javaนี้ แต่ยังฆ่า IDE ที่รันอยู่ซึ่งฉันไม่ต้องการ ดังนั้นฉันจะฆ่าเฉพาะแอปพลิเคชันที่เชื่อมโยงกับเซิร์ฟเวอร์ที่ใช้งานและไม่ใช่แอปพลิเคชันอื่น ๆ ได้อย่างไรฉันคิดว่าพวกเขาทั้งหมดกำลังทำงานภายใต้กระบวนการเดียวกัน


2
ดูตารางกระบวนการของคุณ (ผ่านtopหรือps) และเลือกหนึ่งรายการที่ถูกต้องและฆ่ามันด้วย PID (kill -9 PID_number)
เร่ง

โอ้ใช่ฉันเห็นได้แล้วตอนนี้ PIDดังนั้นผมก็ต้องฆ่ากระบวนการที่มีสิทธิ ขอบคุณมาก
Petr Mensik

ฉันต้องทำให้มันเป็นแบบอัตโนมัติ จะรับ PID สำหรับโปรแกรมนั้นได้อย่างไร
Nikhil VJ

คำตอบ:


23

สำหรับการฆ่ากระบวนการที่เชื่อมโยงกับหลายกระบวนการคุณต้องฆ่ากระบวนการนั้นโดยใช้รหัสกระบวนการที่เชื่อมโยงกับกระบวนการนั้น

ในการรับรหัสกระบวนการของกระบวนการ Java นั้นให้เรียกใช้

ps -A |grep java

เอาท์พุทของคำสั่งนี้จะให้รายการของกระบวนการ Java ที่ทำงานบนระบบของคุณ จดบันทึก Process ID (PID) ของกระบวนการที่คุณต้องการฆ่าและเรียกใช้

kill -9 PID

หากคุณต้องการฆ่ากระบวนการ java ทั้งหมดด้วยคำสั่งเดียวps ax | grep java | grep -v 'grep' | cut -d '?' -f1 | xargs kill -9
Andrii Karaivanskyi

11

IMO ทางออกที่ดีที่สุดคือ:

pkill -9 -f <nameOfYourJavaAplication>

สมบูรณ์ ฉันเคย ps -fC javaค้นหาnameOfYourJavaAplication(ใน-Dprogram.name)
cactuschibre

8

แทนการใช้psและgrepคุณสามารถใช้ps's -Cธงเพื่อเลือกคำสั่งทั้งหมดจดทะเบียนที่มีชื่อ 'Java' นอกจากนี้คุณยังอาจต้องการที่จะใช้ps's -fธงพิมพ์ชื่อคำสั่งเต็มรูปแบบของกระบวนการที่ระบุไว้ในแต่ละ ด้วยวิธีนี้คุณจะเห็นว่ากระบวนการ Java แต่ละกระบวนการกำลังทำอะไรอยู่ นี่คือคำสั่งเต็ม: ps -fC java.

คุณสามารถใช้pgrepเพื่อแสดงรายการกระบวนการ java ทั้งหมด pgrep -a javaจะส่งคืน PID และบรรทัดคำสั่งแบบเต็มของแต่ละกระบวนการของจาวา

เมื่อคุณมี PID ของคำสั่งที่คุณต้องการฆ่าใช้killด้วยการ-9ตั้งค่าสถานะ (SIGKILL) และ PID ของกระบวนการ java ที่คุณต้องการฆ่า Java ไม่หยุดเสมอเมื่อได้รับสัญญาณ 'SIGTERM' (กระบวนการได้รับอนุญาตให้จัดการ 'SIGTERM') ดังนั้นการส่งสัญญาณ 'SIGKILL' ซึ่งทำให้ init kill โปรแกรมโดยไม่มีการเตือนก่อนมักจำเป็น

ตัวอย่างเช่นถ้าps -fC javaส่งคืน

UID        PID  PPID  C STIME TTY          TIME CMD
jeff      9014  8890  0 08:51 pts/0    00:00:00 java IDE
jeff     11775  8890  6 08:59 pts/0    00:00:00 java TestProgram

หรือpsgrep -a javaผลตอบแทน

9014 java IDE
11775 java TestProgram

และคุณต้องการที่จะฆ่าคุณควรใช้java TestProgramkill -9 11775


1

หากคุณต้องการให้สคริปต์ค้นหาและฆ่าโปรแกรมที่กำลังทำงาน (โดยเฉพาะ) ของคุณโดยใช้รูปแบบจากบรรทัดคำสั่งของโปรแกรม (และไม่ใช่เฉพาะทุกสิ่งที่จาวารันอยู่) จากนั้น:

pgrep -f pattern # shows the PID
pkill -f pattern

จาก/unix//a/31111/249209


โปรดสังเกตว่าคำว่า "pkill" ได้ถูกกล่าวถึงแล้วในคำตอบของ Marek R เมื่อวันที่ 13 '13
Jeff Schaller

0

jpsและjcmdเป็นเครื่องมือที่เชี่ยวชาญในการแสดงเฉพาะข้อมูลกระบวนการ Java และ PID

คุณสามารถสำรวจตัวเลือกต่าง ๆ เพื่อดูผลลัพธ์ที่มีรายละเอียดมากขึ้น


รายการเหล่านั้นเท่านั้นเองในคอมพิวเตอร์ของฉัน
Alexis Wilke

จากนั้นคุณแน่ใจหรือไม่ว่ามีกระบวนการ Java อื่น ๆ กำลังทำงานอยู่!
Muhammad Gelbana

ใช่. ฉันให้คาสซานดราหรือ Elassadra ทำงานเมื่อทดสอบคำสั่งของคุณ
Alexis Wilke

0

นี่คือสคริปต์ที่สามารถใช้เพื่อทำให้กระบวนการเป็นอัตโนมัติ

แทนที่<PROCESS_NAME>ส่วนด้วยสิ่งที่ java กำลังดำเนินการ

#!/bin/sh
process=`ps -ef | grep -v awk | awk -e '/java.*<PROCESS_NAME>/ { print $2 }'`
kill ${process}

หมายเหตุ: -9ผมไม่ได้ใส่ ฉันไม่ควรต้องทำนอกจากว่าคุณจะจับสัญญาณและSIGTERM(ค่าเริ่มต้น) ล้มเหลว ฉันขอแนะนำให้คุณใช้ชื่อสัญญาณที่ทำให้อ่านง่ายขึ้น:

kill -TERM ${process}

คำเตือน

ก่อนดำเนินการkill ...ตรวจสอบให้แน่ใจว่า$processตัวแปรได้รับการตั้งค่าตามที่คาดไว้ ps -efแตกต่างกันอาจระหว่าง Unices ดังนั้นawkอาจต้องพิมพ์พารามิเตอร์ที่แตกต่างกัน

บันทึก

<PROCESS_NAME>อาจจะเปลี่ยนเป็นตัวแปร เพียงจำไว้ว่าถ้าคุณต้องพิมพ์มันบนบรรทัดคำสั่งของคุณทุกครั้งคุณมีแนวโน้มที่จะทำผิดพลาดเป็นครั้งคราว ฉันคิดว่ามันง่ายกว่าที่จะมีหลายสำเนาของสคริปต์ด้วยชื่อที่ถูกต้อง

สิ่งสำคัญ: สังเกตคำพูดเดียวสำหรับawkสคริปต์ นั่นหมายความว่าคุณต้องปิดและเปิดสตริงใหม่ด้วยตัวแปรที่อยู่ระหว่าง สิ่งนี้ควรใช้งานได้ (ยังไม่ทดลอง):

process=`ps -ef | grep -v awk | awk -e '/java.*'"${PROCESS_NAME}"'/ { print $2 }'`
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.