Якщо я знаю номер PID процесу, як я можу отримати його назву?


222

Якщо я маю номер PID для процесу (на машині UNIX), то як я можу дізнатися назву пов'язаного з ним процесу?

Що я маю робити?


9
Можна використовувати ps або ls -l /proc/$PID/exe
Eddy_Em

1
@Eddy_Em, який дасть вам виконуваний файл, який не завжди є ім'ям процесу. Крім того, це не є портативним ...
derobert

6
ps -fp PID покаже повну команду
Temak

Відповіді:


243

На всіх POSIX-сумісних системах і з Linux можна використовувати ps:

ps -p 1337 -o comm=

Тут процес вибирається за допомогою PID з -p. The -o параметр визначає вихідний формат, comm що означає ім'я команди.

Дивіться також: ps - Специфікації базової групи Open Group Випуск 6


22
comm здається урізати команду до 15 символів. Використання command замість цього виправляє.
Nemo

1
[Ubuntu 14.04.4 LTS] $ ps -p 1 -o comm= в цьому $ ps -p 1 -o command= / sbin / init; це означає, що це не близько 15 символів, можливо, тільки ім'я двійки проти його повного шляху.
OmarOthman

2
Власне, comm дає ім'я двійкового і command повертає аргумент 0
robbie0630

42

Ви можете знайти ім'я процесу або команду, яка використовується ідентифікатором процесу або 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

13
Будьте обережні: ОП згадує UNIX. Не всі UNIX реалізують файл, подібний до процесу 9, як файл конкретного процесу. Відповідь, як правило, стосується лише Linux.
slhck

1
Хоча це правда, вони позначали питання "linux". Будь-хто, хто використовує ОС UNIX, що не працює на Linux, буде цілком звик до того, щоб змінювати відповіді відповідно до їхніх потреб
Andrew White

13

Щоб отримати шлях від програми, використовуючи певний pid, можна використовувати:

ps ax|egrep "^ [PID]"

альтернативно можна використовувати:

ps -a [PID]

enter image description here


1
ps -a Перерахуйте всі процеси, які пов'язані з терміналом, він не приймає ніяких вхідних даних.
Michael Lee

@MichaelLee Я думаю, це залежить від ps версії, на procps version 3.2.7 працює нормально.
Pedro Lobito

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 - друкувати вирішені символічні посилання або канонічні імена файлів.
Pablo Bianchi

7

Можна використовувати pmap. Я шукаю PID 6649. І відсікання додаткових деталей процесу.

$ pmap 6649 | head -1
6649:   /usr/lib64/firefox/firefox

Ця команда допомогла мені більше, ніж мені було потрібно, я маю повну лінію запущеного процесу. Дано процес Java, з ps Команда все, що ви побачите - це просто java, але решта переданих параметрів буде відображено повністю pmap.
Mincă Daniel Andrei

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

2
Це нестабільно, оскільки також можна вибрати процеси, які включають число в будь-яку команду. Спробуйте ps ax | grep 1 і подивитися, чи дійсно він повертає init процесу, наприклад. (У моєму випадку він повертає 119 рядків - не бажано.)
slhck

1
@slhck Змінив відповідь ... спасибі за інформацію. ps -p 1 -o comm = це найкращий варіант для цього питання.
Gangadhar

Нам не потрібні два прогони, щоб зберегти заголовки, а не використовувати ps aux | awk 'NR==1 || $2==PID' - і не потрібно говорити {print $0} тому що це за замовчуванням. Але, як ви прокоментували, -p все одно краще.
dave_thompson_085

3

Схожий на Відповідь slhck , але покладаючись на файлові операції замість викликів команд:

MYPID=1
cat "/proc/$MYPID/comm"

[Ubuntu 14.04.4 LTS] cat /proc/1/comm = & gt; init, не / sbin / init. Його відповідь має довшу версію. Але +1 все одно.
OmarOthman

2

Дивно, але ніхто не згадав опцію -f (повна команда) для ps. Мені подобається використовувати його з -e (все) і пропускати результати до grep, щоб я міг звузити свій пошук.

ps -ef | grep <PID>

Це також дуже корисно для перегляду повних команд, які хтось виконує, які забирають багато ресурсів у вашій системі. Це покаже вам параметри та аргументи, передані команді.


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

0

Я вважаю, що найпростішим методом є наступна команда:

ps -awxs | grep pid

Окрім того, що вони є дуже неефективними порівняно з ps -p${pid}, це дозволить підібрати багато помилкових спрацьовувань - у тому числі grep себе.
Toby Speight

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.