Я запускаю установщик из Java для установки программного обеспечения в Linux, я хочу знать его "идентификатор процесса и имя образа".

В Windows я смог получить его с помощью команды tasklist , но в Linux я не смог сделать то же самое. Я пробовал с ps -ef и ps -A , но там не показывается имя изображения или PID процесса.

Есть ли команда, чтобы получить эти значения?

5 ответов5

1

В большинстве современных дистрибутивов Linux есть удобная команда pgrep (process grep), которая была создана именно для этой цели. Используйте это так:

pgrep -lf programname

В отличие от наивного ps ax | grep programname , pgrep знает, как не отображать идентификатор процесса самого себя.

Также есть дополнительная утилита pkill , которая может убивать процесс по имени (или отправлять другие сигналы).

0

Попробуй ps -aef | grep your_process_name , замените your_process_name вашим именем установщика.

Надеюсь это поможет !!

0

Как правило, лучше всего захватывать идентификатор процесса во время его запуска, а не пытаться найти его позже.

При использовании C API вы получаете PID порожденного процесса в качестве возвращаемого значения от fork или vfork в родительском процессе.

В производной от Bourne оболочке вы используете $! сразу после запуска.

0

если это графический установщик, вы можете запустить эту однострочную строку в терминале:

ps -fp $(xprop _NET_WM_PID | cut -d' ' -f3)

курсор мыши изменится на перекрестие. Теперь нажмите на окно в вопросе. Теперь вы должны увидеть информацию о процессе, напечатанную в терминале.

0

Кажется, вы ищете решение, ориентированное на Linux, а не портативное. В Linux простой, эффективный и надежный способ получить необходимую информацию из Java - это использовать файловую систему proc , особенно каталог /proc/self . man 5 proc manpage описывает каждый файл.

pid - это первое поле /proc/self/stat . Название изображения - второе.

Очень легко написать класс, чтобы обернуть эти вызовы. Это будет всего несколько строк кода, выполняющих базовый ввод-вывод: быстрый и надежный. Использование сторонних программ сложнее и менее эффективно.

Это решение не переносимо, так как большинство систем Unix не имеют файловой системы proc . У вас есть четыре варианта от лучшего к худшему, ИМХО:

  • Захватите необходимую информацию перед началом процесса: может быть легко или нет в зависимости от вашего приложения
  • Найдите чистые и специфичные для системы реализации, такие как файловая система proc для Linux
  • Используйте неуказанный API. RuntimeMXBean.getName() обычно возвращает pid , вы также можете использовать отражение, чтобы получить доступ к java.lang.UnixProcess.pid . Реализация может отличаться между JVM и может измениться в любое время. Приемлемые решения, если вы контролируете окружающую среду.
  • Написать собственный код для доступа к API POSIX
  • Используйте внешние инструменты, такие как ps

Если вы решите положиться на внешние инструменты, вам следует быть очень осторожным с переносимостью (параметры и выходные данные могут сильно различаться для двух ОС) и настройками локали.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .