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.
Réponses:
Le
-v
commutateur de grep inverse le résultat, l'excluant de la file d'attente. Alors faites comme:Upd . Vous pouvez également utiliser
-C
switch pour spécifier le nom de la commande comme suit:Ce dernier
-o
détermine quelles colonnes des informations vous souhaitez dans la liste.pid
répertorie uniquement la colonne d'ID de processus. Et le signe égal=
aprèspid
signifie 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.
la source
Vous pouvez utiliser une astuce de classe de personnage. "[d]" ne correspond pas à "[d]" seulement "d".
Je préfère cela à l'utilisation
| grep -v grep
.la source
| grep -v grep
je serai plus facile à comprendre lorsque je revisiter mon code."[d]" does not match "[d]" only "d"
?grep
commande ne correspondra pas à laps
ligne de sortie de lagrep
commande elle-même (ce que tak a appelé "un deuxième PID" dans la question d'origine). expressiona[xy]d
ne correspond pas au textea[xy]d
mais correspond au texteaxd
ou au texteayd
. Par conséquent, l'expression[f]oo
correspond au textefoo
mais pas au texte[f]oo
. J'espère que c'est clair.Évitez l'analyse de
ps
la sortie s'il existe des alternatives plus fiables.la source
pgrep
recherche par sous-chaîne etpidof
par correspondance exacte - exactement ce dont j'avais besoin! Merci!L'
ps -C
option 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 aux
vous donnera la liste complète des processus sur la plupart des systèmes basés sur Unix etawk
est généralement installé par défaut.la source
Utilisez
pgrep
pour rechercher le pid d'un processus par son nom:Avec un nom de processus supplémentaire dans le résultat (
-l
):Recherchez et affichez le nom du processus (
-l
) et les arguments (-f
):La bonne chose à ce sujet
pgrep
est qu'il ne se signalera jamais comme un match. Mais vous n'avez pas besoin de récupérer le pidpgrep
, puis de tuer le processus correspondant parkill
. Utilisezpkill
plutôt:Spécifiez le
SIGKILL
signal (-9
ou-KILL
) au lieu deSIGTERM
(par défaut):Recherchez le nom du processus (
-l
) et les arguments (-f
), demandez confirmation (-I
) avant de le tuer parSIGKILL
signal (-9
ou-KILL
):Notez que l'
-I
option n'est disponible que sur certaines versions depkill
, par exemple celle sur OS X Mavericks.la source
Si vous utilisez bash, vous pouvez également le faire de la manière suivante en utilisant
ps -eaf
la source
ps -eaf | grep "process_name" | awk '{print $2}'
cette ligne vous donne le pid (identifiant du processus) à l'exclusion de "grep"
la source