web-dev-qa-db-fra.com

Comment puis-je définir le nom du processus pour un programme Java?

Si un programme Java est démarré, il obtient dans le processus système, surveillez le nom Java. De nombreux programmes Java sont difficiles à distinguer. Donc, ce serait bien, si un moyen existe, pour définir le nom, qui sera affiché dans le moniteur de processus. Je suis conscient que cela peut fonctionner différemment sur différents systèmes d'exploitation.

Un moyen simple serait, si l'interpréteur Java prend en charge un commutateur pour définir le nom, comme ceci:

Java -processname MyProgram -jar MyProgram

Mais je n'ai pas pu trouver un tel interrupteur, il est donc probablement inexistant. Une API en Java pour définir le nom du processus serait également très bien.

Alors, vous avez donc des suggestions?

59
Mnementh

Je ne sais pas si cela est possible, mais vous pouvez utiliser un outil de ligne de commande fourni avec le JDK appelé "jps". C'est comme * nix ps, mais juste Java programmes à la place. jps -v Affiche tous les arguments que vous avez passés à Java.

De plus, j'ai vu des gens attacher un "nom de processus" à leurs processus Java en ajoutant un -Dmyprocessname Inutilisé aux arguments.

47
omerkudat

comme l'a dit @omerkudat:

jps -v

affiche tous Java processus {processID, liste de paramètres} Si la liste de paramètres n'est pas suffisante pour reconnaître les applications dont vous avez besoin, essayez d'ajouter des paramètres factices lors de leur exécution:

Java -Dname=myApp -cp  myApp.jar some.client.main.MainFrame

Cela imprimera comme:

7780 MainFrame -Dname=myApp

et vous pouvez utiliser l'ID de processus pour le tuer/le surveiller.

20
d.raev

Vous pouvez le faire avec une cale LD_PRELOAD: https://github.com/airlift/procname

Le shim appelle simplement la prctl() spécifique à Linux lorsque le processus démarre:

static void __attribute__ ((constructor)) procname_init()
{
   prctl(PR_SET_NAME, "myname");
}

L'appel doit avoir lieu sur le thread principal, il n'est donc pas possible de le faire à partir de Java ou même avec un agent JVMTI, car ceux-ci se produisent sur un thread différent.

11
David Phillips

Lorsque j'ai lu ceci pour la première fois, l'idée de changer le nom du processus m'a paru impossible. Cependant, selon cet ancien thread sur le forum Sun vous pouvez utiliser des wrappers C++ autour de l'exécutable JVM pour y parvenir.

Bien franchement, je me demande quel est votre vrai problème, car je suppose qu'il existe une solution plus standard que d'essayer de changer le nom du processus.

5
Tim Bender

Votre meilleure option est quelque chose comme launch4j http://launch4j.sourceforge.net/

Il y a un bogue enregistré dans le bugtracker de Sun pour cela, mais ce n'est pas une priorité élevée http://bugs.Sun.com/view_bug.do?bug_id=6299778

4
Noel Grandin

Il existe principalement 2 approches: l'une est comme déjà décrite: utiliser des outils comme Launch4j, WinRun4J pour créer des lanceurs Windows natifs.

Une autre approche qui semble meilleure consiste à utiliser Apache Procrun pour envelopper l'application Java en tant que service Windows. Pendant le processus du service d'installation, nous pouvons donner au processus un nom significatif tel que OurApp.exe.

Tout ce que nous devons faire est de renommer prunsrv.exe en OurApp.exe et de remplacer chaque occurrence de prunsrv.exe dans nos scripts de service d'installation | start | stop | uninstall en MyApp.exe.

Voir plus de tilisation d'Apache Procrun pour renommer le nom du processus d'un Java sous Windows

2
jeffery.yuan

Si vous souhaitez utiliser un nom de processus différent, vous devrez créer votre propre binaire pour lancer votre application Java en utilisant quelque chose comme JSmooth .

Regardez cette question pour une discussion sur la création de tels binaires.

2
Dave Webb

En effet, Java ne sont pas réellement exécutables, elles sont exécutées par la machine virtuelle Java, c'est pourquoi Java apparaît dans le moniteur de processus, c'est l'hôte de votre application.

Des choses comme LimeWire le font cependant, mais je pense que c'est plus à GCJ - http://gcc.gnu.org/Java/

1
Lloyd