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.
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
OMI, la meilleure solution est:
pkill -9 -f <nameOfYourJavaAplication>
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
.
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
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 }'`
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.