как получить идентификатор процесса для процесса Java в командной строке во FreeBSD, sh - PullRequest
3 голосов
/ 24 ноября 2010

Мне нужна помощь в написании команды, которая будет помещена в .sh. Я хочу вернуть идентификатор процесса, который в приведенных ниже выходных данных равен 3678, но у меня возникли трудности, потому что идентификатор процесса меняется каждый раз при перезапуске, поэтому мой код прерывается

Выход:

[root@server1 /usr/home/aaron]# ps -xauww | grep java | grep www
www      3678  0.0  3.2 1308176 267864  ??  Is    3:21PM   0:17.19 [java]
[root@server1 /usr/home/aaron]#

Вот что я делал, пока не понял, что столбец изменился, когда изменился pid:

ps -xauww | grep java | grep www | cut -d" " -f6

Любая помощь приветствуется. спасибо.

Ответы [ 4 ]

13 голосов
/ 24 ноября 2010

Если запуск автоматизирован с помощью сценария оболочки, вы можете написать pid только что запущенного процесса, который находится в переменной $!.

java ...... &
echo "$!" > myjavaprogram.pid

Когда вам нужно убить его, просто сделайте:

kill `cat myjavaprogram.pid`
2 голосов
/ 14 февраля 2017

Ниже pgrep команда работает для получения pid по имени jar-файла:

pgrep -f test-app.jar

1 голос
/ 24 ноября 2010

Согласно http://cfajohnson.com/shell/cus-faq-2.html

  1. Как получить идентификатор процесса по имени процесса?Или как узнать, запущен ли еще процесс с заданным идентификатором процесса?

    Нет надежного способа сделать это в оболочке.В некоторых системах идентификаторы процессов повторного использования очень похожи на файловые дескрипторы.То есть они используют pid с наименьшим номером, который в данный момент не используется при запуске нового процесса.Это означает, что искомый pid есть, но он может не относиться к процессу, который, по вашему мнению, он выполняет.

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

    Одно из предложений - использовать pgrep if в Solaris и 'ps h -o pid -C $STRING ', если нет, и ваш ps поддерживает этот синтаксис, но ни один из них не является идеальным или вездесущим.

    Нормальным решением при написании программ на C является создание файла pid, а затем блокировка его с помощью fcntl (2),Затем, если другая программа хочет узнать, действительно ли она запущена, она может попытаться заблокировать файл.Если попытка блокировки не удалась, он знает, что файл все еще работает.

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

При этом, послушайте, посмотрите на это: http://www.faqs.org/faqs/unix-faq/faq/part3/section-10.html это может вам помочь?

0 голосов
/ 24 ноября 2010

Один способ можно найти в: man pgrep

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...