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.

sorin
źródło
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!

another.anon.coward
źródło
+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.

chepner
źródło
6

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

pgrep -o -x xxxx

Powyższe wybiera najstarszy proces o dokładnej nazwie


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

pidof xxx wystarczy na Linuksie

herve3527
źródło
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
AlG
źródło
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 ^

Pizza
źródło