Я создаю подпроцессы следующим образом:
String command = new String("some_program");
Process p = Runtime.getRuntime().exec(command);
Как я могу получить этот идентификатор подпроцесса?
P.S. Я работаю над Linux.
Я создаю подпроцессы следующим образом:
String command = new String("some_program");
Process p = Runtime.getRuntime().exec(command);
Как я могу получить этот идентификатор подпроцесса?
P.S. Я работаю над Linux.
До сих пор нет общедоступного 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 ) );
Я попробовал (и не смог) сделать это некоторое время назад. Я закончил обертку моей команды в оболочке script, которая сбрасывала pid в файл. Не лучшее решение, но мне удалось преодолеть это препятствие.
Ну, нет документального способа сделать это, но бывает, что класс реализации процесса - это UNIXProcess, и он имеет поле pid. Таким образом, вы можете использовать отражение, чтобы получить доступ к этому частному полю, чтобы получить идентификатор. При поиске в googling вы найдете другие трюки при вызове другой оболочки, чтобы получить выход ps и что-то вроде этого. Ничего проще.
От здесь
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));
}