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.
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.
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
.
Évitez d'analyser la sortie de ps
s'il existe des alternatives plus fiables.
pgrep daemon_name
pidof daemon_name
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.
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.
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
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)