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?
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.
Si vous voulez tuer tous les processus nommés Java
name__, vous pouvez utiliser la commande suivante:
killall -9 Java
Cette commande envoie des signaux aux processus identifiés par leur nom.
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 .
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.