Tuez un seul processus Java

17

J'exécute généralement quelques applications Java, une pour le serveur fonctionnant localement et une autre pour certains IDE comme NetBeans. Et de temps en temps, après de nombreux redéploiements, mon serveur est bloqué sur OutOfMemoryException, j'ai donc besoin de tuer le processus Java pour redémarrer.

Donc je le fais, pkill -9 javamais cela tue également mon IDE en cours d'exécution, ce que je ne veux pas. Alors, comment puis-je tuer uniquement les applications liées au serveur en cours d'exécution et non les autres? Je suppose qu'elles s'exécutent toutes sous le même processus, mais il doit y avoir un moyen de les distinguer.

Petr Mensik
la source
2
regardez votre table de processus (via topou ps) et choisissez la bonne et tuez-la par PID (kill -9 PID_number).
précipiter le
Oh oui, je peux le voir maintenant. J'ai donc juste besoin de tuer le processus avec le droit PID. Merci beaucoup
Petr Mensik
Je dois automatiser cela. Comment obtenir le PID pour le programme particulier?
Nikhil VJ

Réponses:

23

Pour tuer un processus associé à plusieurs processus, vous devez le supprimer en utilisant l'ID de processus associé à ce processus.

Pour obtenir l'ID de processus de ce processus java, exécutez

ps -A |grep java

la sortie de cette commande donnera la liste des processus java exécutés sur votre système. Notez l'ID de processus (PID) de ce processus que vous souhaitez tuer et exécuter

kill -9 PID
P4cK3tHuNt3R
la source
Si vous voulez tuer TOUS les processus java par une seule commandeps ax | grep java | grep -v 'grep' | cut -d '?' -f1 | xargs kill -9
Andrii Karaivanskyi
11

OMI, la meilleure solution est:

pkill -9 -f <nameOfYourJavaAplication>
Marek R
la source
Parfait. J'avais l'habitude ps -fC javade trouver nameOfYourJavaAplication(en -Dprogram.name)
cactuschibre
8

Au lieu d'utiliser pset grep, vous pouvez utiliser psl' -Cindicateur 's pour sélectionner toutes les commandes répertoriées avec le nom' java '. Vous pouvez également utiliser psl' -findicateur de pour imprimer le nom de commande complet de chaque processus répertorié. De cette façon, vous pouvez voir ce que fait réellement chaque processus java. Voici la commande en entier: ps -fC java.

Vous pouvez également utiliser pgreppour répertorier tous les processus java. pgrep -a javarenverra le PID et la ligne de commande complète de chaque processus java.

Une fois que vous avez le PID de la commande que vous souhaitez tuer, utilisez-le killavec le -9drapeau (SIGKILL) et le PID du processus java que vous souhaitez tuer. Java ne s'arrête pas toujours lorsqu'il reçoit un signal 'SIGTERM' (les processus sont autorisés à gérer 'SIGTERM'), donc lui envoyer le signal 'SIGKILL', qui fait que init tue le programme sans l'avertir au préalable, est souvent nécessaire.

Par exemple, si ps -fC javarenvoie

UID        PID  PPID  C STIME TTY          TIME CMD
jeff      9014  8890  0 08:51 pts/0    00:00:00 java IDE
jeff     11775  8890  6 08:59 pts/0    00:00:00 java TestProgram

ou psgrep -a javaretourne

9014 java IDE
11775 java TestProgram

et tu veux tuer java TestProgram, tu devrais courir kill -9 11775.


la source
1

Si vous voulez qu'un script trouve et tue votre programme en cours d'exécution (spécifique) en utilisant un modèle de la ligne de commande du programme (et pas seulement chaque chose java que vous avez exécutée), alors:

pgrep -f pattern # shows the PID
pkill -f pattern

Depuis /unix//a/31111/249209

Nikhil VJ
la source
Notez que "pkill" était déjà mentionné dans la réponse de Marek R du 13 février 13
Jeff Schaller
0

jpset jcmdsont des outils spécialisés pour afficher uniquement les informations sur les processus Java et les PID.

Vous pouvez explorer leurs options pour une sortie plus détaillée.

Muhammad Gelbana
la source
Ceux-ci ne se listent que sur mon ordinateur.
Alexis Wilke
Alors, êtes-vous sûr qu'il existe d'autres processus Java en cours d'exécution?!
Muhammad Gelbana
Oui. J'ai fait exécuter Cassandra ou Elassadra lors du test de votre commande.
Alexis Wilke
0

Voici un script que l'on peut utiliser pour automatiser le processus.

Remplacez la <PROCESS_NAME>pièce par ce que java exécute.

#!/bin/sh
process=`ps -ef | grep -v awk | awk -e '/java.*<PROCESS_NAME>/ { print $2 }'`
kill ${process}

Remarque: je n'ai pas mis le -9. Je ne devrais pas être requis, sauf si vous capturez des signaux et SIGTERM(par défaut) échoue. Je vous suggère également d'utiliser le nom du signal, ce qui facilite la lecture:

kill -TERM ${process}

AVERTISSEMENT

Avant d'exécuter, kill ...assurez-vous que la $processvariable est définie comme prévu. Le ps -efpeut être différent entre Unices, il awkpeut donc être nécessaire d'imprimer un paramètre différent.

Remarque

Le <PROCESS_NAME>pourrait être changé en variable. N'oubliez pas que si vous devez le taper sur votre ligne de commande à chaque fois, vous risquez de faire des erreurs de temps en temps. Je trouve plus facile d'avoir plusieurs copies du script avec le nom correct.

Aussi important: notez les guillemets simples pour le awkscript. Cela signifie que vous devez fermer et rouvrir la chaîne avec la variable entre les deux. Quelque chose comme ça devrait fonctionner (non testé):

process=`ps -ef | grep -v awk | awk -e '/java.*'"${PROCESS_NAME}"'/ { print $2 }'`
Alexis Wilke
la source