Как найти pid процесса по имени

I think it is easier to use pgrep

$ pgrep bluetoothd
441

Otherwise, you can use awk:

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

For example, if ps -efhas a line like:

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

Then ps -ef | awk '$8=="/usr/sbin/bluetoothd" {print $2}' returns 441.


In ksh pgrep is not found. and the other solution is failing in case
below is output from ps command jaggsmca325 7550 4752 0 Sep 11 pts/44
0:00 sqlplus dummy_user/dummy_password@dummy_schema

Let’s check the last column ($NF), no matter its number:

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

If you want to match not exact strings, you can use ~ instead:

$ ps -ef | awk '$NF~"bluetooth" {print $2}'
441
1906

Каждый процесс в операционной системе имеет свой уникальный идентификатор, по которому можно получить информацию об этом процессе, а также отправить ему управляющий сигнал или завершить.

В Linux такой идентификатор называется PID, и  узнать его можно несколькими способами. В этой статье мы рассмотрим, как узнать PID процесса в Linux, а также зачем это может вам понадобиться.

1. ps

Самый распространённый способ узнать PID Linux – использовать утилиту ps:

ps aux | grep имя_процесса

Кроме нужного нам процесса, утилита также выведет PID для grep, ведь процесс был запущен во время поиска. Чтобы его убрать, добавляем такой фильтр:

ps aux | grep имя_процесса | grep -v grep

Например, узнаём PID всех процессов, имя которых содержит слово “Apache”:

ps aux | grep apache | grep -v grep

2. pgrep

Если вам не нужно видеть подробную информацию о процессе, а достаточно только PID, то можно использовать утилиту pgrep:

pgrep apache

По умолчанию утилита ищет по командной строке запуска процесса, если нужно искать только по имени процесса, то надо указать опцию -f:

pgrep -f apache

3. pidof

Эта утилита ищет PID конкретного процесса по его имени. Никаких вхождений, имя процесса должно только совпадать с искомым:

pidof apache2

С помощью опции -s можно попросить утилиту выводить только один PID:

pidof -s apache2

4. pstree

Утилита pstree позволяет посмотреть список дочерних процессов для определённого процесса, также их pid-идентификаторы. Например, посмотрим дерево процессов Apache:

pstree -p | grep apache2

Как узнать PID скрипта

Когда вы запускаете скрипт в оболочке, например Bash запускается процесс известный как подоболочка и выполняет последовательно все команды скрипта. Чтобы узнать PID процесса подоболочки Bash, запущенной для скрипта, обратитесь к специальной переменной $$. Эта переменная доступна только для чтения, поэтому вы не сможете ее редактировать:

vi ~/check_pid.sh

#!/bin/bash
echo "PID этого скрипта: $$"

Каким процессом занят файл Linux

Выше мы рассмотрели, как получить PID процесса Linux по имени, а теперь давайте узнаем PID по файлу, который использует процесс. Например, мы хотим удалить какой-либо файл, а система нам сообщает, что он используется другим процессом.

С помощью утилиты lsof можно посмотреть, какие процессы используют директорию или файл в данный момент. Например, откроем аудио-файл в плеере totem, а затем посмотрим, какой процесс использует её файл:

lsof /home/sergiy/трек.mp3

В начале строки мы видим название программы, а дальше идёт её PID. Есть ещё одна утилита, которая позволяет выполнить подобную задачу – это fuser:

fuser /home/sergiy/трек.mp3

Здесь будет выведен только файл и PID процесса. После PID идёт одна буква, которая указывает, что делает этот процесс с файлом или папкой:

  • c – текущая директория;
  • r – корневая директория;
  • f – файл открыт для чтения или записи;
  • e – файл выполняется как программа;
  • m – файл подключен в качестве библиотеки.

Кто использовал файл в Linux

Узнать процесс, который сейчас занимает файл, достаточно просто. Но как узнать, какой процесс обращается к файлу не надолго, например, выполняет его как программу или читает оттуда данные? Эта задача уже труднее, но вполне решаема с помощью подсистемы ядра auditd. В CentOS набор программ для работы с этой подсистемой поставляется по умолчанию, в Ubuntu же его придётся установить командой:

