Exclusion de grep de la liste des processus

27

J'ai bricolé une commande pour retourner l'ID de processus d'un démon en cours d'exécution:

ps aux | grep daemon_name | awk "{ print \$2 }"

Il fonctionne parfaitement et renvoie le PID, mais il renvoie également un deuxième PID qui est probablement le processus que j'exécute maintenant. Existe-t-il un moyen d'exclure ma commande de la liste des PID retournés?

Je l'ai testé plusieurs fois et il semble que ma commande soit toujours le deuxième PID de la liste, mais je ne veux pas récupérer uniquement le premier PID au cas où il serait inexact.

tak
la source

Réponses:

27

Le -vcommutateur de grep inverse le résultat, l'excluant de la file d'attente. Alors faites comme:

ps aux | grep daemon_name | grep -v "grep daemon_name" | awk "{ print \$2 }"

Upd . Vous pouvez également utiliser -Cswitch pour spécifier le nom de la commande comme suit:

ps -C daemon_name -o pid=

Ce dernier -odétermine quelles colonnes des informations vous souhaitez dans la liste. pidrépertorie uniquement la colonne d'ID de processus. Et le signe égal =après pidsignifie qu'il n'y aura pas de titre de colonne pour celui-ci, donc vous obtenez uniquement les nombres clairs - PID.

J'espère que cela t'aides.

Serg ikS
la source
2
Utilisation de "grep -v grep": Attention, vous pouvez avoir une longue ligne de commande incluant "grep" (Disons que quelqu'un a écrit une bibliothèque grep => "-Llibgrep.so" ou "-cp libgrep.jar". Au moins Je répéterais le modèle: grep -v "grep daemon_name"
phil_w
Bon point, @phil_w, merci. Mis à jour la réponse.
Serg ikS
23

Vous pouvez utiliser une astuce de classe de personnage. "[d]" ne correspond pas à "[d]" seulement "d".

 ps aux | grep [d]aemon_name | awk "{ print \$2 }"

Je préfère cela à l'utilisation | grep -v grep.

RedGrittyBrick
la source
C'est un truc intelligent, j'aime ça. Je garde les choses simples pour le moment pendant que j'apprends, et | grep -v grepje serai plus facile à comprendre lorsque je revisiter mon code.
tak
J'essaie de comprendre comment fonctionne [h] ack. Pourriez-vous expliquer ce que vous voulez dire "[d]" does not match "[d]" only "d"?
Nowaker
@Damian: Les crochets sont des métacaractères (délimitant un ensemble de caractères) dans l'expression de recherche, de sorte que la grepcommande ne correspondra pas à la psligne de sortie de la grepcommande elle-même (ce que tak a appelé "un deuxième PID" dans la question d'origine). expression a[xy]dne correspond pas au texte a[xy]dmais correspond au texte axdou au texte ayd. Par conséquent, l'expression [f]oocorrespond au texte foomais pas au texte [f]oo. J'espère que c'est clair.
RedGrittyBrick
D'accord, j'avais tort sur ARGV. Ce n'est qu'une expression rationnelle. Merci.
Nowaker
Diablement intelligent! J'ai dû y réfléchir un instant - merci!
Subfuzion
15

Évitez l'analyse de psla sortie s'il existe des alternatives plus fiables.

pgrep daemon_name
pidof daemon_name
grawity
la source
Oui, enfin la gestion des processus a du sens maintenant.
Błażej Michalik
pgreprecherche par sous-chaîne et pidofpar correspondance exacte - exactement ce dont j'avais besoin! Merci!
Sasha
3

L' ps -Coption n'est pas universelle sur tous les systèmes basés sur Unix mais si elle fonctionne sur vos systèmes. Au lieu de cela, j'éviterais complètement la grep:

ps aux | awk '/daemon_name/ && !/awk/ { print $2 }'

Pas besoin d'échapper à quoi que ce soit entre guillemets simples. ps auxvous donnera la liste complète des processus sur la plupart des systèmes basés sur Unix et awkest généralement installé par défaut.

MOG73
la source
3

Utilisez pgreppour rechercher le pid d'un processus par son nom:

pgrep proc_name

Avec un nom de processus supplémentaire dans le résultat ( -l):

pgrep -l proc_name

Recherchez et affichez le nom du processus ( -l) et les arguments ( -f):

pgrep -lf proc_name_or_argument

La bonne chose à ce sujet pgrepest qu'il ne se signalera jamais comme un match. Mais vous n'avez pas besoin de récupérer le pid pgrep, puis de tuer le processus correspondant par kill. Utilisez pkillplutôt:

pkill proc_name

Spécifiez le SIGKILLsignal ( -9ou -KILL) au lieu de SIGTERM(par défaut):

pkill -9 proc_name

Recherchez le nom du processus ( -l) et les arguments ( -f), demandez confirmation ( -I) avant de le tuer par SIGKILLsignal ( -9ou -KILL):

pkill -KILL -Ilf proc_name_or_argument

Notez que l' -Ioption n'est disponible que sur certaines versions de pkill, par exemple celle sur OS X Mavericks.

Rockallite
la source
0

Si vous utilisez bash, vous pouvez également le faire de la manière suivante en utilisant ps -eaf

PIDS=$(ps -eaf)
PID=$(echo "$PIDS" | grep "process_name" | awk '{print $2}')
echo $PID
Shubham Khatri
la source
C'est inutilement complexe. Pourquoi ne pas simplement appelerps -eaf | grep "process_name" | awk '{print $2}'
David Nedrow
0

cette ligne vous donne le pid (identifiant du processus) à l'exclusion de "grep"

PID=$(ps aux | grep '/usr/bin/python2.7 manage.py SES__boto3_sqs_read' | grep -v grep)
Brian Sanchez
la source
Une explication serait bien.
davidbaumann
C'est fondamentalement la même que la réponse acceptée, mais avec une décoration différente.
Scott