2010-10-21 3 views
11

Скажите, что у меня есть текущий запущенный процесс, как я могу превратить его в объект Process в Java? Процесс уже запущен, поэтому я не хочу запускать другой, я просто хочу инкапсулировать его в объект Process, который я могу использовать в Java-коде. Что-то вдоль линий:Java: Получить процесс с pid

int pid = getPid(); 
Process proc = magicGetProcess(pid); 

благодаря

+0

Я не думаю, что Java обладает достаточными возможностями управления процессом. Надеюсь, кто-то докажет, что я неправ. –

+0

Какую из функций 'Process' вы больше всего хотите? Вы пытаетесь сделать 'waitFor()', или вы хотите, чтобы иметь возможность перенаправлять входные/выходные потоки в ваше приложение или что? Я почти уверен, что вы просите сами по себе, это невозможно, но мы можем помочь с вашими реальными требованиями. –

+0

Ну, мне нужно передать этот процесс в метод, который в значительной степени проверяет, неожиданно ли он был завершен и хватает код выхода, если он это сделал. – Th3sandm4n

ответ

4

Я не думаю, что это возможно только с помощью встроенной библиотеки. AFAIK, уже нетривиально получить собственный PID рабочего процесса (см. feature request и alternate mechanisms).

Быстрый просмотр java.lang.Process class показывает, что вы можете написать свою собственную реализацию java.lang.Process с использованием JNI и собственного кода. Тогда ваш пользовательский класс мог бы реализовать дополнительные методы, например, в вашем вопросе.

+0

Хм, это то, на что похоже. Ну что ж. – Th3sandm4n

+0

FYI: сломанный url для java.lang.Process – Ismoh

0

В мире * nix захват кода выхода не-дочернего процесса непросто, потому что код выхода просто исчезает вместе с процессом, как только родительский процесс взял код выхода дочернего элемента. Вы можете подключиться к выполняемому процессу с помощью некоторого инструмента трассировки и получить его код выхода, когда процесс умирает. Большинство * nix OSes имеют инструменты командной строки, которые позволят вам сделать это (например, strace на Linux, ферма на SunOS) неинтрузивным способом. Однако вы можете использовать их только в своих собственных процессах или если вы выполняете роль root. Другой альтернативой является настройка подсистемы аудита вашей ОС для записи кодов выхода всех процессов.

+0

В Unix вы можете использовать функцию waitpid() для захвата кода выхода не-дочернего процесса. Проблема заключается в вызове с Java. –

0

Вы не можете. Каждая операция в Процессе требует, чтобы процесс был дочерним процессом. Не произвольный процесс.

0

Что касается использования RMI? Можно ли передать объект Process процессу, которым он является? Вероятно, нет, потому что процесс не является Serializable

Смежные вопросы