sudo apt install auditd

Теперь создаём правило для мониторинга. Например, отследим, кто запускает утилиту who:

auditctl -w /usr/bin/who -p x -k who_exec

Здесь -w – адрес файла, который мы будем отслеживать, –p – действие, которое нужно отслеживать, –k – произвольное имя для правила. В качестве действия могут использоваться такие варианты:

  • x – выполнение;
  • w – запись;
  • r – чтение;
  • a – изменение атрибутов.

Теперь выполним один раз who и посмотрим, что происходит в логе с помощью команды ausearch:

sudo ausearch -i -k who_exec

Здесь в секции SYSCALL есть PID процесса, под которым была запущена программа, а также PPID – программа, которая запустила нашу who. Копируем этот PID и смотрим информацию о нём с помощью ps:

ps aux | grep 15595

Становиться понятно, что это bash.

Какой процесс использует порт в Linux

Иногда необходимо узнать PID Linux-программы, которая использует сетевой порт, например 80. Для этого можно использовать утилиту ss:

sudo ss -lptn 'sport = :80'

Мы видим, что это несколько процессов Apache. Использовав опцию dport, можно узнать, какой процесс отправляет данные на указанный порт:

sudo ss -lptn 'dport = :80'

Выводы

В этой статье мы рассмотрели, как узнать PID процесса в Linux по различным условиям: имени или файлу. Как видите, всё достаточно просто, и в считанные минуты можно можно понять, что происходит с вашей операционной системой, и какой процесс за это отвечает.

Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.

Creative Commons License

Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .

Обновлено Обновлено: 29.03.2023
Опубликовано Опубликовано: 09.11.2017

Просмотр процессов
Остановка процессов
Подробная информация
Потребление ресурсов

Список процессов

Вывести на экран список текущих процессов, запущенных пользователем, можно командой:

ps

Чтобы посмотреть список всех процессов с дополнительной информацией, вводим:

ps aux

Мы увидим, примерно, следующее:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root       661  0.0  0.0   4072     8 tty1     Ss+  Jul03   0:00 /sbin/mingetty
root       662  0.0  0.0   4072     8 tty2     Ss+  Jul03   0:00 /sbin/mingetty
root     16355  0.0  0.0 171636  3308 pts/0    S    15:46   0:00 sudo su
root     16366  0.0  0.0 140896  1556 pts/0    S    15:46   0:00 su
root     16368  0.0  0.0 108316  1944 pts/0    S    15:46   0:00 bash
root     18830  0.0  0.0 110244  1172 pts/0    R+   16:20   0:00 ps u

* где:

  • USER — учетная запись пользователя, от которой запущен процесс.
  • PID — идентификатор процесса.
  • %CPU — потребление процессорного времени в процентном эквиваленте.
  • %MEM — использование памяти в процентах.
  • VSZ — Virtual Set Size. Виртуальный размер процесса (в килобайтах).
  • RSS — Resident Set Size. Размер резидентного набора (количество 1K-страниц в памяти).
  • TTY — терминал, из под которого был запущен процесс.
  • STAT — текущее состояние процесса. Могут принимать значения:
    1. R — выполнимый процесс;
    2. S — спящий;
    3. D — в состоянии подкачки на диске;
    4. T — остановлен;
    5. Z — зомби.
    6. W — не имеет резидентных страниц;
    7. < — высоко-приоритетный;
    8. N — низко-приоритетный;
    9. L — имеет страницы, заблокированные в памяти.
  • START — дата запуска процесса.
  • TIME — время запуска процесса.
  • COMMAND — команда, запустившая процесс.

Ключи

Ключ Описание
-A Все процессы.
-a Запущенные в текущем терминале, кроме главных системных.
-d Все, кроме главных системных процессов сеанса.
-e Все процессы.
f Показать дерево процессов с родителями.
T Все на конкретном терминале.
a Все, связанные с текущим терминалом и терминалами других пользователей.
r Список только работающих процессов.
x Отсоединённые от терминала.
u Показать пользователей, запустивших процесс.

Примеры

Поиск процесса с помощью grep:

ps aux | grep apache

Убить процесс

