Comment tuer tous les processus sauf un spécifique

13

Sur mon serveur local, de nombreux processus java sont en cours d'exécution et j'utilise en même temps Eclipse. Maintenant, lorsque je dois redémarrer mes processus (je démarre les processus via un script shell), avant chaque démarrage, je dois tuer les anciens processus via:

Méthode 1: - kill -9 $Pid (pour chaque processus un par un, ce qui prend du temps)

Méthode 2: - killall -9 java(pour tous les processus - facile, mais Eclipse sera tué trop inutilement)

Dans le cas de la méthode 2, Eclipse sera également tué, ce que je ne veux jamais. Y a-t-il un moyen de s'en sortir? Je parie qu'il doit y avoir: P

Edit: j'utilise ubuntu 15.04.

Atiq
la source
utilisez-vous openjdk?
mai 2015
non c'est java-7-oracle
Atiq
vérifier ma réponse
Maythux

Réponses:

17

Essayez cette commande:

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

cela va rechercher tous les processus contenant java et éclipse exclu puis les tuer

Maythux
la source
3
++ 1 pour ne pas utiliser -9sans discernement. Vous devez toujours donner à un processus la possibilité de se terminer avec élégance.
Rmano
pgrepest mieux que ps | grepsinon vous risquez de tuer la déclaration grep elle-même.
abligh
2
@abligh Le problème est que pgrepvous n'êtes pas en mesure de distinguer les processus qui exécutent eclipse, car même pgrep -lne fera que signaler java. @ Maythux, juste pour référence, egrepest obsolète et ne devrait pas être utilisé, car il grep -Efait exactement la même chose, bien que vous n'en ayez même pas besoin grep -Ecar vous faites correspondre une chaîne fixe; si juste grep -v "eclipse"(ou si vous voulez être chic [...] | grep -F "java" | grep -vF "eclipse | [...]")
kos
@kos: non testé:pkill '/java\(.*eclipse\)\@!'
abligh
@abligh Quoi \@!? Si c'est un Perl-ism, cela ne fonctionnera pas, car il pkillne prend en charge que les ERE, j'ai essayé de réduire toute cette tâche à une seule commande déjà utilisée pkillavec des références négatives et qui a échoué pour cette raison.
kos
12

En utilisant awk

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

La commande tue tous les javaprocessus, mais pas le processus eclipse.

UN B
la source
3
Plus élégant (et plus rapide) que la réponse de @maythux IMHO ... ;-)
Fabby
Je suis d'accord avec Fabby, sympa!
kos
1

Que diriez-vous :

pgrep -af 'java' | grep -Po '^[^ ]+(?!.*eclipse)' | xargs kill
  • pgrep -af 'java'recherche javadans la ligne de commande complète des processus et les répertorie

  • grep -Po '^[^ ]+(?!.*eclipse)'regarde parmi les processus recherchés et obtient les ID de processus des processus qui n'ont pas eclipsedans leurs lignes de commande complètes

  • xargs kill va tuer les processus.

heemayl
la source
+1 pour une solution courte et élégante. Notez qu'il aurait été possible d'avoir une solution encore plus efficace (une seule commande :) pkillsi elle pgrep/pkillsupportait les regex de perl que vous utilisez dans la 2ème étape ci-dessus. Malheureusement pgrep/ pkillne supporte que les regexps étendues (comme egrep/grep -E).
arielf
@arielf Vous avez absolument raison..il aurait été plus efficace si pgrep/ pkillsupporte PCRE ..
heemayl
0

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

Utilisez jps pour vous assurer que vous recherchez uniquement les commandes java et pas toutes les commandes qui ont java sur leur chemin.

Chetan Narsude
la source
0
ps ax | grep "java" | egrep -v "eclipse" | cut -b1-06 | xargs -t kill
Ankur Kumar
la source
1
Il aurait été plus agréable d'expliquer les commandes, plutôt que de simplement donner une chaîne de commande cryptique. Aussi, qu'en est-il de ma commande de longue date "orkjavagoob.sh"
waltinator