2010-01-25 8 views
11

Y at-il un moyen d'arrêter un programme java en cours d'exécution en utilisant un script shell en connaissant le nom alone.I je utilise shell kshShell script pour arrêter un programme java

+1

Savoir quel nom? Si vous connaissez le nom de l'exécutable (qui est normalement 'java'),' killall' est votre ami. – sfussenegger

+0

@sfussenegger: Probablement, il ne veut pas tuer tous les processus Java, mais seulement un spécifique. – Mnementh

+0

@Mnementh c'est ce que j'attendrais aussi, mais d'après les informations données c'est la meilleure chose que je pourrais recommander. – sfussenegger

Répondre

6

Ajoutez une propriété unique à la machine virtuelle Java pour l'identifier facilement, par ex. pour Test.class

java -Duniquename=1 test 

pour le tuer:

ps ax | grep uniquename | grep -v grep | awk '{print $1}' | xargs kill 
+0

Son erreur de lancement.J'utilise ksh shell – Harish

+0

quelle erreur obtenez-vous? –

+0

Cela fonctionne bien sous KSH. Peut-être que vous avez fait une erreur en copiant la commande. – diciu

1

Vous pouvez utiliser pkill:

pkill your_java_program_name 

Cela fonctionnerait si vous exécutez seulement une instance de votre programme est en cours d'exécution.

3

Vous pouvez utiliser jps identifiant l'ID de processus associé au nom du programme Java démarré (jps est un gestionnaire de processus pour les programmes Java). Avec cet identifiant, vous pouvez tuer le processus normalement.

+0

en supposant que mon nom de fichier java est test.java et est en cours d'exécution comment le trouver? – Harish

+0

+1 pour m'avoir présenté à jps :) – sfussenegger

+0

@Harish: Après l'avoir compilé et exécuté, il sera affiché comme 'test'. Si vous l'empaquetez dans un fichier jar exécutable (test.jar) et exécutez via java -jar test.jar, jps affiche 'test.jar'. – Mnementh

20

suivi Mnementh' suggestion:

cela devrait faire le travail

jps -l | grep org.example.MyMain | cut -d ' ' -f 1 | xargs -rn1 kill 
  • jps -l: liste java pro cess avec "nom du package complet pour la classe principale de l'application ou le nom du chemin d'accès complet au fichier JAR de l'application".

  • grep: choisissez le processus que vous aimez

  • cut -d -' ' -f 1: diviser la sortie dans les colonnes à l'aide delimiter '' et imprimer uniquement la première (le pid)

  • xargs -rn1 kill: exécuter kill pour chaque PID (le cas échéant)

Notez que vous devez exécuter JPS et xargs avec le même utilisateur (ou root) que vous utilisez le processus

+1

+1 pour chaque' wow 'que j'ai dit sur chaque ligne.:) – Nishant

+1

Cela fonctionnera également pour les machines Windows, mais vous aurez besoin de faire une détection de l'environnement pour déterminer quel 'kill' utiliser. –

+0

@Odelya Je viens d'ajouter '-r' (' --no-run-if-empty') à 'xargs' pour éviter cette erreur. – sfussenegger

1

vous pouvez utiliser l'option -o de ps pour formater votre sortie,

ps -eo cmd,pid | awk '!/awk/&&/mycommand/{cmd="kill -9 "$2;system(cmd)}' 
Questions connexes