Comment obtenir le pid d'un processus en cours en utilisant une seule commande qui analyse la sortie de ps?

22

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

Actuellement, j'ai:

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

Et cela renvoie le poing pid, command. Je n'ai besoin que du premier numéro de la sortie et j'ignore le reste. Je suppose sedou awkaiderais ici mais mon expérience avec eux est limitée.

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

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

Sorin
la source
1
le diriger à travers la tête et spécifier la ligne à retourner avec -n 1?
Mike McMahon

Réponses:

28

Si vous voulez juste le pid du processus, vous pouvez l'utiliser pgrepsi disponible. pgrep <command>renverra le pid de la commande (ou la liste des pids dans le cas où plusieurs instances de la commande sont en cours d'exécution, auquel cas vous pouvez utiliser headou d'autres commandes appropriées)
J'espère que cela vous aidera!

another.anon.coward
la source
+1 Mon utilisation habituelle de pgrep:kill `pgrep xxx`
Steve
20
@steve: Vous devriez peut-être regarder pkill.
pause jusqu'à nouvel ordre.
7

Juste une commande de plus 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}'

Eh bien, deux. J'ai ajouté un autre grep pour supprimer grep lui-même de la sortie.

chepner
la source
6

Utilisez simplement pgrep, c'est beaucoup plus simple

pgrep -o -x xxxx

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


la source
Et puisque OP veut utiliser la commande pour tuer le processus, pkill(avec les mêmes arguments) serait le choix le plus direct.
bstpierre
2

pidof xxx suffira sur linux

herve3527
la source
0

Fonctionnant sur Cygwin donc je ne peux pas utiliser -A et -o, mais quelque chose comme ça:

$ 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
AlG
la source
0

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 ^

Pizza
la source