Jak uzyskać pid uruchomionego procesu za pomocą jednego polecenia, które analizuje dane wyjściowe ps?


22

Szukam pojedynczej linii, która zwraca pid uruchomionego procesu.

Obecnie mam:

ps -A -o pid,cmd|grep xxx|head -n 1

A to zwraca pięść pid, command. Potrzebuję tylko pierwszej liczby z wyjścia i zignoruj ​​resztę. Przypuszczam, że sedlub awkpomógłbym tutaj, ale moje doświadczenie z nimi jest ograniczone.

Ma to również inny problem, zwróci pid grep, jeśli xxx nie jest uruchomiony.

Naprawdę ważne jest, aby mieć jedną linię, ponieważ chcę ponownie wykorzystać dane wyjściowe do zrobienia czegoś innego, na przykład zabicia tego procesu.


1
potokuj przez głowę i określ linię do zwrócenia z -n 1?
Mike McMahon

Odpowiedzi:


28

Jeśli chcesz tylko pid procesu, możesz skorzystać, pgrepjeśli jest dostępny. pgrep <command>zwróci pid polecenia (lub listę pid w przypadku, gdy uruchomiona jest więcej niż jedna instancja polecenia, w którym to przypadku możesz skorzystać z headinnych odpowiednich poleceń).
Mam nadzieję, że to pomaga!


+1 Moje zwykłe użycie pgrep:kill `pgrep xxx`
Steve

20
@steve: Może powinieneś spojrzeć pkill.
Wstrzymano do odwołania.

7

Potrzebne jest jeszcze jedno polecenie; chcesz tylko pierwsze pole z wiersza wartości oddzielonych spacjami:

ps -A -o pid,cmd|grep xxx | grep -v grep |head -n 1 | awk '{print $1}'

Cóż, dwa. Dodałem kolejny grep, aby usunąć sam grep z wyjścia.


6

Wystarczy użyć pgrep, jest to o wiele prostsze

pgrep -o -x xxxx

Powyższe wybiera najstarszy proces o dokładnej nazwie


A ponieważ OP chce użyć polecenia do zabicia procesu, pkill(z tymi samymi argumentami) byłby najbardziej bezpośrednim wyborem.
bstpierre


0

Działa na Cygwin, więc nie mogę używać -A i -o, ale coś takiego:

$ ps
      PID    PPID    PGID     WINPID   TTY     UID    STIME COMMAND
     4580       1    4580       4580  ?       55573   May 21 /usr/bin/mintty
     5808    7072    5808       7644  pty3    55573 13:35:31 /usr/bin/ps
     7072    5832    7072       6424  pty3    55573   May 21 /usr/bin/bash


$ ps | grep '/usr/bin/mintty' | head -n 1 | awk '{print $1}'
4580

0

możesz zrobić coś takiego

ps -A -o cmd,pid | egrep "^xxx " | head -n 1 | sed -r -e 's/.* ([0-9]+)$/\1/'

wtedy xxx musi być nazwą procesu i nie odbierze grep z powodu kotwicy ^

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.