Подтвердить что ты не робот

Получить идентификатор подпроцесса в Java

Я создаю подпроцессы следующим образом:

String command = new String("some_program");

Process p = Runtime.getRuntime().exec(command);

Как я могу получить этот идентификатор подпроцесса?

P.S. Я работаю над Linux.

4b9b3361

Ответ 1

До сих пор нет общедоступного API (см. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4244896), но есть обходные пути.

Первым обходным решением будет использование внешней программы типа ps и вызов ее с помощью Runtime.exec(), чтобы получить pid:)

Другой основан на том, что класс java.lang.Process является абстрактным и что вы фактически получаете конкретный подкласс в зависимости от вашей платформы. В Linux вы получите java.lang.UnixProcess, у которого есть частное поле int pid. Используя отражение, вы можете легко получить значение этого поля:

Field f = p.getClass().getDeclaredField("pid");
f.setAccessible(true);
System.out.println( f.get( p ) );

Ответ 2

Я попробовал (и не смог) сделать это некоторое время назад. Я закончил обертку моей команды в оболочке script, которая сбрасывала pid в файл. Не лучшее решение, но мне удалось преодолеть это препятствие.

Ответ 3

Ну, нет документального способа сделать это, но бывает, что класс реализации процесса - это UNIXProcess, и он имеет поле pid. Таким образом, вы можете использовать отражение, чтобы получить доступ к этому частному полю, чтобы получить идентификатор. При поиске в googling вы найдете другие трюки при вызове другой оболочки, чтобы получить выход ps и что-то вроде этого. Ничего проще.

Ответ 4

От здесь

public static void main(String[] args) throws IOException {
    byte[] bo = new byte[100];
    String[] cmd = {"bash", "-c", "echo $PPID"};
    Process p = Runtime.getRuntime().exec(cmd);
    p.getInputStream().read(bo);
    System.out.println(new String(bo));
}