Escludendo grep dall'elenco dei processi


27

Ho messo insieme un comando per restituire l'ID del processo di un demone in esecuzione:

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

Funziona perfettamente e restituisce il PID, ma restituisce anche un secondo PID che è presumibilmente il processo che sto eseguendo ora. Esiste un modo per escludere il mio comando dall'elenco dei PID restituiti?

L'ho provato alcune volte e sembra che il mio comando sia sempre il secondo PID nell'elenco, ma non voglio prendere solo il primo PID nel caso in cui sia impreciso.


Risposte:


27

L'opzione grep -vinverte il risultato, escludendolo dalla coda. Quindi rendilo come:

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

Upd . Puoi anche usare -Cswitch per specificare il nome del comando in questo modo:

ps -C daemon_name -o pid=

Quest'ultimo -odetermina quali colonne delle informazioni desiderate nell'elenco. pidelenca solo la colonna ID processo. E il segno di uguale =dopo pidsignifica che non ci sarà titolo di colonna per quello, quindi otterrai solo i numeri chiari - PID.

Spero che sia di aiuto.


2
Usando "grep -v grep": fai attenzione che potresti avere una lunga riga di comando che includa "grep" (diciamo che qualcuno ha scritto una libreria grep => "-Llibgrep.so" o "-cp libgrep.jar". Almeno Vorrei ripetere lo schema: grep -v "grep daemon_name"
phil_w

Buon punto, @phil_w, grazie. Aggiornato la risposta.
Serg ikS,

23

Puoi usare un trucco per classe di personaggi. "[d]" non corrisponde a "[d]" solo "d".

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

Preferisco questo all'utilizzo | grep -v grep.


Heh è un trucco intelligente, mi piace. Al momento sto mantenendo le cose semplici mentre sto imparando e | grep -v grepsarà più facile da capire quando rivisiterò il mio codice.
Tak

Sto cercando di capire come funziona questo [h] ack. Potresti spiegare con cosa intendi "[d]" does not match "[d]" only "d"?
Nowaker,

@Damian: le parentesi quadre sono metacaratteri (delimitazione di un set di caratteri) nell'espressione di ricerca in modo che il grepcomando non corrisponda alla psriga di output per il grepcomando stesso (ciò che tak ha chiamato "un secondo PID" nella domanda originale). espressione a[xy]dnon non corrisponde il testo a[xy]d, ma lo fa testo partita axdo un testo ayd. Quindi l'espressione [f]oocorrisponde al testo fooma non al testo [f]oo. Spero che sia chiaro.
RedGrittyBrick,

Ok, mi sbagliavo su ARGV. Questa è solo una regexp. Grazie.
Nowaker,

Diabolicamente intelligente! Ho dovuto pensarci un momento - grazie!
Subfuzion,

15

Evitare l'analisi psdell'output se esistono alternative più affidabili.

pgrep daemon_name
pidof daemon_name

Sì, finalmente la gestione dei processi ha senso adesso.
Błażej Michalik,

pgrepricerche per sottostringa mentre pidofper corrispondenza esatta - esattamente ciò di cui avevo bisogno! Grazie!
Sasha,

3

L' ps -Copzione non è universale su tutti i sistemi basati su Unix ma se funziona sui tuoi sistemi. Invece eviterei del tutto grep:

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

Non è necessario sfuggire a nulla tra virgolette singole. ps auxti fornirà l'elenco completo dei processi sulla maggior parte dei sistemi basati su Unix ed awkè generalmente installato di default.


3

Utilizzare pgrepper cercare il pid di un processo in base al nome:

pgrep proc_name

Con il nome del processo aggiuntivo nel risultato ( -l):

pgrep -l proc_name

Cerca e visualizza il nome del processo ( -l) e argomenti ( -f):

pgrep -lf proc_name_or_argument

La cosa positiva pgrepè che non si segnalerà mai come una partita. Ma non è necessario ottenere il pid pgrepe quindi terminare il processo corrispondente kill. Usa pkillinvece:

pkill proc_name

Specificare il SIGKILLsegnale ( -9o -KILL) anziché SIGTERM(per impostazione predefinita):

pkill -9 proc_name

Cerca il nome del processo ( -l) e argomenti ( -f), chiedi conferma ( -I) prima di ucciderlo per SIGKILLsegnale ( -9o -KILL):

pkill -KILL -Ilf proc_name_or_argument

Si noti che l' -Iopzione è disponibile solo su alcune versioni di pkill, ad esempio quella su OS X Mavericks.


0

Se stai usando bash, puoi anche farlo nel modo seguente usando ps -eaf

PIDS=$(ps -eaf)
PID=$(echo "$PIDS" | grep "process_name" | awk '{print $2}')
echo $PID

Questo è inutilmente complesso. Perché non chiamare semplicementeps -eaf | grep "process_name" | awk '{print $2}'
David Nedrow il

0

questa riga ti restituisce il pid (ID processo) escluso "grep"

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

Qualche spiegazione sarebbe buona.
davidbaumann,

Questo è fondamentalmente lo stesso della risposta accettata, ma con decorazioni diverse.
Scott,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.