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

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

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

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

Я попытался выполнить команду

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

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

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

Ответ 1

Я думаю, что проще использовать 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.


В ksh pgrep не найден. и другое решение не выполняется в случае ниже выводится команда ps jaggsmca325 7550 4752 0 сен 11 очков /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

Ответ 2

Вы можете использовать pidof для получения всех идентификаторов запущенных процессов с именем p_name
pidof p_name | tr ' ' '\n' p_name | tr ' ' '\n' (для вертикального листинга)
pkill p_name убивает все процессы с именем p_name
NB убедитесь, что у вас есть разрешение убить их всех :)

Ответ 3

Если ваше решение ps | awk не работает, потому что вывод ps не тот, который вы хотите, сделайте так:

ps -eaf -o pid,cmd | awk '/regex-to-match-command-name/{ print $1 }'

Ответ 4

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

Мой пс из procps-ng.