Останавливаем процесс по его PID:

kill <PID>

Если процесс не завершается, убиваем его принудительно:

kill -9 <PID>

Остановить все процессы с именем nginx:

killall nginx

Как и в случае с kill, можно это сделать принудительно:

killall -9 nginx

Можно остановить все процессы конкретного пользователя:

killall -u oleg

Ищем процесс по имени, извлекаем его PID и завершаем его:

kill `ps aux | grep ‘apache’ | awk ‘{print $2}’`

* обратите внимание, что запрос может вывести несколько процессов, которые будут попадать под критерии поиска — в таком случае, они будут завершены все.

Подробная информация о процессе

Для каждого процесса создается каталог по пути /proc/<PID>, в котором создаются папки и файлы с описанием процесса.

Примеры использования /proc/<PID>

Подробный вывод статуса:

cat /proc/<PID>/status

Адрес в ячейках оперативной памяти, которые занял процесс:

cat /proc/<PID>/syscall

Команда, которой был запущен процесс:

cat /proc/<PID>/cmdline

Символьная ссылка на рабочий каталог процесса:

ll /proc/<PID>/cwd

Символьная ссылка на исполняемый файл, запустивший процесс:

ll /proc/<PID>/exe

Увидеть ссылки на дескрипторы открытых файлов, которые затрагивает процесс:

ll /proc/<PID>/fd/

Подробное описание на сайте man7.org.

Потребление ресурсов процессами

Для просмотра статистики потребления ресурсов используем утилиту top:

top

Пример вывода:

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
21059 root      20   0  157884   2280   1496 R  18,8  0,1   0:00.03 top
    1 root      20   0  190996   2964   1652 S   0,0  0,1   6:49.99 systemd
    2 root      20   0       0      0      0 S   0,0  0,0   0:01.78 kthreadd
    3 root      20   0       0      0      0 S   0,0  0,0   0:24.75 ksoftirqd/0
    5 root       0 -20       0      0      0 S   0,0  0,0   0:00.00 kworker/0:0H

* где:

  • PID — идентификатор процесса.
  • USER — имя учетной записи, от которой запущен процесс.
  • PR — приоритет процесса.
  • NI — приоритет, выставленной командой nice.
  • VIRT — объем виртуальной памяти, потребляемый процессом.
  • RES — объем используемой оперативной памяти.
  • SHR — количество разделяемой памяти, которое используется процессом.
  • S — состояние процесса.
  • %CPU — процент использования процессорного времени.
  • %MEM — потребление оперативной памяти в процентах.
  • TIME — использование процессорного времени в секундах.
  • COMMAND — команда, которая запустила процесс.

Дмитрий Моск — частный мастер

Была ли полезна вам эта инструкция?

Да            Нет

Open another terminal and run ps ax | grep foo where foo is the name of the unresponsive program. This should return a line of output that looks something like this:

$ ps ax | grep firefox
2222 ?        S      0:00 /bin/sh /usr/lib/firefox-3.6.9/firefox
2231 ?        Sl   514:36 /usr/lib/firefox-3.6.9/firefox-bin
30290 pts/2    S+     0:00 grep --color=auto firefox

