Belirli süreçler dışında tüm süreçler nasıl öldürülür?


13

Yerel sunucumda birçok java işlemi çalışıyor ve aynı zamanda Eclipse kullanıyorum. Şimdi süreçlerimi yeniden başlatmam gerektiğinde (bir kabuk betiği ile işlemlere başlıyorum), her başlamadan önce eski işlemleri öldürmem gerekiyor:

Yöntem 1: - kill -9 $Pid (her işlem için tek tek, zaman alıcıdır)

Yöntem 2: - killall -9 java(tüm işlemler için - kolay, ama tutulma gereksiz yere öldürülecek)

Yöntem 2 durumunda Tutulma da öldürülecek, ki bu asla istemem. Bundan kurtulmanın bir yolu var mı? Eminim olmalı: P

Düzenleme: Ubuntu 15.04 kullanıyorum.


openjdk kullanıyor musun?
Maythux

hayır bu java-7-oracle
Atiq

cevabımı kontrol et
Maythux

Yanıtlar:


17

Bu komutu deneyin:

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

bu, java içeren ve tutulmayı yürüten tüm işlemleri arayacak, sonra onları öldürecektir


3
++ 1 değil kullanılarak -9gelişigüzel. Bir sürece zarifçe çıkma şansı vermelisiniz.
Rmano

pgrepps | grepgrep ifadesinin kendisini öldürme riskinden daha iyidir .
abligh

2
@abligh Sorun şu pgrepki, hangi işlemlerin tutulma çalıştığını ayırt edemiyorsunuz, çünkü pgrep -lsadece raporlayacak java. @ Maythux, sadece referans olarak, egrepkullanımdan kaldırılmıştır ve kullanılmamalıdır, çünkü grep -Etam olarak aynıdır, ancak grep -Esabit bir dizeyi eşleştirdiğiniz için bile ihtiyacınız yoktur ; yani sadece grep -v "eclipse"(ya da süslü olmak istiyorsanız [...] | grep -F "java" | grep -vF "eclipse | [...]")
kos

@kos: untested:pkill '/java\(.*eclipse\)\@!'
abligh

@abligh Nedir \@!? Bu bir Perl-ism ise işe yaramayacak, çünkü pkillsadece ERE'leri destekliyor, bu görevin tamamını zaten pkillnegatif gözlerle birlikte kullanılan tek bir komuta indirmeye çalıştım ve bu nedenle başarısız oldu.
kos

12

kullanma awk

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

Komut tüm javaişlemleri öldürür , ancak işlemi öldürmez eclipse.


3
Daha şık (ve daha hızlı) o zaman @maythux IMHO'dan gelen cevap ... ;-)
Fabby

Fabby'ye katılıyorum, güzel!
kos

1

Nasıl olur:

pgrep -af 'java' | grep -Po '^[^ ]+(?!.*eclipse)' | xargs kill
  • pgrep -af 'java'javasüreçlerin tam komut satırında arar ve listeler

  • grep -Po '^[^ ]+(?!.*eclipse)'aranan süreçleri arar eclipseve tam komut satırlarında olmayan süreçlerin süreç kimliklerini alır

  • xargs kill süreçleri öldürecek.


Kısa ve zarif bir çözüm için +1. Yukarıdaki 2. adımda kullandığınız perl regex'leri destekleniyorsa, daha da verimli (sadece bir komut :) pkillçözümün pgrep/pkillmümkün olabileceğini unutmayın. Ne yazık ki pgrep/ pkillyalnızca genişletilmiş normal ifadeleri (gibi egrep/grep -E) destekleyin.
arielf

@arielf Kesinlikle right..it eğer en verimli olurdu edilir pgrep/ pkilldestekler PCRE ..
heemayl

0

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

Yollarında java olan tüm komutları değil, yalnızca java komutlarını aradığınızdan emin olmak için jps kullanın.


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

1
Sadece şifreli bir komut dizesi vermek yerine, komutları açıklamak daha güzel olurdu. Ayrıca, benim uzun süredir devam eden komutum "orkjavagoob.sh" hakkında
waltinator
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.