21

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

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

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

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

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

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

6 ответов6

27

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

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

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

1

pidof xxx хватит на linux

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 из-за якоря ^

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .