質問
だるPID現在の走行過程をLinuxプラットフォームを得ることができるシステムに依存液)。Javaでなく、プロセスID、JRuby現在のバグとRubyの方法です。pidです。
しおりを付けることができるを得るPID?
解決
procfs がインストールされている場合、/ proc /からプロセス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 )
他のヒント
LinuxはSun JVMを使用してのみテストされています。他の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プログラムによって書き込まれます。 &#8718;
親の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
呼び出しに指定された配列の最後の文字列を置き換えることができます。
JNR-Posix でgetpid()を試すことができます。
また、libcからgetpid()を呼び出すWindows POSIXラッパーもあります。 JNIは不要です。
Java 9
最後には正式にな ProcessHandle:
ProcessHandle.current().pid();
この:
最初に取得します
ProcessHandle
参照の現在のプロセス。アクセスするためには、その
pid
.
な輸入を必要として ProcessHandle
の一部である java.lang
.