- How to find the Process ID (PID) of a running terminal program?
- 11 Answers 11
- Работа с процессами в Linux
- Список процессов
- Ключи
- Примеры
- Убить процесс
- Подробная информация о процессе
- Потребление ресурсов процессами
- Как узнать PID процесса в Linux
- Как узнать pid процесса Linux
- 1. ps
- 2. pgrep
- 3. pidof
- 4. pstree
- Как узнать PID скрипта
- Каким процессом занят файл Linux
- Кто использовал файл в Linux
- Какой процесс использует порт в Linux
- Выводы
How to find the Process ID (PID) of a running terminal program?
I am running a program in the terminal that I can’t escape with Ctrl — C and that I want to kill. How can I find its PID?
This is a branch of What should I do when Ubuntu freezes? as a reference to prevent details in that question from becoming too technical.
11 Answers 11
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 kill ed, 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.
Работа с процессами в Linux
Обновлено: 29.03.2023 Опубликовано: 09.11.2017
Список процессов
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 — текущее состояние процесса. Могут принимать значения:
- R — выполнимый процесс;
- S — спящий;
- D — в состоянии подкачки на диске;
- T — остановлен;
- Z — зомби.
- W — не имеет резидентных страниц;
- < —высоко-приоритетный;
- N — низко-приоритетный;
- L — имеет страницы, заблокированные в памяти.
- START — дата запуска процесса.
- TIME — время запуска процесса.
- COMMAND — команда, запустившая процесс.
Ключи
Ключ | Описание |
---|---|
-A | Все процессы. |
-a | Запущенные в текущем терминале, кроме главных системных. |
-d | Все, кроме главных системных процессов сеанса. |
-e | Все процессы. |
f | Показать дерево процессов с родителями. |
T | Все на конкретном терминале. |
a | Все, связанные с текущим терминалом и терминалами других пользователей. |
r | Список только работающих процессов. |
x | Отсоединённые от терминала. |
u | Показать пользователей, запустивших процесс. |
Примеры
Поиск процесса с помощью grep:
Убить процесс
Останавливаем процесс по его PID:
Если процесс не завершается, убиваем его принудительно:
Остановить все процессы с именем nginx:
Как и в случае с kill, можно это сделать принудительно:
Можно остановить все процессы конкретного пользователя:
Ищем процесс по имени, извлекаем его PID и завершаем его:
kill `ps aux | grep ‘apache’ | awk »`
* обратите внимание, что запрос может вывести несколько процессов, которые будут попадать под критерии поиска — в таком случае, они будут завершены все.
Подробная информация о процессе
Для каждого процесса создается каталог по пути /proc/ , в котором создаются папки и файлы с описанием процесса.
Примеры использования /proc/
Адрес в ячейках оперативной памяти, которые занял процесс:
Команда, которой был запущен процесс:
Символьная ссылка на рабочий каталог процесса:
Символьная ссылка на исполняемый файл, запустивший процесс:
Увидеть ссылки на дескрипторы открытых файлов, которые затрагивает процесс:
Подробное описание на сайте man7.org.
Потребление ресурсов процессами
Для просмотра статистики потребления ресурсов используем утилиту 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 — команда, которая запустила процесс.
Как узнать PID процесса в Linux
Каждый процесс в операционной системе имеет свой уникальный идентификатор, по которому можно получить информацию об этом процессе, а также отправить ему управляющий сигнал или завершить.
В 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:
По умолчанию утилита ищет по командной строке запуска процесса, если нужно искать только по имени процесса, то надо указать опцию -f:
3. pidof
Эта утилита ищет PID конкретного процесса по его имени. Никаких вхождений, имя процесса должно только совпадать с искомым:
С помощью опции -s можно попросить утилиту выводить только один PID:
4. pstree
Утилита pstree позволяет посмотреть список дочерних процессов для определённого процесса, также их pid-идентификаторы. Например, посмотрим дерево процессов Apache:
Как узнать 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 же его придётся установить командой:
Теперь создаём правило для мониторинга. Например, отследим, кто запускает утилиту who:
auditctl -w /usr/bin/who -p x -k who_exec
Здесь -w — адрес файла, который мы будем отслеживать, —p — действие, которое нужно отслеживать, —k — произвольное имя для правила. В качестве действия могут использоваться такие варианты:
Теперь выполним один раз who и посмотрим, что происходит в логе с помощью команды ausearch:
sudo ausearch -i -k who_exec
Здесь в секции SYSCALL есть PID процесса, под которым была запущена программа, а также PPID — программа, которая запустила нашу who. Копируем этот PID и смотрим информацию о нём с помощью ps:
Становиться понятно, что это bash.
Какой процесс использует порт в Linux
Иногда необходимо узнать PID Linux-программы, которая использует сетевой порт, например 80. Для этого можно использовать утилиту ss:
Мы видим, что это несколько процессов Apache. Использовав опцию dport, можно узнать, какой процесс отправляет данные на указанный порт:
Выводы
В этой статье мы рассмотрели, как узнать PID процесса в Linux по различным условиям: имени или файлу. Как видите, всё достаточно просто, и в считанные минуты можно можно понять, что происходит с вашей операционной системой, и какой процесс за это отвечает.
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.