How do I find out if a specific JAR file is running on my machine or not? I just want to ensure that a specific JAR is only executed once at any time-- so if another request to execute the same jar comes in then I should not again invoke that jar.
I can use code for the above either as java code (which I will add to that JAR itself) or as shellscript (which I will use to invoke the jar file).
The machine will be a Linux machine-- either CentOS, or Debian or Ubuntu or Amazon Linux.
To test this, pick a .exe file you see running in Task Manager and test out the cmd line. That means there is no task running equal to java.exe .
An easier way to check for a process already executing is the pidof command. Alternatively, have your script create a PID file when it executes. It's then a simple exercise of checking for the presence of the PID file to determine if the process is already running. #!/bin/bash # abc.sh mypidfile=/var/run/abc.
jar file contains compiled code (*. class files) and other data/resources related to that code. It enables you to bundle multiple files into a single archive file.
You can use the jvisualvm which is within the jdk: %JAVA_HOME%/bin/jvisualvm . its an oracle-specific tool, users of any OpenJDK do not have it.
jps is a simple command-line tool that prints out the currently running JVMs and what they're running. You can invoke this from a shell script.
jps -l
will dump out the JVM process id and the main class that it's executing. I suspect that's the most appropriate for your requirement.
Noting your comment re. jps being not supported, if it's a valid worry that you can't easily mitigate via testing when you upgrade a JDK/JRE, then perhaps use something like:
pgrep -lf java
Try to create a new jar,
create a class inside with like this (not yet functional code, just a scribble):
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();})
}
Place your specific.jar inside the new.jar. If ever another instance of this jar try to be load, a exception will be thrown: Socket already in use.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With