Найти pid java-процесса под Linux

Привет, я использую библиотеку MPJ в java-программе для алгоритма Pagerank. Я скомпилирую его

javac -cp .:$MPJ_HOME/lib/mpj.jar MpiPageRank.java

и выполняется

mpjrun.sh -np 2 MpiPageRank

где -np - номер процесса

Теперь мне нужно найти pid

ps -ef|grep java

как

mpjrun.sh -np 2 MpiPageRank & sleep 2
ps -ef | grep java

Я получаю

pnewaska 27866 27837 99 21:28 pts/45   00:00:09 java -cp /u/pnewaska/mpj-v0_38/lib/smpdev.jar:/u/pnewaska/mpj-v0_38/lib/xdev.jar:/u/pnewaska/mpj-v0_38/lib/mpjbuf.jar:/u/pnewaska/mpj-v0_38/lib/loader2.jar:/u/pnewaska/mpj-v0_38/lib/starter.jar:/u/pnewaska/mpj-v0_38/lib/mpiExp.jar runtime.starter.MulticoreStarter /nfs/nfs1/home/pnewaska/DistributedSystems/Project3 10 smpdev useLocalLoader EMPTY MpiPageRank -i input.500k0 -n 10 -o

Теперь я хочу извлечь MpiPageRank только из 1 комманды linux, чтобы получить его pid, т.е. 27866. как я это делаю?

Ответы

Ответ 1

с помощью ps

ps позволяет пользователю определять собственное форматирование для своего вывода с помощью переключателя -o и -C для выбора записей по данной команде. Я бы пошел с:

ps -C java -o pid

на странице руководства:

   -C cmdlist      Select by command name
                   This selects the processes whose executable name is given in cmdlist.

   -o format       user-defined format.
                   format is a single argument in the form of a blank-separated or comma-separated list, which offers a way to specify
                   individual output columns. The recognized keywords are described in the STANDARD FORMAT SPECIFIERS section below. Headers
                   may be renamed (ps -o pid,ruser=RealUser -o comm=Command) as desired. If all column headers are empty
                   (ps -o pid= -o comm=) then the header line will not be output. Column width will increase as needed for wide headers; this
                   may be used to widen up columns such as WCHAN (ps -o pid,wchan=WIDE-WCHAN-COLUMN -o comm). Explicit width control
                   (ps opid,wchan:42,cmd) is offered too. The behavior of ps -o pid=X,comm=Y varies with personality; output may be one
                   column named "X,comm=Y" or two columns named "X" and "Y". Use multiple -o options when in doubt. Use the PS_FORMAT
                   environment variable to specify a default as desired; DefSysV and DefBSD are macros that may be used to choose the default
                   UNIX or BSD columns.

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

Пример:

$ sleep 10 &
[1] 12654
$ ps -C sleep -o pid
12654

с помощью оболочки

Я не знаю, почему вы используете .sh script для запуска своего кода и не вызываете java напрямую, но если в любом случае вы используете оператор & (background), вы можете захватить pid через вашу оболочку с переменной $!.

например:

$ sleep 5 &
[1] 12395
$ echo $!
12395

то же самое для команды java -jar .. &, $! будет установлено в pid последнего заданного задания.

Ответ 2

Вы можете использовать awk для получения pid:

ps -ef | grep MpiPageRank | awk '{print $2}'

Я заметил, что иногда сам grep находит, чтобы удалить его:

ps -ef | grep MpiPageRank | grep -v grep | awk '{print $2}'

Ответ 3

jps - это то же самое, что и ps, за исключением того, что он смотрит только на Java-процессы.

Если вам понадобится PID, вы можете сделать что-то вроде следующего:

jps | grep JAVA_NAME | awk '{print $1}'

Это запускает jps, затем использует grep для фильтрации приложением java или банкой, которую вы хотите убить. После этого awk захватывает и печатает только pid на консоли.

Ответ 4

Простой способ - запустить это:

pgrep java