Come posso impostare il nome del processo per un programma Java?

Se viene avviato un programma Java, entra nel processo di sistema-monitora il nome java. Molti programmi Java sono così difficili da distinguere. Quindi sarebbe bello, se esiste un modo, di impostare il nome, che verrà mostrato nel monitor di processo. Sono consapevole che questo potrebbe funzionare in modo diverso su diversi sistemi operativi.

Un modo semplice sarebbe, se l’interprete Java supportasse un interruttore per impostare il nome, in questo modo:

java -processname MyProgram -jar MyProgram 

Ma non sono riuscito a trovare un interruttore del genere, quindi probabilmente non esiste. Anche un’API in Java per impostare il nome del processo andrebbe bene.

Quindi, quindi hai qualche suggerimento?

Non so se questo è ansible, ma potresti usare uno strumento da riga di comando che viene fornito con il JDK chiamato ‘jps’. È come * nix ps , ma solo programmi Java. jps -v mostra tutti gli argomenti passati a java.

Inoltre, ho visto persone albind un “nome di processo” ai loro processi java aggiungendo un -Dmyprocessname inutilizzato agli argomenti.

come @omerkudat ha detto:

 jps -v 

stampa tutti i processi java {processID, lista params} Se la lista params non è sufficiente per riconoscere le applicazioni che ti servono, prova ad aggiungere alcuni parametri fittizi quando li esegui:

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

Questo stamperà come:

 7780 MainFrame -Dname=myApp 

e puoi usare l’ID di processo per ucciderlo / monitorarlo.

Puoi farlo con uno shim LD_PRELOAD : https://github.com/airlift/procname

Lo shim chiama semplicemente prctl() specifico per Linux all’avvio del processo:

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

La chiamata deve avvenire sul thread principale, quindi non è ansible farlo da Java o anche con un agente JVMTI, poiché questi si verificano su un thread diverso.

Quando l’ho letto per la prima volta, l’idea di cambiare il nome del processo mi sembrava imansible. Tuttavia, secondo questa antica discussione sul forum sun è ansible utilizzare wrapper C ++ attorno all’eseguibile JVM per ottenere questo risultato.

Anche se francamente, mi chiedo quale sia il tuo vero problema, poiché immagino che ci sia una soluzione più standard che tenti di cambiare il nome del processo.

La tua migliore opzione è qualcosa come launch4j http://launch4j.sourceforge.net/

C’è un bug registrato nel sun bugtracker per questo, ma non è ad alta priorità http://bugs.sun.com/view_bug.do?bug_id=6299778

Se si desidera utilizzare un nome di processo diverso, sarà necessario creare il proprio binario per avviare l’applicazione Java utilizzando qualcosa come JSmooth .

Guarda questa domanda per una discussione sulla creazione di tali binari.

Questo perché le applicazioni Java non sono effettivamente eseguibili, sono gestite dalla Java virtual machine, ecco perché java appare nel monitor di processo, è l’host della tua applicazione.

Cose come LimeWire però lo fanno, ma penso che sia più di GCJ – http://gcc.gnu.org/java/

Ci sono principalmente 2 approcci: uno è come già descritto: usando strumenti come Launch4j, WinRun4J per creare launcher nativi di Windows.

Un altro approccio che sembra migliore è usare Apache Procrun per avvolgere l’applicazione java come servizio di Windows. Durante il processo di installazione, possiamo dare al processo un nome significativo come OurApp.exe.

Tutto ciò di cui abbiamo bisogno è rinominare prunsrv.exe in OurApp.exe e sostituire ogni occorrenza di prunsrv.exe nei nostri script di installazione | start | stop | disinstallazione su MyApp.exe.

Vedi di più usando Apache Procrun per rinominare il processo Nome di un programma Java in Windows