Как найти PID процесса Linux с помощью pidof или pgrep
Описание: Чтобы узнать идентификатор процесса Linux, используйте команду pidof, например: pidof examplename. Если вы знаете только часть имени PID, вы можете вместо этого использовать «pgrep examplenamefragment». Замените «examplename» и «examplenamefragment» словами, которые вы хотите найти.
Работа с процессом Linux часто означает знание его идентификатора процесса или PID. Это уникальный номер, присваиваемый каждому работающему программному обеспечению. Вот два способа узнать, что это такое.
Что такое идентификатор процесса Linux?
Внутри Linux отслеживает свои запущенные процессы, присваивая им уникальный идентификационный номер, называемый идентификатором процесса или PID. Каждое запущенное приложение, утилита и демон имеют PID.
PID — это простые целочисленные значения. Вновь запущенный процесс получит PID на единицу больше, чем последний выданный PID. Таким образом, процесс с наивысшим PID является самым новым, т. е. самым последним запущенным процессом. Это продолжается до тех пор, пока система не достигнет максимального значения PID.
Верхний предел для PID равен 32768. Как только эта цифра достигнута, Linux возвращается к началу и ищет PID, который стал свободным, потому что процесс, который ранее им владел, завершился.
Процесс с PID 1 — это первый процесс, который запускается при запуске Linux процессами загрузки. В системах на основе systemd это будет systemd . В других системах это, скорее всего, init , хотя в некоторых дистрибутивах Linux используются альтернативы, такие как OpenRc или s6.
Иногда бывает полезно узнать PID процесса, обычно потому, что вы хотите выполнить какое-то действие над этим процессом. Вот два разных способа найти PID процесса, когда вы знаете имя процесса.
Как получить PID Linux с помощью команды pidof
Команду pidof можно рассматривать как комбинацию «PID» и «of». Это все равно, что спросить, какой у этого процесса PID? Если мы используем команду без параметров, она ничего не делает. Он молча возвращает вас в командную строку. Нам нужно указать имя процесса.
pidof сообщает нам, что PID оболочки Bash равен 8304. Мы можем проверить это с помощью команды ps . Все, что нам нужно сделать, это вызвать ps без параметров. Он сообщит о процессах, запущенных в текущем сеансе.
Поскольку ps сообщает обо всех процессах, которые он может найти, включая самого себя, он сообщает нам, что запущен процесс bash и процесс ps . Как и следовало ожидать, процесс bash имеет тот же PID, о котором сообщил pidof .
Если у вас открыто более одного окна терминала, pidof сообщит обо всех них.
Обратите внимание, что идентификаторы PID перечислены от самого высокого к самому низкому или, другими словами, от самого последнего к самому старому.
Чего это не показывает, так это того, что вы не можете быть владельцем всех этих процессов. pidof находит все процессы с совпадающими именами, независимо от того, кому они принадлежат. Давайте посмотрим глубже, направив вывод в grep . Мы используем параметры -e (выбрать все процессы) и -f (полный список) с параметрами ps .
Два процесса bash принадлежат пользователю dave, третий — пользователю mary.
Иногда одно приложение генерирует множество процессов, каждый из которых получает свой PID. Это то, что мы получаем с Google Chrome.
По умолчанию pidof сообщает обо всех процессах. Если мы хотим, мы можем запросить только самый последний из этих процессов. Опция -s (одиночный выстрел) делает именно это.
Использовать команду kill для ручного уничтожения всех процессов chrome было бы утомительно. Если мы захватим список процессов в переменную, мы сможем передать эту переменную команде kill . Команда kill может принимать несколько PID в своей команде, поэтому она с радостью принимает наш ввод и уничтожает все процессы для нас.
Первая команда собирает вывод из pidof и присваивает его нашей переменной, которую мы называем pid . Нам не нужно echo выводить его на экран, мы просто делаем это, чтобы показать, что содержит наша переменная.
Мы передаем переменную команде kill , затем снова используем pidof , чтобы проверить, остались ли какие-либо процессы Chrome. Все они были убиты.
Одной из особенностей pidof является то, что он не возвращает PID сценария оболочки. Он возвращает PID оболочки bash , на которой запущен скрипт. Чтобы увидеть оболочку, в которой запущен скрипт, нам нужно использовать параметр -x (скрипты).
pidof возвращает PID оболочки bash, а ps показывает, что запущены две оболочки. Одна — это оболочка, выполняющая команду pidof , а другая — оболочка, выполняющая сценарий.
Как найти PID с помощью команды pgrep в Linux
Команда pgrep немного похожа на pidof при получении идентификаторов процессов в Linux. Однако он не только находит процессы, точно соответствующие ключу поиска, но также возвращает PID любых процессов, имя которых содержит искомый текст.
Вот пример на компьютере, на котором запущен Firefox.
Все эти команды находят процесс Firefox и возвращают PID. Но если бы вы ввели команду:
Само по себе, как бы вы узнали, что pgrep нашел Firefox, а не, скажем, демона по имени preformd?
Если вы добавите параметр -l (имя списка), pgrep отобразит имя процесса рядом с PID.
Если существует несколько экземпляров совпадающего процесса, они все перечислены.
Обратите внимание, что они перечислены в порядке возрастания, что противоположно выходным данным pidof . Они перечислены от самого старого процесса к самому новому процессу. Как мы видели на примере pidof , не все перечисленные процессы обязательно принадлежат вам.
Параметр -u (идентификатор пользователя) позволяет вам искать процессы, соответствующие искомому тексту и принадлежащие указанному пользователю.
На этот раз мы видим в результатах три bash-процесса. Другой используется mary .
Мы можем объединить имена пользователей в виде списка, разделенного запятыми.
И мы можем попросить посмотреть все процессы для конкретного пользователя.
Чтобы увидеть полную командную строку, используйте параметр -a (полный список).
Несколько слов о владении PID
Не все системные процессы принадлежат пользователю root. Многие, конечно, но не все. Например, эта команда работает:
Но эта команда не работает.
Это не удается, потому что root не владеет этим процессом. Фактический владелец — системный пользователь по имени «avahi». При использовании правильного имени пользователя команда работает.
Это небольшая проблема, на которую стоит обратить внимание.
Linux Commands | |
Files | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc |
Processes | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap |
Networking | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld |
RELATED: Best Linux Laptops for Developers and Enthusiasts
ps — Process Status
ps command displays information related to the processes running in a Linux system.
PID — Unique process ID
TTY — Type of terminal that the user is currently logged in.
TIME — CPU time this process has consumed since it first started running. CMD — The command used to start the corresponding process.
ps with Arguments
If we pass arguments with a (-) dash then we will get the output in standard syntax. In contrast, if we pass arguments without any (-) dash then we will get output in BSD (Berkeley Software Distribution) syntax.
To view all running processes : ps -e or ps -A
To view full formated list of all running processes: ps -efL
We can use grep along with ps command to search for a specific process;
Let’s say we want to see our “httpd” server is running or not. We can do that in the following way:
To view all running processes by username and group:
To view the process tree. Within a process there can be multiple processes running, we can use ps -ejH to view the process tree:
In the above demonstration, we can see the process tree of the “sshd” process.
The most widely used ps command is ps aux : which will output all the running processes using the BSD syntax. The ps aux displays the most amount of information a user usually needs to understand the current state of their systems running processes.
ps aux provides additional information, such as :
%CPU CPU time used by this process (in percentage)
%MEM Physical memory used by this process (in percentage)
VSZ displays the amount of virtual memory being consumed by the process.
RSS is the actual physical wired-in memory that is being used.
START shows the date or time when the process was started.
TIME shows the total CPU time used by this process.
STAT displays the state of a process. The most common state codes are described below:
R: Running or runnable.
S: Interruptible sleep, waiting for an event to complete, such as input from
the terminal.
D: Uninterruptible sleep, processes that cannot be killed or interrupted with a signal, usually to make them go away you have to reboot or fix the issue.
Z: Zombies are terminated processes that are waiting to have their statuses collected.
T: Stopped, a process that has been suspended/stopped.
If you found this article helpful, please don’t forget to hit the Follow and Clap buttons to help me write more articles like this.
Thank You
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.
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.
There is a dedicated command that combines the features ps and grep command and it is unsurprisingly called pgrep:
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.
You may also use the top command to get the process information but it cannot be used in scripts.
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 $
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 $
Commands to find the PID and PPID of the current process.
This way, you can get the process ID of shell and subshell.
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.
Как узнать PID процесса в Linux
Каждый процесс в операционной системе имеет свой уникальный идентификатор, по которому можно получить информацию об этом процессе, а также отправить ему управляющий сигнал или завершить.
В Linux такой идентификатор называется PID, и узнать его можно несколькими способами. В этой статье мы рассмотрим, как узнать PID процесса в Linux, а также зачем это может вам понадобиться.
Как узнать pid процесса Linux
Самый распространённый способ узнать 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:
По умолчанию утилита ищет по командной строке запуска процесса, если нужно искать только по имени процесса, то надо указать опцию -f:
3. pidof
Эта утилита ищет PID конкретного процесса по его имени. Никаких вхождений, имя процесса должно только совпадать с искомым:
С помощью опции -s можно попросить утилиту выводить только один PID:
pidof -s apache2
4. pstree
Утилита pstree позволяет посмотреть список дочерних процессов для определённого процесса, также их pid-идентификаторы. Например, посмотрим дерево процессов Apache:
pstree -p | grep apache2
Как узнать PID скрипта
Когда вы запускаете скрипт в оболочке, например Bash запускается процесс известный как подоболочка и выполняет последовательно все команды скрипта. Чтобы узнать PID процесса подоболочки Bash, запущенной для скрипта, обратитесь к специальной переменной $$. Эта переменная доступна только для чтения, поэтому вы не сможете ее редактировать:
#!/bin/bash
echo «PID этого скрипта: $$»
Каким процессом занят файл Linux
Выше мы рассмотрели, как получить PID процесса Linux по имени, а теперь давайте узнаем PID по файлу, который использует процесс. Например, мы хотим удалить какой-либо файл, а система нам сообщает, что он используется другим процессом.
С помощью утилиты lsof можно посмотреть, какие процессы используют директорию или файл в данный момент. Например, откроем аудио-файл в плеере totem, а затем посмотрим, какой процесс использует её файл:
В начале строки мы видим название программы, а дальше идёт её PID. Есть ещё одна утилита, которая позволяет выполнить подобную задачу — это fuser:
Здесь будет выведен только файл и 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.