web-dev-qa-db-fra.com

Comment obtenir le pid d'un processus en cours d'exécution à l'aide d'une seule commande qui analyse la sortie de ps?

Je recherche une seule ligne qui renvoie le pid d'un processus en cours d'exécution.

Actuellement j'ai:

ps -A -o pid,cmd|grep xxx|head -n 1

Et cela retourne le poing pid, command. Je n'ai besoin que du premier nombre de la sortie et d'ignorer le reste. Je suppose que sed ou awk serait utile ici, mais mon expérience avec eux est limitée.

En outre, ceci a un autre problème, il retournera le pid de grep si le xxx n'est pas en cours d'exécution.

C'est vraiment important d'avoir une seule ligne, car je veux réutiliser la sortie pour faire autre chose, comme tuer ce processus.

22
sorin

Si vous voulez juste le pid du processus, vous pouvez utiliser pgrep si disponible. pgrep <command> renverra le pid de la commande (ou la liste des pids au cas où il y aurait plus d'une instance de la commande en cours d'exécution, auquel cas vous pouvez utiliser head ou d'autres commandes appropriées)
J'espère que cela t'aides!

28

Juste une commande supplémentaire nécessaire; vous ne voulez que le premier champ d'une ligne de valeurs séparées par des espaces:

ps -A -o pid,cmd|grep xxx | grep -v grep |head -n 1 | awk '{print $1}'

Deux. J'ai ajouté un autre grep pour supprimer ce dernier de la sortie.

7
chepner

Il suffit d'utiliser pgrep, c'est beaucoup plus simple

pgrep -o -x xxxx

Ce qui précède sélectionne le processus le plus ancien portant le nom exact

6
Lenny

pidof xxx suffira sur linux

1
herve3527

Courir sur Cygwin, je ne peux donc pas utiliser -A et -o, mais quelque chose comme ceci:

$ ps
      PID    PPID    PGID     WINPID   TTY     UID    STIME COMMAND
     4580       1    4580       4580  ?       55573   May 21 /usr/bin/mintty
     5808    7072    5808       7644  pty3    55573 13:35:31 /usr/bin/ps
     7072    5832    7072       6424  pty3    55573   May 21 /usr/bin/bash


$ ps | grep '/usr/bin/mintty' | head -n 1 | awk '{print $1}'
4580
0
AlG

vous pouvez faire quelque chose comme

ps -A -o cmd,pid | egrep "^xxx " | head -n 1 | sed -r -e 's/.* ([0-9]+)$/\1/'

alors xxx doit être le nom du processus et il ne récupérera pas grep à cause de l'ancre ^

0
pizza