When executing a Java application the process name given to it is usually java.exe
or javaw.exe
. But how can I make it be called by the name of my
WinRun4J
In many Java exe wrappers the custom exe is only a launcher and the process still runs as the usual java(w).exe. In WinRun4J on the other hand the custom exe is the process that runs your application, so for example in Task Manager your custom exe is what appears. It supports 32 bit and 64 bit, console and no console (along with numerous configuration options).
You can do this with an LD_PRELOAD
shim: https://github.com/airlift/procname
The shim simply calls the Linux-specific prctl()
when the process starts:
static void __attribute__ ((constructor)) procname_init()
{
prctl(PR_SET_NAME, "myname");
}
The call has to happen on the main thread, so it isn't possible to do this from Java or even with a JVMTI agent, since those happen on a different thread.
Unless you launch Java via JNI in your own custom built executable, the process name will always be java.exe.
There are several java launchers/wrappers that can generate this executable for you.
These methods are suited for servers with a lot of java processes running, and where you need a quick way of finding the correct jvm (not using jps.) For applications, I suppose launch4j or another wrapper is the way to go.
On unix, If you are launching from a shell sript (at least for bash and possibly for other decent shells) you can use:
exec -a goodname java ...
to launch java
and pass "goodname" as the 0th argument, which will be shown as the process name in ps
etc.
A perhaps better alternative (that seems to work also for top
) is to create a symlink: ln -s /usr/bin/java /usr/local/bin/kallekula
.
Shortcuts in windows won't do the trick, but windows vista/7 supports symlinks using mklink
. That may work, but I haven't tested. I am not sure if exec -a
also works with cygwin bash on Windows.
If you're using the Sun JDK, you can also use the "jps" command line tool to get a detailed list of Java processes running on the box.
Check out launch4j, it is an executable wrapper that allows you to assign executable names.