web-dev-qa-db-fra.com

Tuez un seul Java

Je lance généralement quelques Java, une pour le serveur fonctionnant localement et une autre pour certaines IDE comme NetBeans. Et de temps en temps, après de nombreux redéploiements, mon le serveur est bloqué sur OutOfMemoryException donc je dois tuer le processus Java afin de redémarrer.

Moi aussi pkill -9 Java mais cela tue aussi mon fonctionnement IDE que je ne veux pas. Alors, comment puis-je tuer uniquement les applications liées au serveur en cours d'exécution et pas les autres? Je suppose qu'elles fonctionnent toutes dans le même processus, mais il doit y avoir un moyen de les distinguer.

17
Petr Mensik

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 Java process run

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 voulez tuer et exécuter

kill -9 PID
26
P4cK3tHuNt3R

OMI, la meilleure solution est:

pkill -9 -f <nameOfYourJavaAplication>
11
Marek R

Au lieu d'utiliser ps et grep, vous pouvez utiliser ps's -C flag pour sélectionner toutes les commandes répertoriées sous le nom 'Java'. Vous pouvez également utiliser ps's -f flag 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 complète: ps -fC Java.

Vous pouvez également utiliser pgrep pour répertorier tous les processus Java. pgrep -a Java renverra 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 kill avec le -9 (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'), il est donc souvent nécessaire de lui envoyer le signal 'SIGKILL', qui oblige init à tuer le programme sans l'avertir au préalable.

Par exemple, si ps -fC Java Retour

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 Java Retour

9014 Java IDE
11775 Java TestProgram

et vous souhaitez tuer Java TestProgram, vous devez exécuter kill -9 11775.

8
user26112

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 Java chose que vous avez exécutée), alors:

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

De https://unix.stackexchange.com/a/31111/249209

1
Nikhil VJ

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

Remplace le <PROCESS_NAME> séparer avec quoi que ce soit Java est en cours d'exécution.

#!/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 que 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 le kill ... assurez-vous que le $process la variable est définie comme prévu. Le ps -ef peut différer entre Unices donc awk peut avoir besoin 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.

Important également: notez les guillemets simples pour le script awk. 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 }'`
0
Alexis Wilke

jps et jcmd sont des outils spécialisés pour afficher uniquement Java traite les informations et les PID.

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

0
Muhammad Gelbana