[vox-tech] HOWTO: Get Process ID from inside Java?
Rod Roark
vox-tech@lists.lugod.org
Wed, 22 Jan 2003 23:12:39 -0800
After reading all this, especially your reason for needing
the PID, I have to wonder why you are using Java. :-)
-- Rod
On Wednesday 22 January 2003 10:40 pm, msimons@moria.simons-clan.com wrote:
> I've been looking for info about getting the process id of a running java
> program from inside java. Amazingly enough it appears that getpid and
> other similar of functions are not available to a native java program.
> After browsing around for an hour I have found five common work arounds
> for this language omission:
>
> - Have a shell script pass into the java process it's own PID on the
> command line: "exec java ClassName $$"
>
> - Fork and exec another process from within the java which echos or
> returns the Parent Process Id for the java process to catch and parse...
> (see method 2)
>
> - Have a shell script which starts the java process save to a text file
> java process's pid, then have java read that file:
> "java ClassName & echo $! > pid.txt"
>
> - Use JNI to call a c stub to invoke the operating system's getpid
> function (method 4);
>
> - Use some form of "ps auxww | grep MagicString" to find the correct
> process id and parse the ps line <bleh>.
>
> ... All of this is just getting too gross for words. I'm wondering if any
> Java guru's out there have found a simple hole in the Java (hide useful
> information from running code) mentality and know of a fairly clean way
> to get the process id of the current running VM.
>
> Thanks,
> Mike
>
>
> In this particular case I would like the process id to use as part of
> a log file name. This is for a java server which is unstable and so
> multiple java process are run at the same time so when one starts getting
> borked it simply needs to be killed (a nanny program will restart dead
> server processes so that the server appears to be stable). ...
>
>
> method 2:
> ===
> try
> {
> Process p = Runtime.getRuntime().exec(
> new String[] {"perl", "-e", "print getppid(). \"\n\";"});
>
> BufferedReader br =
> new BufferedReader(new InputStreamReader(p.getInputStream()));
>
> int pid = Integer.parseInt(br.readLine());
>
> System.out.println(pid);
>
> p.destroy();
> p = null;
> br = null;
> }
> catch (java.io.IOException e)
> {
> System.out.println(e);
> }
> ===
>
> method 4:
> ===
> // Pid.java
> class Pid {
> static { System.loadLibrary("Pid"); }
> public native int getPid();
>
> public static void main(String args[])
> {
> Pid z = new Pid();
> System.out.println(z.getPid());
> z = null;
> }
> }
>
> // Pid.c
> #include "Pid.h"
> #include "unistd.h"
> JNIEXPORT jint JNICALL Java_Pid_getPid(JNIEnv *env, jobject obj)
> { return getpid(); }
> ===
>
> javac Pid.java
> javah Pid
> gcc -I/usr/lib/j2se/1.3/include -I/usr/lib/j2se/1.3/include/linux --shared
> -o libPid.so Pid.c
>
> export LD_LIBRARY_PATH=`pwd`
> ls -l libPid.so
> -rwxr-xr-x 1 msimons msimons 5111 Jan 22 22:23 libPid.so
>
> This method requires a c stub be compiled for each platform to be
> supported and requires the runtime library to be in the library search
> path. While it is certainly faster runtime than a perl or fork/exec
> method above they both royally suck...