Якщо я знаю номер 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.