The first field of each line of output is a number which represents the Process ID of the program matched by grep (you can safely ignore the last one, which represents grep itself.

To halt the offending process, do:
kill pid where pid is the Process ID of the program. You might have to use your judgment as to which of the matches needs to be killed, or you could use top instead. Using kill by itself sends SIGTERM, which you should try first as it allows the program to properly clean up after itself. If SIGTERM fails, try SIGHUP, which is stonger medicine: kill -HUP pid. If all else fails, send SIGKILL. But, you should only do so as a last resort, because SIGKILL causes the kernel to terminate the process immediately with no possibility for cleanup. This can at times result in data corruption or other problems. So again, only send SIGKILL as a last resort. To do so, do kill -KILL pid or kill -9 pid.

If you are running a graphical interface, of course, you don’t have to fool with this crazy command-line stuff to get the job done. Just open “System Monitor”, navigate to the Processes tab, choose the process you want to halt (Hm, could it be the one using 90% CPU?) and right-click it. Since the process is already stopped, (that’s the problem, right?) choose End Process or Kill Process from the resulting menu.

Credit to koanhead

Knowing the PID and PPID of a process can be helpful if you need to manage or interact with a process running on your system.

There are numerous ways to get the PID (Process ID) and PPID (Parent Process ID) of a given process in Linux.

Command Description
pidof process_name Works with exact process name
pgrep process_name Returns PID of all matches
ps -o ppid= -p PID Get the PPID from PID
$$ PID of current process/shell
${PPID} PID of current process’s parent

I’ll explain these commands in detail but before that a quick recap of process, PID and PPID.

Linux process basics

Everything that runs on your system is ran via something known as a process, with that simply being the running instance of a program.

All the processes that run on your system are assigned identifiers. These can be helpful if you want to monitor the process (for example, such as to see how much memory or CPU it is using), or maybe if you want to end it if it starts to hang or just act a bit funky.

The identifiers that get attached to all these processes are known as PIDs and PPIDs.

What is a PID?

PID stands for “process ID”. Again, this is simply the identifier that gets attached to a program when it starts running, and can be helpful if you need to interact with the process in one way or another.

What is a PPID?

PPID is quite closely related to a PID. PPID stands for “parent process ID”, and if you didn’t get it already, it simply stands for the process that created the process you are checking.

For example, let’s say that we have two processes. One is named “spawner”, and has a process ID (or PID) of 7234. Our second process, “email client”, has a process ID of 7456 when we create it. Our spawner program starts our email client, resulting in our email client having a PID of 7456, and a PPID of 7234, since the spawner (which had the PID of 7234) is what spawned the email client.

Now that you have brushed up your basic, let’s see how to get the process ID in Linux.

Getting the PID of a process

The important thing here is to know the name of the process whose PID you want to find.

If you know the exact process name, you can get its process ID using the pidof command:

pidof exact_process_name

Easier said than done because you may not always know the exact process name. Good thing here is that pidof command works with tab completion so if you know the starting few letters of the process name, you can hit tab to get matching suggestions.

Example of pidof command which is used for finding PID of a process in Linux

pidof command works with tab completion

However, that may not always work if the process name doesn’t match to what you think it is called. For example, the process for Edge browser on Linux is called msedge. It doesn’t start with ‘edge’ and the tab completion won’t work if you focus on ‘edge’.

So, what you can do is to resort to the ps command in Linux to list all the running processes from all users and then use grep on the output to filter the result.

ps aux | grep -i partial_process_name

There is a dedicated command that combines the features ps and grep command and it is unsurprisingly called pgrep:

pgrep partial_or_exact_process_name

pgrep command

The default output shows only the PIDs without any information on the process. This could be troublesome if there is more than one process IDs returned for your searched term.

Hence, I suggest using the listing feature to make sure that you are getting the PID of the desired process.

pgrep -l partial_or_exact_process_name

pgrep command example

You may also use the top command to get the process information but it cannot be used in scripts.

💡

You can use the pstree command to get the PIDs of all running process on your Linux system: pstree -p -a

Getting PPID from a child process’s PID

Once you know the PID of a process, it is effortless to find the PPID for that process.

You can simply run the following command, replacing PID with the current process (child) ID:

ps -o ppid= -p PID

In a shell, the above command and ${PPID} should both return the same output:

And that’s about everything there is to finding PIDs and PPIDs!

Checking the PID and PPID of the currently running process

If you’re in a shell such as Bash, it’s extremely easy to find the PID and PPID of the calling process (which will usually be the shell).

Bash stores the PID’s value under the $$ variable, and the PPID under the ${PPID} variable:

# Prints the PID.
echo "$$"

# Prints the PPID.
echo "${PPID}"
Commands to find the PID and PPID of the current process.

This way, you can get the process ID of shell and subshell.

PID and PPID of current shell

And it’s that easy! Finding the PIDs and PPIDs of other processes isn’t much harder either.

Wrapping up

You should now know everything you need to find both PIDs and PPIDs for running processes on your system.

If you need any help getting something working, or just got some remaining questions, feel free to leave that and anything else in the comments below.

Добавить комментарий