web-dev-qa-db-fra.com

Tuer Java processus

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

C'est un processus Java et il est facile à 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 que 7 à 8 processus se bloquent, puis kill -9 chacun d'eux.

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

Quelqu'un peut-il me donner des indices?

23
nkint

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 une substitution de commande. Fondamentalement, le résultat de la commande interne sera utilisé comme argument pour kill

Ceci a l'avantage d'un contrôle plus fin sur ce qui est tué. Par exemple, si vous êtes sur un système partagé, vous pouvez modifier les termes de la recherche pour qu'il tente uniquement de tuer vos propres processus Java.

21
Dean

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

killall -9 Java

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

45
Milan Todorovic

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

#! /bin/bash

# Kill Java process

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

kill -9 $PID

Puis chmod u+x ~/killjava dans un terminal afin que vous puissiez exécuter le fichier.

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

3
Clive van Hilten

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

Ceci utilise jps pour identifier le processus Java.

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

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

2
Pawan