- How to Find the PID and PPID of a Process in Linux
- Linux process basics
- What is a PID?
- What is a PPID?
- Getting the PID of a process
- Getting PPID from a child process’s PID
- Checking the PID and PPID of the currently running process
- Wrapping up
- 9 самых простых способов узнать идентификатор процесса (PID) в Linux
- Что такое идентификатор процесса PID?
- Метод-1: Использование команды pidof
- Способ-2: Использование команды pgrep
- Метод-3: Использование команды pstree
- Метод-4: Использование команды ps
- Метод-5: Использование команды ss
- Метод-6: Использование команды netstat
- Метод-7: использование команды lsof
- Метод-8: Использование команды fuser
- Метод-9: Использование команды systemctl
How to Find the PID and PPID of a Process in Linux
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 |
$ | 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:
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.
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
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
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:
In a shell, the above command and $ 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 $ variable:
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.
9 самых простых способов узнать идентификатор процесса (PID) в Linux
В основном, мы смотрим PID, чтобы убить невосприимчивую программу, и она похожа на диспетчер задач Windows.
Linux GUI также предлагает ту же функцию, но CLI – эффективный способ выполнения операции kill.
Что такое идентификатор процесса PID?
PID обозначает идентификационный номер процесса, который обычно используется большинством ядер операционной системы, таких как Linux, Unix, macOS и Windows.
Это уникальный идентификационный номер, который автоматически присваивается каждому процессу, когда он создается в операционной системе.
Процесс – это исполняемый экземпляр программы.
Каждый раз, идентификатор процесса будет получать изменения ко всем процессам, кроме init, поскольку init всегда является первым процессом в системе и является предком всех других процессов. Это PID – 1.
В 32-битных системах 32768 является максимальным значением, но мы можем установить любое значение до 2 ^ 22 (приблизительно 4 миллиона) в 64-битных системах.
Вы можете спросить, почему нам нужно такое количество PID? потому что мы не можем повторно использовать PID сразу. Также во избежание возможных ошибок.
PID для запущенных процессов в системе можно найти с помощью следующих девяти методов, таких как команда pidof, команда pgrep, команда ps, команда pstree, команда ss, команда netstat, команда lsof, команда fuser и команда systemctl.
- pidof: pidof – найти идентификатор процесса запущенной программы.
- pgrep: pgre – поиск или обработка сигналов на основе имени и других атрибутов.
- ps: ps – сообщает моментальный снимок текущих процессов.
- pstree: pstree – отображает дерево процессов.
- ss: ss используется для вывода статистики сокетов.
- netstat: netstat отображает список открытых сокетов.
- lsof: lsof – список открытых файлов.
- fuser: идентификаторы процессов в списке терминов всех процессов, которые открывают один или несколько файлов
- systemctl: systemctl – Управление системой systemd и менеджером сервисов
В этом уроке мы рассмотрим идентификатор процесса Apache для проверки.
Метод-1: Использование команды pidof
pidof используется для поиска идентификатора процесса запущенной программы.
Он выводит эти идентификаторы на стандартный вывод.
Чтобы продемонстрировать это, мы узнаем идентификатор процесса Apache2 из системы Debian 9.
# pidof apache2 3754 2594 2365 2364 2363 2362 2361
Из вышесказанного вы можете столкнуться с трудностями идентификации идентификатора процесса, поскольку он показывает все PID (включая родительский и дочерний) с именем процесса.
Следовательно, нам нужно выяснить родительский PID (PPID), который мы ищем.
Это может быть первый номер. В моем случае это 3754, и он показан в порядке убывания.
Способ-2: Использование команды pgrep
pgrep просматривает текущие процессы и перечисляет идентификаторы процессов, которые соответствуют критериям выбора для stdout.
# pgrep apache2 2361 2362 2363 2364 2365 2594 3754
Это также похоже на вышеприведенный вывод, но этот приводит к сокращению результатов в порядке возрастания, что ясно говорит о том, что родительский PID является последним.
Примечание. Если у вас есть несколько идентификаторов процесса, вы можете столкнуться с проблемой идентификации идентификатора родительского процесса при использовании команды pidof & pgrep.
Метод-3: Использование команды pstree
pstree показывает запущенные процессы как дерево.
Дерево коренится либо в pid, либо в init, если pid опущен.
Если имя пользователя указано в команде pstree, тогда отображается весь процесс, принадлежащий соответствующему пользователю.
pstree визуально объединяет идентичные ветви, помещая их в квадратные скобки и префикс с количеством повторений.
# pstree -p | grep "apache2" |-apache2(3754)-+-apache2(2361) | |-apache2(2362) | |-apache2(2363) | |-apache2(2364) | |-apache2(2365) | `-apache2(2594)
Чтобы получить только один родительский процесс, используйте следующий формат.
# pstree -p | grep "apache2" | head -1 |-apache2(3754)-+-apache2(2361)
Команда pstree очень простая, потому что она отдельно разделяет родительский и дочерний процессы
Метод-4: Использование команды ps
ps отображает информацию о выборе активных процессов.
Он отображает идентификатор процесса (pid = PID), терминал, связанный с процессом (tname = TTY), кумулятивное время процессора в формате [DD-] hh: mm: ss (time = TIME) и исполняемое имя (ucmd = ЦМД).
По умолчанию выходной файл не сортируется.
# ps aux | grep "apache2" www-data 2361 0.0 0.4 302652 9732 ? S 06:25 0:00 /usr/sbin/apache2 -k start www-data 2362 0.0 0.4 302652 9732 ? S 06:25 0:00 /usr/sbin/apache2 -k start www-data 2363 0.0 0.4 302652 9732 ? S 06:25 0:00 /usr/sbin/apache2 -k start www-data 2364 0.0 0.4 302652 9732 ? S 06:25 0:00 /usr/sbin/apache2 -k start www-data 2365 0.0 0.4 302652 8400 ? S 06:25 0:00 /usr/sbin/apache2 -k start www-data 2594 0.0 0.4 302652 8400 ? S 06:55 0:00 /usr/sbin/apache2 -k start root 3754 0.0 1.4 302580 29324 ? Ss Dec11 0:23 /usr/sbin/apache2 -k start root 5648 0.0 0.0 12784 940 pts/0 S+ 21:32 0:00 grep apache2
Из вышеприведенного вывода мы можем легко идентифицировать идентификатор родительского процесса (PPID) на основе даты начала процесса.
В моем случае процесс apache2 был запущен @ Dec11, который является родителем, а другие – дочерними. PID apache2 равен 3754.
Метод-5: Использование команды ss
ss используется для вывода статистики сокетов.
Он позволяет отображать информацию, аналогичную netstat.
Он может отображать больше информации о TCP и состоянии, нежели другие инструменты.
Он может отображать статистику для всех типов сокетов, таких как PACKET, TCP, UDP, DCCP, RAW, домен Unix и т. д.
# ss -tnlp | grep apache2 LISTEN 0 128 . 80 . * users:(("apache2",pid=3319,fd=4),("apache2",pid=3318,fd=4),("apache2",pid=3317,fd=4))
Метод-6: Использование команды netstat
netstat – вывод сетевых подключений, таблиц маршрутизации, статистики интерфейсов, соединений маскарадинга и многоадресной рассылки.
По умолчанию netstat отображает список открытых сокетов.
Если вы не укажете каких-либо семейств адресов, будут выведены активные сокеты всех сконфигурированных семейств адресов.
Эта программа устарела. Замена для netstat – ss.
# netstat -tnlp | grep apache2 tcp6 0 0 . 80 . * LISTEN 3317/apache2
Метод-7: использование команды lsof
lsof – список открытых файлов.
Команда lsof Linux выводит информацию о файлах, открытых для процессов, запущенных в системе.
# lsof -i -P | grep apache2 apache2 3317 root 4u IPv6 40518 0t0 TCP *:80 (LISTEN) apache2 3318 www-data 4u IPv6 40518 0t0 TCP *:80 (LISTEN) apache2 3319 www-data 4u IPv6 40518 0t0 TCP *:80 (LISTEN)
Метод-8: Использование команды fuser
Утилита fuser должна записывать на стандартный вывод идентификаторы процессов процессов, запущенных в локальной системе, которые открывают один или несколько именованных файлов.
# fuser -v 80/tcp USER PID ACCESS COMMAND 80/tcp: root 3317 F. apache2 www-data 3318 F. apache2 www-data 3319 F. apache2
Метод-9: Использование команды systemctl
systemctl – Управление системой systemd и менеджером сервисов.
Это замена старого системного управления SysV и большинство современных операционных систем Linux были адаптированы systemd.
# systemctl status apache2 ● apache2.service - The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; disabled; vendor preset: enabled) Drop-In: /lib/systemd/system/apache2.service.d └─apache2-systemd.conf Active: active (running) since Tue 2018-09-25 10:03:28 IST; 3s ago Process: 3294 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS) Main PID: 3317 (apache2) Tasks: 55 (limit: 4915) Memory: 7.9M CPU: 71ms CGroup: /system.slice/apache2.service ├─3317 /usr/sbin/apache2 -k start ├─3318 /usr/sbin/apache2 -k start └─3319 /usr/sbin/apache2 -k start Sep 25 10:03:28 ubuntu systemd[1]: Starting The Apache HTTP Server. Sep 25 10:03:28 ubuntu systemd[1]: Started The Apache HTTP Server.