Wyłączając grep z listy procesów

27

Połączyłem polecenie zwrócenia identyfikatora procesu działającego demona:

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

Działa idealnie i zwraca PID, ale zwraca również drugi PID, który prawdopodobnie jest procesem, który teraz uruchamiam. Czy istnieje sposób, aby wykluczyć moje polecenie z listy zwróconych PID?

Testowałem to kilka razy i wydaje się, że moje polecenie jest zawsze drugim PID na liście, ale nie chcę pobierać tylko pierwszego PID, na wypadek, gdyby był niedokładny.

tak
źródło

Odpowiedzi:

27

-vPrzełącznik grep odwraca wynik, wykluczając go z kolejki. Więc zrób to tak:

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

UPD . Możesz także użyć -Cprzełącznika, aby określić nazwę polecenia w następujący sposób:

ps -C daemon_name -o pid=

Ten ostatni -ookreśla, które kolumny informacji chcesz umieścić na liście. pidwyświetla tylko kolumnę id procesu. A znak równości =po pidoznacza, że ​​nie będzie tytułu kolumny dla tego, więc otrzymujesz tylko wyraźne liczby - PID.

Mam nadzieję że to pomoże.

Serg ikS
źródło
2
Używając „grep -v grep”: Uważaj, że możesz mieć długą linię poleceń, w tym „grep” (Powiedzmy, że ktoś napisał bibliotekę grep => „-Llibgrep.so” lub „-cp libgrep.jar”. Powtarzam wzór: grep -v "grep nazwa_demona"
phil_w
Dobra uwaga, @phil_w, dzięki. Zaktualizowałem odpowiedź.
Serg ikS
23

Możesz użyć sztuczki klasy postaci. „[d]” nie pasuje do „[d]” tylko „d”.

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

Wolę to niż używanie | grep -v grep.

RedGrittyBrick
źródło
Heh, to sprytna sztuczka, podoba mi się. W tej chwili staram się zachować prostotę podczas nauki i | grep -v grepbędzie łatwiej ją zrozumieć, kiedy ponownie odwiedzę mój kod.
tak
Próbuję zrozumieć, jak to działa. Czy mógłbyś wyjaśnić, co masz na myśli "[d]" does not match "[d]" only "d"?
Nowaker
@Damian: Nawiasy kwadratowe są metaznakami (ograniczającymi zestaw znaków) w wyrażeniu wyszukiwania, więc greppolecenie nie będzie pasować do pswiersza wyjściowego grepsamego polecenia (co tak nazywało się „drugim PID” w pierwotnym pytaniu). Wyrażenie a[xy]dma nie pasuje do tekstu a[xy]d, ale robi dopasowania tekstu axdlub tekst ayd. Dlatego wyrażenie [f]oopasuje do tekstu, fooale nie do tekstu [f]oo. Mam nadzieję, że to jasne.
RedGrittyBrick
OK, myliłem się co do ARGV. To tylko wyrażenie regularne. Dzięki.
Nowaker
Diabelnie sprytny! Musiałem o tym pomyśleć przez chwilę - dzięki!
Subfuzion
15

Unikaj analizowania pswyników, jeśli istnieją bardziej niezawodne alternatywy.

pgrep daemon_name
pidof daemon_name
grawitacja
źródło
Tak, wreszcie zarządzanie procesami ma teraz sens.
Błażej Michalik
pgrepwyszukuje według podłańcuchu, a jednocześnie pidofdokładnie dopasowuje - dokładnie to, czego potrzebowałem! dzięki!
Sasha
3

Ta ps -Copcja nie jest uniwersalna na wszystkich systemach opartych na Uniksie, ale jeśli działa na twoich systemach. Zamiast tego całkowicie unikałbym grep:

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

Nie trzeba niczego uciekać w pojedynczym cudzysłowie. ps auxda ci pełną listę procesów w większości systemów opartych na Uniksie i awkzazwyczaj jest instalowana domyślnie.

MOG73
źródło
3

Służy pgrepdo wyszukiwania pid procesu według nazwy:

pgrep proc_name

Z dodatkową nazwą procesu w wyniku ( -l):

pgrep -l proc_name

Wyszukaj i wyświetl nazwę procesu ( -l) i argumenty ( -f):

pgrep -lf proc_name_or_argument

Dobrą rzeczą pgrepjest to, że nigdy nie zgłosi się jako dopasowanie. Ale nie musisz pobierać pid, pgrepa następnie zabijać odpowiedni proces kill. pkillZamiast tego użyj :

pkill proc_name

Podaj SIGKILLsygnał ( -9lub -KILL) zamiast SIGTERM(domyślnie):

pkill -9 proc_name

Poszukaj nazwy procesu ( -l) i argumentów ( -f), poproś o potwierdzenie ( -I) przed zabiciem go przez SIGKILLsygnał ( -9lub -KILL):

pkill -KILL -Ilf proc_name_or_argument

Zauważ, że -Iopcja jest dostępna tylko w niektórych wersjach pkill, np. Tej w OS X Mavericks.

Rockallite
źródło
0

Jeśli korzystasz z bash, możesz to zrobić w następujący sposób, korzystając z ps -eaf

PIDS=$(ps -eaf)
PID=$(echo "$PIDS" | grep "process_name" | awk '{print $2}')
echo $PID
Shubham Khatri
źródło
Jest to niepotrzebnie złożone. Dlaczego nie po prostu zadzwonićps -eaf | grep "process_name" | awk '{print $2}'
David Nedrow
0

ten wiersz zwraca pid (identyfikator procesu) z wyłączeniem „grep”

PID=$(ps aux | grep '/usr/bin/python2.7 manage.py SES__boto3_sqs_read' | grep -v grep)
Brian Sanchez
źródło
Przyjemne byłoby jakieś wyjaśnienie.
davidbaumann
Jest to w zasadzie to samo co zaakceptowana odpowiedź, ale z inną dekoracją.
Scott,