PID процесса в Linux: 4 способа найти и обезвредить любой процесс
Представьте: система вдруг начинает тормозить, или какой-то файл упорно не удаляется, выдавая загадочную ошибку. Виновником почти всегда является скрытый процесс, и чтобы им управлять, вам нужен его цифровой отпечаток — PID.
Это уникальный идентификатор, ключ к контролю над любым процессом в вашей системе. Без него вы не сможете ни отправить процессу сигнал, ни аккуратно его завершить, ни даже просто понять, что же именно нагружает ваш компьютер.
Мы подготовили для вас самое полное руководство по охоте на PID. Вы узнаете, как найти идентификатор по имени процесса, даже если вы помните лишь его часть. Мы покажем, как определить, какая программа заняла нужный вам сетевой порт или заблокировала важный файл.
Откройте для себя мощь команд `pgrep` и `pidof` для мгновенного поиска. Научитесь использовать `ps` и `pstree` для детального анализа. А для самых хитрых случаев, когда процесс лишь на секунду обращается к файлу, мы раскроем секрет использования подсистемы auditd.
Хватит гадать! Освойте эти методы, и вы получите полный контроль над тем, что происходит в недрах вашей операционной системы. Переходите к статье и превратитесь из пользователя в настоящего повелителя процессов!
Каждый процесс в операционной системе имеет свой уникальный идентификатор, по которому можно получить информацию об этом процессе, а также отправить ему управляющий сигнал или завершить.
В Linux такой идентификатор называется PID, и узнать его можно несколькими способами. В этой статье мы рассмотрим, как узнать PID процесса в Linux, а также зачем это может вам понадобиться.
Содержание статьи
- Как узнать pid процесса Linux
- Каким процессом занят файл Linux
- Кто использовал файл в Linux
- Какой процесс использует порт в Linux
- Выводы
Как узнать 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 по различным условиям: имени или файлу. Как видите, всё достаточно просто, и в считанные минуты можно можно понять, что происходит с вашей операционной системой, и какой процесс за это отвечает.