Как получить pid по имени процесса

Привет, я искал различные форумы, и здесь я также мог найти некоторые ответы для Linux и Mac, но не смог найти решение для Unix и особенно для Korn Shell.

Как получить имя процесса (имя команды) из идентификатора процесса (pid)

Ниже ссылка, которую я нашел в SO This И этот тоже

Я пробовал команду ниже

ps -eaf | awk '{ print substr($0, index($0, $9)) }'

Вышеупомянутая команда не работает в точке, где указано ВРЕМЯ, а не месяц и дата (поскольку в этом случае в строке будет только 8 столбцов)

Любое предложение поможет.


person gahlot.jaggs    schedule 12.09.2013    source источник
comment
Нет, я хочу pid из имени процесса, он был неправильно введен в заголовок   -  person gahlot.jaggs    schedule 12.09.2013
comment
Эта проблема очень специфична для вашей версии unix и имеет мало общего с оболочкой. Пожалуйста, включите вывод uname -a.   -  person Henk Langeveld    schedule 13.09.2013
comment
Для пользователей Mac, которые случайно найдут это, см. также stackoverflow.com/questions/11546765/.   -  person jvriesem    schedule 31.08.2018


Ответы (4)


Я думаю, проще использовать pgrep

$ pgrep bluetoothd
441

В противном случае вы можете использовать awk:

ps -ef | awk '$8=="name_of_process" {print $2}'

Например, если ps -ef имеет строку вида:

root       441     1  0 10:02 ?        00:00:00 /usr/sbin/bluetoothd

Затем ps -ef | awk '$8=="/usr/sbin/bluetoothd" {print $2}' возвращает 441.


В кш pgrep не найден. а другое решение не работает, если ниже выводится команда ps jaggsmca325 7550 4752 0 11 сентября pts/44 0:00 sqlplus dummy_user/dummy_password@dummy_schema

Давайте проверим последний столбец ($NF), независимо от его номера:

$ ps -ef | awk '$NF=="/usr/sbin/bluetoothd" {print $2}'
441

Если вы хотите сопоставить неточные строки, вы можете вместо этого использовать ~:

$ ps -ef | awk '$NF~"bluetooth" {print $2}'
441
1906
person fedorqui 'SO stop harming'    schedule 12.09.2013
comment
В кш pgrep не найден. а другое решение не работает, если ниже выводится команда ps jaggsmca325 7550 4752 0 Sep 11 pts/44 0:00 sqlplus dummy_user/dummy_password@dummy_schema - person gahlot.jaggs; 12.09.2013
comment
Я попробовал ваше решение, и оно довольно работает, но не работает в момент, когда имя процесса содержит пробелы, как показано ниже ps -eaf | awk '$NF==sshd: jaggsmca325@pts/53 {print $2}' любой указатель на эту проблему? И да, я хочу получить точное имя процесса. - person gahlot.jaggs; 13.09.2013
comment
@gahlot.jaggs Поскольку я использовал $NF, вы также можете использовать $(NF-1) и т. д. Таким образом, вы можете использовать $(NF-1)=="sshd:" && $NF=="jaggsmca325@pts/53" - person fedorqui 'SO stop harming'; 13.09.2013
comment
Спасибо за все ваши усилия, но я не могу знать во время выполнения, сколько токенов у меня будет в это время, поэтому я не могу использовать $(NF-1), так как в противном случае он будет исправлен только для N-1 и не будет работать в других случаях. . Есть ли способ найти идентификатор процесса, используя имя процесса, а не используя ps -eaf - person gahlot.jaggs; 13.09.2013
comment
@gahlot.jaggs Вы также можете grep "process$", так как $ означает конец строки. Затем дайте строку awk для печати второй записи. - person fedorqui 'SO stop harming'; 13.09.2013
comment
pgrep работает на Ubuntu 14.04. Обратите внимание, если вы вводите выходные данные в сценарий, это то, что если несколько процессов используют одно и то же имя, он напечатает список pid, по одному в строке. - person ahcox; 09.02.2015
comment
Это не очень хорошее решение, и оно требует точного соответствия тому, что почти всегда является очень длинной командой, которую нецелесообразно вводить. Решение с частичным сопоставлением было бы гораздо полезнее. - person Cerin; 29.06.2021
comment
@Cerin да, согласен. Поэтому я предлагаю некоторые альтернативы. - person fedorqui 'SO stop harming'; 29.06.2021

Вы можете использовать pidof, чтобы получить все идентификаторы запущенных процессов. с именем p_name:

pidof p_name | tr ' ' '\n' (для вертикального списка)

pkill p_name - убить все процессы с именем p_name

Убедитесь, что у вас есть разрешение убить их всех :)

person k-messaoudi    schedule 26.04.2016
comment
pidof работает для имен процессов длиннее 15 символов - person nurettin; 19.05.2020

Если ваше решение ps | awk не работает из-за того, что результат ps не соответствует вашим ожиданиям, сделайте так:

ps -eaf -o pid,cmd | awk '/regex-to-match-command-name/{ print $1 }'
person William Pursell    schedule 12.09.2013
comment
Он говорит ps: недопустимый вариант -- o - person gahlot.jaggs; 12.09.2013
comment
ps зависит от вашей платформы (но я думаю, что -o является стандартным). Проверьте свою документацию, чтобы узнать, как манипулировать полями вывода. (man ps) - person William Pursell; 12.09.2013
comment
ps также поддерживает o (без -) и --format, в зависимости от вашей платформы. - person go2null; 04.08.2016

ps -C <the-name> -o etime=

Мой ps от procps-ng.

person numeric    schedule 12.12.2018
comment
Я также использую ps -C <process-name> -o user= | head -1 для получения владельца процесса (пользователя) - person vladkras; 30.05.2019