Linuxプラットフォームで現在実行中のプロセスのPIDを見つける必要があります(システムに依存するソリューションである可能性があります)。JavaはプロセスIDの取得をサポートしておらず、JRubyには現在RubyメソッドProcess.pidのバグがあります。
PIDを取得する別の方法はありますか?
procfsがインストールされている場合は、/ proc / selfシンボリックリンクを介してプロセスIDを見つけることができます。このシンボリックリンクは、名前がpidであるディレクトリを指します(PIDを含む他の関連情報を含むファイルもここにありますが、ディレクトリはすべてです。この場合必要です)。
したがって、Javaを使用すると、次のことができます。
String pid = new File("/proc/self").getCanonicalFile().getName();
JRubyでは、同じソリューションを使用できます。
pid = java.io.File.new("/proc/self").canonical_file.name
これを解決するのを手伝ってくれた無料ノードの#stackoverflowチャンネルに特に感謝します!(具体的には、Jerub、gregh、およびTopdeck)
Sun JVM を使用して Linux でのみテストされています。他の JMX 実装では機能しない可能性があります。
String pid = ManagementFactory.getRuntimeMXBean().getName().split("@")[0];
JNI インターフェースを使用して、POSIX 関数getpid () を呼び出すことができます。それは非常に簡単です。必要な POSIX 関数のクラスから始めます。私はそれを呼びますPOSIX.java
:
import java.util.*;
class POSIX
{
static { System.loadLibrary ("POSIX"); }
native static int getpid ();
}
でコンパイルします
$ javac POSIX.java
その後、ヘッダーファイルPOSIX.h
を生成します
$ javah -jni POSIX
ヘッダー ファイルには、getpid 関数をラップする関数の C プロトタイプが含まれています。次に、関数を実装する必要がありますが、これは非常に簡単です。私はそれをしましたPOSIX.c
:
#include "POSIX.h"
#include <sys/types.h>
#include <unistd.h>
JNIEXPORT jint JNICALL Java_POSIX_getpid (JNIEnv *env, jclass cls)
{
return getpid ();
}
これで、gcc を使用してコンパイルできます。
$ gcc -Wall -I/usr/lib/jvm/java-1.6.0-sun-1.6.0.21/include -I/usr/lib/jvm/java-1.6.0-sun-1.6.0.21/include/linux -o libPOSIX.so -shared -Wl,-soname,libPOSIX.so POSIX.c -static -lc
Java がインストールされている場所を指定する必要があります。それで全部です。これで使用できます。簡単な getpid プログラムを作成します。
public class getpid
{
public static void main (String argv[])
{
System.out.println (POSIX.getpid ());
}
}
それをコンパイルしてjavac getpid.java
実行します:
$ java getpid &
[1] 21983
$ 21983
最初の pid はシェルによって書き込まれ、2 番目の pid はシェル プロンプトが返された後に Java プログラムによって書き込まれます。∎</p>
親の pid を読み取るシェル プロセスを生成します。それは私たちのpidに違いありません。例外とエラー処理なしの実行中のコードを次に示します。
import java.io.*;
import java.util.Scanner;
public class Pid2
{
public static void main(String sArgs[])
throws java.io.IOException, InterruptedException
{
Process p = Runtime.getRuntime().exec(
new String[] { "sh", "-c", "ps h -o ppid $$" });
p.waitFor();
Scanner sc = new Scanner(p.getInputStream());
System.out.println("My pid: " + sc.nextInt());
Thread.sleep(5000);
}
}
別のシェル コマンドを発行するためだけに PID を取得する場合は、この解決策が最適と思われます。コマンドを逆引用符で囲んで、別のコマンドに引数として渡すだけで十分です。次に例を示します。
nice `ps h -o ppid $$`
exec
これにより、 callに指定された配列の最後の文字列が置き換えられる場合があります。
Java 9
最後に、 ProcessHandleを使用してこれを行う公式の方法を提供します。
ProcessHandle.current().pid();
これ:
ProcessHandle
まず、現在のプロセスの参照を取得します。
そのpid
.
ProcessHandle
の一部であるため、インポートは必要ありませんjava.lang
。
JNR-Posixで getpid() を試すことができます。
libc から getpid() を呼び出す Windows POSIX ラッパーもあります。JNI は必要ありません。