Lors de l'exécution d'une application Java Java, le nom de processus qui lui est donné est généralement Java.exe
ou javaw.exe
. Mais comment puis-je le faire appeler par le nom de mon application?
Ces méthodes sont adaptées aux serveurs avec beaucoup de processus Java en cours d'exécution, et où vous avez besoin d'un moyen rapide de trouver le bon jvm (sans utiliser jps.) Pour les applications, je suppose launch4j ou un autre wrapper est la voie à suivre.
Sous Unix, si vous lancez à partir d'un script Shell (au moins pour bash et éventuellement pour d'autres shells décents), vous pouvez utiliser:
exec -a goodname Java ...
pour lancer Java
et passer "goodname" comme 0ème argument, qui sera affiché comme nom de processus dans ps
etc.
Une alternative peut-être meilleure (qui semble également fonctionner pour top
) est de créer un lien symbolique: ln -s /usr/bin/Java /usr/local/bin/kallekula
.
Les raccourcis dans Windows ne feront pas l'affaire, mais Windows Vista/7 prend en charge les liens symboliques en utilisant mklink
. Cela peut fonctionner, mais je n'ai pas testé. Je ne sais pas si exec -a
fonctionne également avec cygwin bash sous Windows.
Découvrez launch4j , c'est un wrapper exécutable qui vous permet d'attribuer des noms exécutables.
À moins que vous ne lanciez Java via JNI dans votre propre exécutable personnalisé, le nom du processus sera toujours Java.exe.
Il existe plusieurs Java lanceurs/wrappers qui peuvent générer cet exécutable pour vous.
Ceci est spécifique à Windows.
J'étais confronté au même problème où je dois tuer le programme spécifique Java en utilisant taskkill . Lorsque j'exécute le programme Java, liste des tâches était montrant le même programme avec le nom de l'image défini comme Java.exe. Mais en le tuant en utilisant taskkill/F Java.exe arrêtera toutes les autres applications Java autres que celles prévues, qui ne sont pas nécessaires.
Je lance donc le même programme Java en utilisant:
démarrer "MyProgramName" Java java-program ..
Ici, la commande start ouvrira une nouvelle fenêtre et exécutera le programme Java avec le titre de la fenêtre défini sur MyProgramName.
Maintenant, pour utiliser ce programme Java, utilisez la commande taskkill suivante:
taskkill/fi "MyProgramName"
Votre programme Java sera tué uniquement. Le reste ne sera pas affecté.
Si vous utilisez Sun JDK, vous pouvez également utiliser l'outil de ligne de commande "jps" pour obtenir une liste détaillée des processus Java exécutés sur la boîte).
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 se produire 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.
En supposant que ce que vous recherchez vraiment est un moyen de terminer le bon processus plus tard, une autre solution est la suivante:
Courir ps -ef | grep Java
et vous devriez obtenir une liste qui ressemble à ceci:
mruser 7518 7505 4 11:37 pts/3 00:00:00 /usr/bin/Java -classpath MRD3030_Linked.jar peralex.MyApp
Ensuite pkill -f peralex.MyApp
va tuer le processus correct.
Toutes les versions d'Exec ne prennent pas en charge le drapeau -a. Si ce n'est pas le cas, le programme argv fait quelque chose de similaire.
Dans de nombreux Java enveloppes exe, l'exe personnalisé n'est qu'un lanceur et le processus s'exécute toujours comme Java (w) .exe habituel. Dans WinRun4J d'autre part, le exe personnalisé est le processus qui exécute votre application, par exemple dans le Gestionnaire des tâches votre exe personnalisé est ce qui apparaît. Il prend en charge 32 bits et 64 bits, console et aucune console (ainsi que de nombreuses options de configuration).