Tuer les processus Java

26

Je travaille sur un code de calcul lourd qui - pour l'instant - plante beaucoup, mais je travaille toujours dessus :) Quand il plante, je ne peux pas fermer la fenêtre GUI; Je dois ouvrir un shell et tuer -9 le processus.

Il s'agit d'un processus Java et il est facile de trouver:

nkint@zefiro:~$ ps aux | grep java
nkint   2705 16.6  1.0 460928 43680 ?        Sl   12:23   0:08 /usr/lib/jvm/java-6-sun-1.6.0.26/bin/java -Djava.library.path=something something
nkint   2809  0.0  0.0   4012   776 pts/0    S+   12:24   0:00 grep --color=auto java
nkint@zefiro:~$ kill -9 2705

Maintenant, c'est une tâche facile mais assez mécanique. Donc normalement j'attends environ 7-8 processus de planter, puis kill -9chacun d'eux.

Je veux le faire de manière automatique. Je pense qu'il devrait être facile de diriger certaines commandes pour prendre l'id des résultats (n-1) ps aux | grep javaet le tuer, mais je n'ai aucune idée par où commencer.

Quelqu'un peut-il me donner des indices?

nkint
la source

Réponses:

23

Quelques tuyaux supplémentaires vous mèneront là où vous voulez être. Voici comment je le ferais:

search_terms='whatever will help find the specific process' 

kill $(ps aux | grep "$search_terms" | grep -v 'grep' | awk '{print $2}')

Voici ce qui se passe:

grep -v 'grep' exclut le processus grep des résultats.

awk '{print $2}' imprime uniquement la 2ème colonne de la sortie (dans ce cas le PID)

$(...)est la substitution de commande. Fondamentalement, le résultat de la commande interne sera utilisé comme argument pourkill

Cela a l'avantage de mieux contrôler ce qui est tué. Par exemple, si vous êtes sur un système partagé, vous pouvez modifier les termes de recherche afin qu'il ne tente que de tuer vos propres processus java.

doyen
la source
50

Si vous voulez tuer tous les processus qui sont nommés, javavous pouvez utiliser la commande suivante:

killall -9 java

Cette commande envoie des signaux aux processus identifiés par leur nom.

Milan Todorovic
la source
killall javane fonctionnait pas pour moi pour une raison aléatoire que je ne pouvais pas résoudre. Le -9paramètre s'est occupé de cela. Merci.
Paul Nelson Baker,
5
9 est SIGKILL. Le programme ne peut pas l'ignorer, et il dit essentiellement: arrêtez-vous maintenant.
Milan Todorovic
Les utilisateurs d'IntelliJ peuvent trouver que leur IDE est tombé en panne, sans parler de Tomcat et de nombreuses autres applications. Il s'agit d'une méthode de force brute et déconseillée sur tout système sur lequel des services ou des applications de productivité reposent java.
tresf
3

Ouvrez un éditeur de texte et enregistrez ce court script bash dans votre répertoire personnel sous le nom de 'killjava'

#! /bin/bash

# Kill Java process

# Determine the pid
PID=`ps -C java -o pid=`

kill -9 $PID

Puis chmod u+x ~/killjavadans un terminal pour pouvoir exécuter le fichier.

Ensuite, vous pouvez simplement appeler à ~/killjavapartir d'un terminal et votre processus Java sera mort. Vous voudrez peut-être considérer quelles autres ressources votre destruction du processus Java de cette manière (comme les connexions à la base de données) sera affectée. Par exemple, ce kill -15serait peut -être plus approprié - voir l'explication ici .

Clive van Hilten
la source
2

Voici une approche alternative, basée sur la réponse précédente de @ Dean.

Cela utilise jps pour identifier le processus java.

kill $(jps | grep <MainClass> | awk '{print $1}')

MainClass est une classe de votre programme java en cours d'exécution qui contient la méthode principale.

Pawan
la source