Bagaimana cara membunuh semua proses selain yang spesifik

13

Di server lokal saya, banyak proses java sedang berjalan, dan pada saat yang sama saya menggunakan Eclipse. Sekarang ketika saya perlu me-restart proses saya (saya memulai proses melalui skrip shell), sebelum setiap awal saya harus mematikan proses lama melalui:

Metode 1: - kill -9 $Pid (untuk setiap proses satu per satu, yang memakan waktu)

Metode 2: - killall -9 java(untuk semua proses - mudah, tetapi Eclipse akan terbunuh terlalu tidak perlu)

Dalam kasus Metode 2 Eclipse juga akan dibunuh, yang tidak pernah saya inginkan. Apakah ada jalan keluar dari ini? Saya yakin pasti ada: P

Sunting: Saya menggunakan ubuntu 15.04.

Atiq
sumber
apakah Anda menggunakan openjdk?
Maythux
tidak itu java-7-oracle
Atiq
periksa jawaban saya
Maythux

Jawaban:

17

Cobalah perintah ini:

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

ini akan mencari semua proses yang mengandung java dan mengeksekusi gerhana kemudian membunuh mereka

Maythux
sumber
3
++ 1 untuk tidak menggunakan -9tanpa pandang bulu. Anda harus memberikan proses kesempatan untuk keluar dengan anggun.
Rmano
pgreplebih baik daripada ps | grepkarena Anda berisiko membunuh pernyataan grep itu sendiri.
Abligh
2
@abligh Masalahnya adalah pgrepAnda tidak dapat membedakan proses mana yang menjalankan gerhana, karena bahkan pgrep -lhanya akan melaporkan java. @ Maythux, hanya untuk referensi, egrepsudah usang dan tidak boleh digunakan, karena grep -Emelakukan hal yang persis sama, meskipun Anda bahkan tidak perlu grep -Ekarena Anda mencocokkan string tetap; jadi hanya grep -v "eclipse"(atau jika Anda ingin menjadi mewah [...] | grep -F "java" | grep -vF "eclipse | [...]")
kos
@kos: belum diuji:pkill '/java\(.*eclipse\)\@!'
abligh
@abligh Apa \@!? Jika itu Perl-isme itu tidak akan berfungsi, karena pkillhanya mendukung EREs, saya sudah mencoba untuk mengurangi seluruh tugas ini menjadi satu perintah yang sudah digunakan pkilldengan lookaheads negatif dan itu gagal karena alasan ini.
kos
12

Menggunakan awk

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

Perintah membunuh semua javaproses, tetapi bukan proses eclipse.

AB
sumber
3
Lebih elegan (dan lebih cepat) maka jawaban dari @maythux IMHO ... ;-)
Fabby
Saya setuju dengan Fabby, bagus!
kos
1

Bagaimana tentang :

pgrep -af 'java' | grep -Po '^[^ ]+(?!.*eclipse)' | xargs kill
  • pgrep -af 'java'mencari javadi baris perintah penuh dari proses dan daftar mereka

  • grep -Po '^[^ ]+(?!.*eclipse)'terlihat di antara mencari proses dan mendapatkan ID proses dari proses yang tidak memiliki eclipsegaris-garis perintah penuh mereka

  • xargs kill akan membunuh prosesnya.

heemayl
sumber
+1 untuk solusi singkat dan elegan. Perhatikan bahwa akan mungkin untuk memiliki solusi yang bahkan lebih efisien (hanya satu perintah :) pkilljika pgrep/pkilldidukung perl regex'es yang Anda gunakan pada langkah ke-2 di atas. Sayangnya pgrep/ pkillhanya mendukung extended-regexps (seperti egrep/grep -E).
arielf
@ diri Anda benar sekali .. itu akan menjadi paling efisien jika pgrep/ pkillmendukung PCRE ..
heemayl
0

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

Gunakan jps untuk memastikan bahwa Anda mencari hanya perintah java dan tidak semua perintah yang memiliki java di jalurnya.

Chetan Narsude
sumber
0
ps ax | grep "java" | egrep -v "eclipse" | cut -b1-06 | xargs -t kill
Ankur Kumar
sumber
1
Akan lebih baik untuk menjelaskan perintah, daripada hanya memberikan string perintah samar. Juga, bagaimana dengan perintah saya yang sudah berjalan lama "orkjavagoob.sh"
waltinator