modificar - código java/shellscript para averiguar si un archivo jar ya se está ejecutando en la máquina actual
variables de entorno linux (2)
¿Cómo puedo saber si un archivo JAR específico se está ejecutando en mi máquina o no? Solo quiero asegurarme de que un JAR específico solo se ejecute una vez en cualquier momento, por lo que si aparece otra solicitud para ejecutar el mismo jar no debería volver a invocar ese jarrón.
Puedo usar el código para lo anterior como código Java (que añadiré a ese JAR) o como shellscript (que usaré para invocar el archivo jar).
La máquina será una máquina Linux, ya sea CentOS o Debian o Ubuntu o Amazon Linux.
Intenta crear un nuevo jar,
crea una clase dentro con esto (código aún no funcional, solo un garabato):
static ServerSocket unicorn;
public void load(){
unicorn=new ServerSocket(39483); // whatever-port
URLClassLoader myloader = new URLClassLoader(new URL[]{this.getClass().getResource("/META-INF/specific.jar")});
... // do all your unique stuff
Runtime.addShutdownHook(new Runnable(){unicorn.close();})
}
Coloque su specific.jar dentro de new.jar. Si alguna vez otra instancia de este jar intenta cargarse, se lanzará una excepción: El socket ya está en uso.
jps es una herramienta sencilla de línea de comandos que imprime las JVM en ejecución y lo que están ejecutando. Puede invocar esto desde un script de shell.
jps -l
la identificación del proceso de JVM y la clase principal que está ejecutando. Sospecho que es el más apropiado para su requerimiento.
Tomando nota de su comentario jps no es compatible, si es una preocupación válida que no puede mitigar fácilmente mediante pruebas cuando actualiza un JDK / JRE, entonces quizás use algo como:
pgrep -lf java