13

Linuxプラットフォームで現在実行中のプロセスのPIDを見つける必要があります(システムに依存するソリューションである可能性があります)。JavaはプロセスIDの取得をサポートしておらず、JRubyには現在RubyメソッドProcess.pidのバグがあります。

PIDを取得する別の方法はありますか?

4

6 に答える 6

25

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チャンネルに特に感謝します!(具体的には、Jerubgregh、およびTopdeck

于 2008-09-26T07:07:17.013 に答える
7

Sun JVM を使用して Linux でのみテストされています。他の JMX 実装では機能しない可能性があります。

String pid = ManagementFactory.getRuntimeMXBean().getName().split("@")[0];
于 2008-09-26T08:43:35.037 に答える
2

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>

于 2012-07-09T14:19:29.913 に答える
2

親の 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に指定された配列の最後の文字列が置き換えられる場合があります。

于 2012-10-14T21:27:48.940 に答える
1

Java 9最後に、 ProcessHandleを使用してこれを行う公式の方法を提供します。

ProcessHandle.current().pid();

これ:

  • ProcessHandleまず、現在のプロセスの参照を取得します。

  • そのpid.

ProcessHandleの一部であるため、インポートは必要ありませんjava.lang

于 2018-09-26T22:17:41.350 に答える
0

JNR-Posixで getpid() を試すことができます。

libc から getpid() を呼び出す Windows POSIX ラッパーもあります。JNI は必要ありません。

于 2015-03-11T17:02:30.163 に答える