Каждый процесс в операционной системе имеет свой уникальный идентификатор, по которому можно получить информацию об этом процессе, а также отправить ему управляющий сигнал или завершить.
В Linux такой идентификатор называется PID, и узнать его можно несколькими способами. В этой статье мы рассмотрим, как узнать PID процесса в 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
Каким процессом занят файл 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'