ฆ่ากระบวนการ Java


25

ฉันกำลังทำงานกับรหัสหนักที่คำนวณได้ซึ่งตอนนี้ล่มมาก แต่ฉันยังคงทำงานอยู่ :) เมื่อเกิดปัญหาฉันไม่สามารถปิดหน้าต่าง GUI ได้ ฉันต้องเปิดเปลือกและฆ่ากระบวนการ -9

มันเป็นกระบวนการของจาวาและหาง่าย:

nkint@zefiro:~$ ps aux | grep java
nkint   2705 16.6  1.0 460928 43680 ?        Sl   12:23   0:08 /usr/lib/jvm/java-6-sun-1.6.0.26/bin/java -Djava.library.path=something something
nkint   2809  0.0  0.0   4012   776 pts/0    S+   12:24   0:00 grep --color=auto java
nkint@zefiro:~$ kill -9 2705

ตอนนี้มันง่าย แต่ค่อนข้างเป็นงานเชิงกล ปกติแล้วฉันรอประมาณ 7-8 โพรเซสที่จะพังแล้วkill -9แต่ละอัน

ฉันต้องการทำสิ่งนี้แบบอัตโนมัติ ฉันคิดว่ามันน่าจะง่ายกว่าที่จะไพพ์คำสั่งบางอย่างเพื่อรับไอดีของผลลัพธ์ (n-1) ps aux | grep javaและฆ่ามัน แต่ฉันไม่รู้ว่าจะเริ่มจากตรงไหน

ใครช่วยบอกคำแนะนำกับฉันได้บ้าง

คำตอบ:


22

อีกไม่กี่ท่อจะพาคุณไปทุกที่ที่คุณต้องการ นี่คือวิธีที่ฉันจะทำ:

search_terms='whatever will help find the specific process' 

kill $(ps aux | grep "$search_terms" | grep -v 'grep' | awk '{print $2}')

นี่คือสิ่งที่เกิดขึ้น:

grep -v 'grep' แยกกระบวนการ grep ออกจากผลลัพธ์

awk '{print $2}' พิมพ์เฉพาะคอลัมน์ที่ 2 ของเอาต์พุต (ในกรณีนี้คือ PID)

$(...)เป็นการทดแทนคำสั่ง โดยพื้นฐานแล้วผลลัพธ์จากคำสั่งด้านในจะถูกใช้เป็นอาร์กิวเมนต์kill

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


49

หากคุณต้องการฆ่ากระบวนการทั้งหมดที่มีชื่อjavaคุณสามารถใช้คำสั่งต่อไปนี้:

killall -9 java

คำสั่งนี้ส่งสัญญาณไปยังกระบวนการที่ระบุโดยชื่อของพวกเขา


killall javaไม่ทำงานสำหรับฉันด้วยเหตุผลสุ่ม ๆ ที่ฉันไม่สามารถแก้ไขได้ -9พารามิเตอร์เอาดูแลว่า ขอขอบคุณ.
พอลเนลสันเบเกอร์

5
9 คือ SIGKILL โปรแกรมไม่สามารถเพิกเฉยได้และมันก็บอกว่าโดยทั่วไป: ยุติตัวเองตอนนี้
Milan Todorovic

ผู้ใช้ IntelliJ อาจพบว่า IDE ของพวกเขาล้มเหลวไม่ต้องพูดถึง Tomcat และแอพอื่น ๆ อีกมากมาย นี้เป็นวิธีที่แรงเดรัจฉานและไม่แนะนำให้ใช้ในระบบใด ๆ javaกับบริการหรือแอพพลิเคผลผลิตอาศัย
tresf

3

เปิดโปรแกรมแก้ไขข้อความและบันทึกสคริปต์ทุบตีสั้น ๆ นี้ในโฮมไดเร็กตอรี่ของคุณเป็น 'killjava'

#! /bin/bash

# Kill Java process

# Determine the pid
PID=`ps -C java -o pid=`

kill -9 $PID

จากนั้นchmod u+x ~/killjavaในเทอร์มินัลเพื่อให้คุณสามารถเรียกใช้ไฟล์

จากนั้นคุณสามารถโทร~/killjavaจากเทอร์มินัลและกระบวนการ Java ของคุณจะเป็นหินตาย คุณอาจต้องการพิจารณาว่าทรัพยากรอื่นใดที่คุณฆ่ากระบวนการ Java ด้วยวิธีนี้ (เช่นการเชื่อมต่อฐานข้อมูล) จะได้รับผลกระทบ ยกตัวอย่างเช่นอาจkill -15จะมีความเหมาะสมมากขึ้น - ดูคำอธิบายที่นี่


2

นี่คือวิธีการทางเลือกโดยอิงจากคำตอบก่อนหน้าของ @ Dean

สิ่งนี้ใช้jpsเพื่อระบุกระบวนการ java

kill $(jps | grep <MainClass> | awk '{print $1}')

MainClass เป็นคลาสในโปรแกรมจาวาที่กำลังรันซึ่งมีเมธอดหลัก

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