Если я знаю номер PID процесса, как я могу получить его имя?

263

Если у меня есть номер PID для процесса (на компьютере с UNIX), как я могу узнать имя связанного с ним процесса?

Что мне нужно сделать?

AndreaNobili
источник
9
Вы можете использовать psилиls -l /proc/$PID/exe
Eddy_Em
1
@Eddy_Em, который даст вам исполняемый файл, который не всегда является именем процесса. Кроме того, это не портативно ...
Дероберт
9
ps -fp PIDпокажет полную команду
Temak

Ответы:

284

На всех POSIX-совместимых системах и в Linux вы можете использовать ps:

ps -p 1337 -o comm=

Здесь процесс выбирается по его PID с -p. -oПараметр определяет формат вывода, что commозначает имя команды.

См. Также: ps- Базовые спецификации Open Group Issue 6

slhck
источник
28
Похоже, что comm обрезает команду до 15 символов. Использование commandвместо этого исправляет это.
Немо
1
[Ubuntu 14.04.4 LTS] $ ps -p 1 -o comm= init $ ps -p 1 -o command= / sbin / init; это означает, что это не около 15 символов, может быть, просто имя двоичного файла и его полный путь.
ОмарОтман
3
На самом деле, commдает бинарной имя и commandвозвращает аргумент 0
Robbie
45

Вы можете найти имя процесса или команду, используемую идентификатором процесса или pid из

/proc/pid/cmdline

при выполнении

cat /proc/pid/cmdline

Здесь pid - это pid, для которого вы хотите найти имя
Например:

 # ps aux

   ................
   ................
   user  2480  0.0  1.2 119100 12728 pts/0  Sl   22:42   0:01 gnome-terminal
   ................
   ................

Чтобы найти имя процесса, используемого pid 2480, вы можете использовать

# cat /proc/2480/cmdline 

 gnome-terminal
Stormvirux
источник
14
Будьте осторожны: в OP упоминается UNIX. Не все UNIX-ы реализуют Plan 9 как файл, специфичный для процесса. Ваш ответ обычно относится только к Linux.
Slhck
3
Хотя это правда, они отметили вопрос «linux». Любой, кто использует ОС UNIX не на основе Linux, будет достаточно привыкать к тому, чтобы изменять ответы в соответствии со своими потребностями
Эндрю Уайт,
14

Чтобы получить путь к программе, используя определенный pid, вы можете использовать:

ps ax|egrep "^ [PID]"

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

ps -a [PID]

введите описание изображения здесь

Педро Лобито
источник
1
ps -aперечислить все процессы, которые связаны с терминалом, он не требует ввода.
Майкл Ли
@MichaelLee Я думаю, это зависит от psверсии, procps version 3.2.7работает нормально.
Педро Лобито
8
# ls -la /proc/ID_GOES_HERE/exe

Пример:

# ls -la /proc/1374/exe
lrwxrwxrwx 1 chmm chmm 0 Mai  5 20:46 /proc/1374/exe -> /usr/bin/telegram-desktop
Карлос Х.М. Морейра
источник
Этот идеален.
Jayarjo
1
Наверное, лучше readlink /proc/1337/exe. readlink - печатать разрешенные символические ссылки или канонические имена файлов.
Пабло А
8

Вы можете использовать pmap. Я ищу PID 6649. И обрезаю лишние детали процесса.

$ pmap 6649 | head -1
6649:   /usr/lib64/firefox/firefox
Майк Студер
источник
Эта команда помогла мне больше, чем мне нужно, у меня есть полная строка процесса, который начался. Учитывая процесс Java, с помощью psкоманды все, что вы увидите, просто java, но остальные переданные параметры будут отображаться полностью с pmap.
Даниэль Андрей Mincă
3

Вы также можете использовать awk в сочетании с PS

ps aux | awk '$2 == PID number for a process  { print $0 }'

пример:

root@cprogrammer:~# ps aux | awk '$2 == 1 { print $0 }'
root         1  0.0  0.2  24476  2436 ?        Ss   15:38   0:01 /sbin/init    

для печати HEAD LINE вы можете использовать

 ps --headers aux |head -n 1 && ps aux | awk '$2 == 1 { print $0 }'

                 (or) 

 ps --headers aux |head -n 1; ps aux | awk '$2 == 1 { print $0 }'


root@cprogrammer:~# ps --headers aux |head -n 1 && ps aux | awk '$2 == 1 { print $0 }'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.2  24476  2436 ?        Ss   15:38   0:01 /sbin/init
Gangadhar
источник
2
Это нестабильно, так как он также выбирает процессы, которые включают число где-либо в их команде. Попробуйте ps ax | grep 1и посмотрите, действительно ли он возвращает initпроцесс, например. (В моем случае это возвращает 119 строк - не желательно.)
slhck
1
@slhck Модифицировал ответ ... спасибо за информацию .. ps -p 1 -o comm = - лучший вариант для этого вопроса.
Гангадхар
Нам не нужно два прогона для сохранения заголовков, вместо этого используйте ps aux | awk 'NR==1 || $2==PID'- и не нужно говорить, {print $0}потому что это по умолчанию. Но, как вы прокомментировали, -pвсе равно лучше.
dave_thompson_085
3

Схоже с ответом slhck , но полагаясь на файловые операции, а не на вызовы команд:

MYPID=1
cat "/proc/$MYPID/comm"
ThorSummoner
источник
[Ubuntu 14.04.4 LTS] cat /proc/1/comm=> init, а не / sbin / init. В его ответ включена более длинная версия. Но +1 в любом случае.
ОмарОтман
2

Удивительно, но никто не упомянул опцию -f (полная команда) для ps. Мне нравится использовать его с -e (все) и направлять результаты в grep, чтобы я мог сузить область поиска.

ps -ef | grep <PID>

Это также очень полезно для просмотра полных команд, выполняемых кем-то, которые занимают много ресурсов в вашей системе. Это покажет вам параметры и аргументы, переданные команде.

jdelaporte
источник
3
Не работает на BSD (возможно, включая MacOSX? Я не уверен). Даже там, где -e -fэто возможно, grepможет выдавать много ложных совпадений, например, grep 33pid = 933 или 339, ppid = 33 или 933 или 339, время использования 33 секунд или 33 минуты, или имя программы или аргумент, содержащий 33 - включая grepсаму себя. Все (AFAIK) psесть -p, так что просто ps -fp 33.
dave_thompson_085
0

Я считаю самый простой способ с помощью следующей команды:

ps -awxs | grep pid
user666282
источник
Помимо того, что он весьма неэффективен по сравнению с ним ps -p${pid}, он может поднять множество ложных срабатываний - включая grepсам по себе.
Тоби Спейт
0

сделал простой скрипт для поиска PID и использования в скриптах bash ...
используйте с осторожностью !!

Снимок экрана: http://pastebin.com/Cm9YH67U
Скриншот



Андре

Андре Вервийс
источник