Desde Java, ¿es posible obtener la línea de comando completa con todos los argumentos que iniciaron la aplicación?¿Cómo obtengo la línea de comandos que inició el proceso?
System.getEnv()
y System.getProperties()
no parecen contener los valores.
Desde Java, ¿es posible obtener la línea de comando completa con todos los argumentos que iniciaron la aplicación?¿Cómo obtengo la línea de comandos que inició el proceso?
System.getEnv()
y System.getProperties()
no parecen contener los valores.
Parte de ella está disponible en el RuntimeMXBean se obtiene llamando a ManagementFactory.getRuntimeMXBean()
A continuación, puede, por ejemplo, llamar a
Los javadocs para los que dicen:
devuelve los argumentos de entrada pasados a la máquina virtual Java que no incluye los argumentos para el método principal. Este método devuelve una lista vacía si no hay un argumento de entrada para la máquina virtual Java.
Algunas implementaciones de Java Virtual Machine puede tomar argumentos de entrada de múltiples fuentes diferentes: por ejemplo, argumentos pasados desde la aplicación que pone en marcha la máquina virtual de Java como el comando 'java', variables de entorno, archivos de configuración, etc.
Normalmente, no todas las opciones de línea de comandos para el comando 'java' se pasan a la máquina virtual Java. Por lo tanto, los argumentos de entrada devueltos pueden no incluir todas las opciones de línea de comandos.
Creo que esto es lo mejor que puedes obtener usando Java puro. – msandiford
+1 Un código de ejemplo me gustaría esto perfecto! :) – OscarRyz
@Stephen Denne ... No soy un fan de este. Mi comprensión de la pregunta era obtener la línea de comando (di lo que se muestra en 'ps -f' con la cadena de comandos. Como dice la página del manual," _no incluye los argumentos en el método principal._ "En este momento, yo ' Estoy tratando de determinar qué otro programa está pasando a un 'main' que no es visible para mi clase. – will
En Linux/UNIX que debería ser posible cuando llegue a la salida de ese comando (correr en una cáscara)
cat /proc/$PPID/cmdline
Pero eso no es portátil en absoluto y por lo tanto no debe usarse en Java .. .
Ok, gracias. Está bien si no es portátil, sin embargo, también necesito que funcione en Windows. – aksamit
@aksamit - en otras palabras, necesitas que sea portátil entre (al menos) Linux y Windows ... ¡duh! @Johannes - "por lo tanto, no debería usarse en Java" es demasiado fuerte. No es totalmente incorrecto escribir código no portátil en Java ... si las circunstancias lo requieren. –
@Johannes Weiß: por lo que Sun estaba fuera de sí cuando decidieron poner * Runtime.exec * en ¿verdad? Quiero decir, obviamente no sirve para nada y debería eliminarse del lenguaje para complacer a los "dioses puros de Java". O? – SyntaxT3rr0r
Los siguientes enlaces pueden ayudar a llegar allí:
How to get command line arguments for a running process
get command-line of running processes
How to get a list of current open windows/process with Java?
Así como una nota:
En Windows que tenga Process Explorer by Sysinternals que muestra la línea de comandos que se utiliza para abrir el proceso. Haga clic con el botón derecho en el proceso y seleccione Propiedades ... Verá la línea de comando en la ventana que se abre.
Es posible que desee ver cómo jps
hace esto. Es un programa de Java que puede obtener la línea de comando completa para todos los procesos de Java, incluido el nombre de clase completo de la clase principal y las opciones de JVM.
Una opción que he usado en el pasado para mantener el brillo de plataforma cruzada es establecer la línea de comando como una variable de entorno antes de emitir el comando.
Hay una variable de entorno% ~ dp0 que devuelve la ruta completa
¿En qué sistema operativo? – OscarRyz
Vaya ... Olvidé que está en Windows. Muy útil para ejecutar el cambio a la ruta UNC para un archivo por lotes. Por ejemplo, ruta UNC \\ Server \ share \ folder1 \ runit.bat si se pulsa la primera línea del lote% ~ dp0, entonces su ruta actual será \\ Server \ share \ folder1 \ – ggonsalv
La respuesta no es relevante para el motivo por el que encontré esta pregunta, pero es útil saberlo. –
Tenga una mirada en YAJSW (Sin embargo, otro contenedor de servicio de Java) - tiene implementaciones basadas en JNA para diversos sistemas operativos (incluyendo Win32 y Linux) que haga exactamente esto para que pueda tomar la línea de comando de un proceso en ejecución y crear una configuración que lo envuelva en un servicio. Un poco más de información here.
Si está utilizando Solaris como el sistema operativo, eche un vistazo a la utilidad "pargs". Imprime toda la información requerida.
¿te refieres a los argumentos proporcionados a la jvm también? hay una pregunta relacionada con eso http://stackoverflow.com/questions/1490869/how-to-get-vm-arguments-from-inside-of-java-application – LB40