Как в Linux узнать PID процесса и убить его?
В операционных системах Linux каждый процесс имеет свой идентификатор (PID).
Выводим список всех процессов и смотрим их PID:
ps axu
Фильтруем по имени процесса, например apache2:
ps axu | grep apache2
Можно также посмотреть PID процесса выполнив команду:
pidof apache2
Список сигналов и их номеров которые можно послать процессу:
kill -l
Убиваем процесс (где PID — номер процесса, стандартно процессу шлется сигнал SIGTERM):
kill PID
Убиваем процесс с указанием сигнала (например 9):
kill -9 PID
Пример завершения процессов по имени:
killall apache2 killall -s 9 apache2
Справки по командам:
man ps man grep man pidof man kill man killall
Для завершения некоторых процессов могут потребоваться root права, тогда перед командами нужно дописывать sudo.
- Нажмите, чтобы открыть на Facebook (Открывается в новом окне)
- Нажмите, чтобы поделиться на Twitter (Открывается в новом окне)
- Нажмите, чтобы поделиться записями на Pinterest (Открывается в новом окне)
- Нажмите, чтобы поделиться на LinkedIn (Открывается в новом окне)
- Нажмите, чтобы поделиться записями на Tumblr (Открывается в новом окне)
- Нажмите, чтобы поделиться в Telegram (Открывается в новом окне)
- Ещё
- Нажмите, чтобы поделиться записями на Pocket (Открывается в новом окне)
- Нажмите, чтобы поделиться на Reddit (Открывается в новом окне)
- Нажмите, чтобы поделиться в WhatsApp (Открывается в новом окне)
- Нажмите для печати (Открывается в новом окне)
9 самых простых способов узнать идентификатор процесса (PID) в Linux
В основном, мы смотрим PID, чтобы убить невосприимчивую программу, и она похожа на диспетчер задач Windows.
Linux GUI также предлагает ту же функцию, но CLI – эффективный способ выполнения операции kill.
Что такое идентификатор процесса PID?
PID обозначает идентификационный номер процесса, который обычно используется большинством ядер операционной системы, таких как Linux, Unix, macOS и Windows.
Это уникальный идентификационный номер, который автоматически присваивается каждому процессу, когда он создается в операционной системе.
Процесс – это исполняемый экземпляр программы.
Каждый раз, идентификатор процесса будет получать изменения ко всем процессам, кроме init, поскольку init всегда является первым процессом в системе и является предком всех других процессов. Это PID – 1.
Максимальное значение PID по умолчанию – 32 768.
Это было проверено, выполнив следующую команду в системе
# cat/proc/sys/kernel/pid_max
В 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 является последним.
В моем случае это 3754.
Примечание. Если у вас есть несколько идентификаторов процесса, вы можете столкнуться с проблемой идентификации идентификатора родительского процесса при использовании команды 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.
Получить имя процесса, зная его pid
Задача следующая — хочу, чтобы в системе одновременно работал только 1 экземпляр моего демона. Для этого при старте создаю pid-файл, при корректном завершении удаляю его. Все работает.
Но вот что делать, если демон завершается некорректно? Хочу при последующем старте не только проверять наличие pid-файла, но и то, какой процесс сейчас живет (если живет) с этим pid-ом.
Проверку провожу из bash-скипта. Была идея читать /proc/$/status, но я не силен в выделении подстрок на bash (не понял, как получить имя из «Name: $»). Есть еще варианты? Или подскажите, как распарсить эту несчастную строку.
Как на linux узнать источник процесса?
Как узнать какой файл/скрипт запускает процесс ? В Windows просто открыть расположение файла, а в линукс ?
Нужно узнать откуда запускается этот cryptonight malware
mysite 224079 3.9 0.0 1883876 46716 ? Sl Sep26 3186:59 ./httpd -a cryptonight -o 178.32.145.31:8005 -u
- Вопрос задан более трёх лет назад
- 14205 просмотров
Комментировать
Решения вопроса 2
Посмотреть где лежит исполняемый файл процесса:
ll /proc//exe
Посмотреть кто его родитель:
ps -o ppid= -p
Ответ написан более трёх лет назад
Нравится 4 1 комментарий
Ао @darknefrit Автор вопроса
На 99% вопросов уже есть ответы в инетке.
Привет,
1. Сначала вывод процессовс разными вариантами по ключами, как кому надо. К примеру:
ps -aux
Читай:
man ps
2. Для того чтобы узнать где именно располагается файл, можно использовать:
pwdx PID
где PID это номер процесса.
Можно и через lsof узнать:
lsof -p PID | grep cwd
где PID это тот же номер процесса.