web-dev-qa-db-fra.com

Exclusion de grep de la liste de processus

J'ai bricolé une commande pour renvoyer 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 retourne également un deuxième PID, qui est probablement le processus que je suis en train de lancer. Est-il possible d'exclure ma commande de la liste des PID renvoyés?

Je l'ai testé à quelques reprises et il apparaît que ma commande est toujours le deuxième PID de la liste, mais je ne veux pas saisir uniquement le premier PID au cas où il serait inexact.

27
tak

le commutateur -v de grep inverse le résultat et l'exclut de la file d'attente. Alors faites comme ça:

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

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

ps -C daemon_name -o pid=

Ce dernier -o détermine les colonnes des informations que vous souhaitez inclure dans la liste. pid répertorie uniquement la colonne id du processus. Et le signe égal = après pid signifie qu’il n’y aura pas de titre de colonne pour celui-là, vous n’obtenez que les numéros clairs - les PID.

J'espère que cela t'aides.

27
Serg ikS

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 ceci à l'aide de | grep -v grep.

23
RedGrittyBrick

Évitez d'analyser la sortie de ps s'il existe des alternatives plus fiables.

pgrep daemon_name
pidof daemon_name
15
grawity

Utilisez pgrep pour 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 à propos de pgrep est qu’elle ne se présentera jamais comme une correspondance. Mais vous n'avez pas besoin d'obtenir le pid par pgrep puis de tuer le processus correspondant par kill. Utilisez pkill à la place:

pkill proc_name

Spécifiez le signal SIGKILL (-9 ou -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 le signal SIGKILL (-9 ou -KILL):

pkill -KILL -Ilf proc_name_or_argument

Notez que l'option -I est uniquement disponible sur certaines versions de pkill, par exemple. celui sur les OS X Mavericks.

3
Rockallite

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

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

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

3
MOG73

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
0
Shubham Khatri

cette ligne vous renvoie le pid (id du processus) en excluant "grep"

PID=$(ps aux | grep '/usr/bin/python2.7 manage.py SES__boto3_sqs_read' | grep -v grep)
0
Brian Sanchez