วิธีฆ่ากระบวนการทั้งหมดนอกเหนือจากกระบวนการเฉพาะ


13

บนเซิร์ฟเวอร์ภายในของฉันกระบวนการ java จำนวนมากกำลังทำงานอยู่และในเวลาเดียวกันฉันกำลังใช้ Eclipse ตอนนี้เมื่อฉันต้องรีสตาร์ทกระบวนการของฉัน (ฉันเริ่มต้นกระบวนการผ่านเชลล์สคริปต์) ก่อนทุกครั้งที่ฉันต้องฆ่ากระบวนการเก่าผ่าน:

วิธีที่ 1: - kill -9 $Pid (สำหรับแต่ละกระบวนการหนึ่งโดยหนึ่งซึ่งใช้เวลานาน)

วิธีที่ 2: - killall -9 java(สำหรับกระบวนการทั้งหมด - ง่าย แต่ Eclipse จะถูกฆ่าโดยไม่จำเป็นเกินไป)

ในกรณีของวิธีที่ 2 Eclipse จะถูกฆ่าซึ่งฉันไม่ต้องการ มีวิธีใดบ้างจากสิ่งนี้? ฉันพนันได้เลยว่าจะต้อง: P

แก้ไข: ฉันใช้ Ubuntu 15.04


คุณใช้ openjdk อยู่หรือเปล่า?
Maythux

ไม่เป็นjava-7-oracle
Atiq

ตรวจสอบคำตอบของฉัน
Maythux

คำตอบ:


17

ลองคำสั่งนี้:

ps ax | grep "java" | egrep -v "eclipse" | cut -b1-06 | xargs -t kill

สิ่งนี้จะค้นหาโพรเซสทั้งหมดที่มีจาวาและเอ็กซีคิวชัน eclipse จากนั้นก็ฆ่ามัน


3
++ 1 สำหรับการไม่ใช้-9อย่างไม่เจาะจง คุณควรเปิดโอกาสให้กระบวนการออกไปอย่างสง่างาม
Rmano

pgrepดีกว่าps | grepอย่างอื่นที่คุณเสี่ยงต่อการฆ่าคำสั่ง grep เอง
abligh

2
@abligh เกิดปัญหากับpgrepคุณจะไม่สามารถที่จะแยกแยะกระบวนการที่กำลังทำงานคราสเพราะแม้เพียงจะรายงานpgrep -l java@ Maythux สำหรับการอ้างอิงเท่านั้นegrepเลิกใช้แล้วและไม่ควรใช้เนื่องจากgrep -Eทำแบบเดียวกันทุกประการแม้ว่าคุณจะไม่จำเป็นต้องใช้grep -Eเพราะคุณกำลังจับคู่สตริงคงที่ ดังนั้นเพียงแค่grep -v "eclipse"(หรือถ้าคุณต้องการที่จะเป็นแฟนซี[...] | grep -F "java" | grep -vF "eclipse | [...]")
คอส

@kos: ยังไม่ทดลอง:pkill '/java\(.*eclipse\)\@!'
abligh

@abligh อะไร\@!? หากนั่นคือ Perl-ism มันจะไม่ทำงานเพราะpkillรองรับเฉพาะ EREs ฉันได้พยายามลดงานทั้งหมดนี้เป็นคำสั่งเดียวที่ใช้pkillกับ lookaheads เชิงลบแล้วและล้มเหลวด้วยเหตุผลนี้
kos

12

การใช้ awk

ps ax | awk '/java/ && !/eclipse/ {system("kill "$1)}'

คำสั่งฆ่าทุกjavaกระบวนการ eclipseแต่ไม่กระบวนการ


3
สง่างามยิ่งขึ้น (และเร็วกว่า) จากนั้นคำตอบจาก @maythux IMHO ... ;-)
Fabby

ฉันเห็นด้วยกับ Fabby ดี!
kos

1

เกี่ยวกับ :

pgrep -af 'java' | grep -Po '^[^ ]+(?!.*eclipse)' | xargs kill
  • pgrep -af 'java'ค้นหาjavaในบรรทัดคำสั่งแบบเต็มของกระบวนการและรายการพวกเขา

  • grep -Po '^[^ ]+(?!.*eclipse)'ดูระหว่างกระบวนการค้นหาและรับ ID กระบวนการของกระบวนการที่ไม่มีeclipseในบรรทัดคำสั่งแบบเต็ม

  • xargs kill จะฆ่ากระบวนการ


+1 สำหรับคำตอบสั้น ๆ และสง่างาม โปรดทราบว่าอาจเป็นไปได้ที่จะมีpkillโซลูชันที่มีประสิทธิภาพยิ่งขึ้น (เพียงคำสั่งเดียวpgrep/pkill:) หากสนับสนุน perl regex'es ที่คุณใช้ในขั้นตอนที่ 2 ข้างต้น น่าเสียดายpgrep/ pkillสนับสนุนเพียงส่วนขยายที่เพิ่ม (เช่นegrep/grep -E)
arielf

@arielf คุณได้อย่าง right..it จะได้รับที่มีประสิทธิภาพมากที่สุดถ้าpgrep/ pkillสนับสนุน PCRE ..
heemayl

0

jps -m | grep -v eclipse | awk '{print $1}' | xargs -t kill

ใช้ jps เพื่อให้แน่ใจว่าคุณกำลังมองหาเพียงคำสั่ง java และไม่ใช่คำสั่งทั้งหมดที่มี java ในเส้นทางของพวกเขา


0
ps ax | grep "java" | egrep -v "eclipse" | cut -b1-06 | xargs -t kill

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