web-dev-qa-db-fra.com

Trouver le pid d'un processus Java sous Linux

Bonjour, j'utilise la bibliothèque MPJ dans le programme Java pour l'algorithme Pagerank. Je le compile par

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

et dirigé par

mpjrun.sh -np 2 MpiPageRank

-np est le nombre de processus

Maintenant je dois trouver son pid

ps -ef|grep Java

comme

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

Je reçois

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

Maintenant, je veux extraire MpiPageRank de seulement 1 comman linux pour obtenir son pid ie 27866. comment je fais ça ?

17
Shweta B. Patil

en utilisant ps

ps permet à l'utilisateur de définir son propre formatage pour sa sortie avec le -o switch et -C pour sélectionner les entrées par la commande donnée. J'irais avec:

ps -C Java -o pid

à partir de la page de manuel:

   -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.

On peut obtenir des résultats plus précis en spécifiant plus de restrictions (c'est-à-dire l'utilisateur sous lequel le processus s'exécute, etc.). Consultez la page de manuel pour plus d'informations et d'autres commutateurs.

exemple:

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

en utilisant le Shell

Je ne sais pas pourquoi vous utilisez un .sh script pour exécuter votre code et ne pas appeler directement Java, mais si dans tous les cas vous utilisez le & (arrière-plan), vous pouvez saisir le pid via votre Shell, avec le $! variable.

par exemple:

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

il en va de même pour le Java -jar .. & commande, $! sera défini sur le pid de la dernière tâche en arrière-plan.

24
c00kiemon5ter

Vous pouvez utiliser awk pour obtenir le pid:

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

J'ai remarqué que parfois grep se trouve, pour le supprimer:

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

jps est le même que ps, sauf qu'il ne regarde que les processus Java.

Si vous avez ensuite besoin du PID, vous pouvez faire quelque chose comme ceci:

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

Cela exécute jps, puis utilise grep pour filtrer par l'application Java ou le fichier jar que vous voulez tuer. Après cela, awk capture et imprime uniquement le pid sur la console.

10
Jesan Fafon

Un moyen simple consiste à exécuter ceci:

pgrep Java
0
Eusuf Kanchwala