Как получить pid запущенного процесса, используя одну команду, которая анализирует вывод ps?


22

Я ищу одну строку, которая возвращает pid запущенного процесса.

В настоящее время у меня есть:

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

И это возвращает кулак pid, command. Мне нужно только первое число из вывода и игнорировать остальные. Я полагаю sedили awkпомог бы здесь, но мой опыт работы с ними ограничен.

Кроме того, у этого есть другая проблема, это возвратит pid grep, если xxx не работает.

Очень важно иметь одну строку, так как я хочу повторно использовать вывод для выполнения чего-то другого, например, для уничтожения этого процесса.


1
передать через голову и указать строку для возврата с -n 1?
Майк МакМэхон

Ответы:


28

Если вам нужен pid процесса, вы можете использовать его, pgrepесли он доступен. pgrep <command>вернет pid команды (или список pid в случае, если запущено несколько экземпляров команды, и в этом случае вы можете использовать headили другие соответствующие команды)
Надеюсь, это поможет!


+1 Мое обычное использование pgrep:kill `pgrep xxx`
Стив

20
@steve: Возможно, вам стоит взглянуть pkill.
Приостановлено до дальнейшего уведомления.

7

Нужна только еще одна команда; вам нужно только первое поле из строки значений, разделенных пробелами:

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

Ну, два. Я добавил еще один grep, чтобы удалить сам grep из вывода.


6

Просто используйте pgrep, это намного проще

pgrep -o -x xxxx

Вышеупомянутый выбирает самый старый процесс с точным именем


И поскольку OP хочет использовать команду для уничтожения процесса, pkill(с теми же аргументами) будет самым прямым выбором.
Bstpierre


0

Запуск на Cygwin, поэтому я не могу использовать -A и -o, но что-то вроде этого:

$ 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

вы можете сделать что-то вроде

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

тогда xxx должно быть именем процесса, и он не подхватит grep из-за якоря ^

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.