Идентификатор процесса Process ID (PID). Как убить процесс Linux Как остановить процесс с помощью killall

Как бы там ни было, но некоторые приложения в Linux иногда зависают. При этом бывают ситуации, когда приложение вообще не отзывается, либо работает так медленно, что корректно завершить его работу не представляется возможным. Чтобы оперативно выйти из получившейся ситуации можно «убить» данный процесс. Для этог используеются команды kill и killall . Сейчас мы разберемся как использоваться эти команды, находить PID процесса и посылать сигнал SIGKILL.

Чтобы избежать путацины, договоримся под процессом понимать запущенную в систему программу. Например, если у вас запушено несколько окон браузера Mozilla Firefox — это значит, что запущено три процесса.

Определить PID процесса — команда pidof

PID — уникальный идентификатор процесса в системе Linux . Чтобы корректно выполнить остановку процесса сначала стоит определить его PID. Для этого используются команды ps и grep. В свою очередь команда ps предназначена для вывода списка активных процессов в системе и информации о них. Команда grep запускается одновременно с ps (в канале) и будет выполнять поиск по результатам команды ps. Вывести список всех процессов можно, выполнив в командной строке:

Разумеется, PID можно определить и через top . Но в большинстве случаев количество процессов слишком велико (и динамически меняется в top), поэтому быстро и правильно определить PID не так уж и просто. Как раз для этого используется команда grep. Например, для завершения процесса браузера Google Chrome необходимо выполнить следующую команду:

ps axu | grep chrome

$ ps axu | grep chrome
itechf2 20474 2.7 1.5 938416 120136 tty2 Sl+ 11:07 0:00 /opt/google/chrome/chrome

В нашем случае 20474 и есть искомый PID. Более простой способ — использовать команду pidof , при этом необходимо указывать имя процесса. Например:

$ pidof chrome
20728 20706 20668 20647 20586 20574 20553 20508 20474

Завершить процесс в Linux — команды kill и killall

Завершить процесс в операционной системе Linux , зная его PID, можно командой kill . Стоит знать и понимать: команда kill предназначена для посылки сигнала процессу. По умолчанию, если мы не указываем какой сигнал посылать, посылается сигнал SIGTERM (от слова termination - завершение). SIGTERM указывает процессу на то, что необходимо завершиться. Каждый сигнал имеет свой номер. SIGTERM имеет номер 15. Список всех сигналов (и их номеров), которые может послать команда kill, можно вывести, выполнив kill -l . Чтобы послать сигнал SIGKILL (он имеет номер 9) процессу 2811, выполните в командой строке:

При этом, сигнал SIGTERM может и не остановить процесс (например, при перехвате или блокировке сигнала), SIGKILL же выполняет уничтожение процесса всегда, так как его нельзя перехватить или проигнорировать.

Команда killall в Linux предназначена для «убийства» всех процессов, имеющих одно и то же имя. Это удобно, так как нам не нужно знать PID процесса. Например, мы хотим закрыть все процессы с именем chrome. Выполните в терминале:

Команда killall, также как и kill, по умолчанию шлет сигнал SIGTERM. Чтобы послать другой сигнал нужно воспользоваться опцией -s . Например:

Сегодня мы поговорим о том, как в Ubuntu Linux справляться с процессами которые зависли и вы не можете их завершить. Они пожирают системные ресурсы загружая систему, отжирая приличную часть оперативной памяти, чем создают такие проблемы как торможение в работе компьютера либо частичному зависанию системы на краткие отрезки времени. Ситуации бывают разные, бывает зависнет рабочий стол, бывает приложение зависнет, иногда и окружение рабочего стола зависает, именно с данных ситуаций мы будем искать выход как обойтись без перезагрузки системы и не выключать компьютер кнопкой на системном блоке компьютера так как это не есть хорошим решением.

Иногда возникает потребность убить процесс в Ubuntu Linux, как это правильно выполнить и не навредить, обсудим как консольные варианты решения так и через графический интерфейс.

Сегодня мы поговорим о том, как в Ubuntu Linux справляться с процессами которые зависли и вы не можете их завершить. Они пожирают системные ресурсы загружая систему, отжирая приличную часть оперативной памяти, чем создают такие проблемы как торможение в работе компьютера либо частичному зависанию системы на краткие отрезки времени. Ситуации бывают разные, бывает зависнет рабочий стол, бывает приложение зависнет, иногда и окружение рабочего стола зависает, именно с данных ситуаций мы будем искать выход, как обойтись без перезагрузки системы и не выключать компьютер кнопкой на системном блоке компьютера так как это не есть хорошим решением.

При работе с Ubuntu Linux у вас вероятно уже возникали вопросы:

Как определить PID чтобы в последующем убить процесс / приложение

Если вы не хотите запускать команду top или же другой более мощный ее аналог htop , далее утруждать себя поисками айди того или иного айди процесса, есть более простой выход / решение, чтобы найти PID процесса можно использовать команду "pidof " или "PS ".

Допустим нам нужно узнать айди процесса приложения Google Chrome, что мы делаем в данной ситуации, откройте терминал Ctrl + Alt + T и выполняем в терминале команду:

Pidof chrome

получаем вывод:

9497 9183 9123 8815 8788 6042 6033 5938 5916 5911 5908 5900 5892 5836 5831 5819

почти готово, PID мы определили, о том как убить процесс, читаем ниже.

Как убить процесс в Linux по PID

Мы определили какой PID в приложения которое мы хотим убить, с описанного выше, вы видите, что у меня запущено сейчас в браузере много вкладок и плюс отдельные процессы браузера, в итоге 16 айди, чтобы убить их все, выполняем команду:

Sudo kill 9497 9183 9123 8815 8788 6042 6033 5938 5916 5911 5908 5900 5892 5836 5831 5819

так же вы можете в системе посмотреть все активные процессы выполнив команду:

Sudo ps axu

да, вот так просто. Вместо Chrome может быть любое другое приложение, skype или еще какое другое.

Так же можно использовать дополнительную команду для обнаружения айди процесса приложения которое вы хотите убить:

Ps -A | grep -i name-app

вместо name-app пишем название приложения, не вводите полное название вручную, используйте автоопределение с помощью клавиш "TAB ". В итоге эта команда выведет время работы необходимого процесса и соответственно его PID , который вы можете использовать чтобы убить, давайте проверим работу команды выполним в терминале:

Ps -A | grep -i skype

получаем следующий результат:

9257 ? 00:00:57 skype

все что нам нужно как на ладони, есть айди так же видим сколько времени данный процесс уже работает.

Как использовать команду Kill в Linux

О том как получить идентификатор PID я описал уже выше, далее нам остается лишь использовать этот PID совместно с kill чем мы убьем неугодный нам процесс, смотрим детали немного ниже.

Айди получили и можем теперь убить приложение:

Sudo kill 9257

вот и все, приложение убито.

Как убить процесс в Linux по имени

Чтобы убить процесс по имени можно использовать команду killall, вы прежде всего должны понимать, что данная команда убивает все процессы которые имеют одно и то же имя. Это очень удобно, так как в данной ситуации нам не нужно искать PID необходимого нам процесса, например мы хотим закрыть приложение скайп, выполним в терминале команду:

Sudo killall skype

так же вариант:

Sudo killall -s 9 skype

в тот же миг приложение прекращает свою работу, вот так легко можно убить неугодные вам процессы.

Команда смерти, что не стоит выполнять в терминале

Я ранее писал материал о вредных советах, какие команды не стоит выполнять в терминале чтобы не убить систему, но список не совершенен и его можно дополнить еще многими командами, одну с которых вы найдете ниже.

Приведу пример команды смерти:

Sudo kill -9 -1

это команда убьет все запущенные на данный момент процессы. Не советовал бы ее выполнять так как последствия могут быть непредсказуемые и вероятней всего придется перезапускать систему без графического интерфейса. На случай вдруг откажет графический интерфейс, тогда открываем терминал с помощью команд CTRL+ALT+F1 , каждое новое окно открывается по той же аналогии просто меняется F1 уже на F2 и так далее.

Получить справку по командам которые использовались выше, вы так же можете через терминал выполнив команды:

Man ps man grep man pidof man kill man killall

На этом наш краткий материал окончен, если вам что-то не понятно, спрашивайте в комментариях к материалу ниже.


В этой статье мы попытаемся создать модуль ядра, способный изменить PID уже запущенного процесса в ОС Linux, а так же поэкспериментировать с процессами, получившими измененный PID.


Предупреждение : смена PID - нестандартный процесс, и при определенных обстоятельствах может привести к панике ядра.

Наш тестовый модуль будет реализовывать символьное устройство /dev/test, при чтении с которого процессу будет изменен PID. За пример реализации символьного устройства спасибо этой статье. Полный код модуля приведен в конце статьи. Конечно, самым правильным решением было добавить системный вызов в само ядро, однако это потребует перекомпиляцию ядра.

Окружение

Все действия по тестированию модуля выполнялись в виртуальной машине VirtualBox с 64 битным дистрибутивомLInux и версией ядра 4.14.4-1. Связь с машиной осуществлялась с помощью SSH.

Попытка #1 простое решение

Пару слов о current : переменная current указывает на структуру task_struct с описанием процесса в ядре(PID, UID, GID, cmdline, namespaces и т.д)

Первой идеей было просто поменять параметр current->pid из модуля ядра на нужный.

Static ssize_t device_read(struct file *filp, char *buffer, size_t length, loff_t * offset) { printk("PID: %d.\n",current->pid); current->pid = 1; printk("new PID: %d.\n",current->pid); , }
Для проверки работоспособности модуля я написал программу на C++:

#include #include #include int main() { std::cout << "My parent PID " << getppid() << std::endl; std::cout << "My PID " << getpid() << std::endl; std::fstream f("/dev/test",std::ios_base::in); if(!f) { std::cout << "f error"; return -1; } std::string str; f >> str; std::cout << "My new PID " << getpid() << std::endl; execl("/bin/bash","/bin/bash",NULL); }
Загрузим модуль коммандой insmod, создадим /dev/test и попробуем.

# ./a.out My parent PID 293 My PID 782 My new PID 782
PID не изменился. Возможно, это не единственное место, где указывается PID.

Попытка #2 дополнительные поля PID

Если не current->pid является идентификатором процесса, то что является? Быстрый просмотр кода getpid() навел на структуру task_struct , описывающую процесс Linux и файл pid.c в исходном коде ядра. Нужная функция - __task_pid_nr_ns. В коде функции встречается обращение task->pids.pid, этот параметр мы и изменим

Компилируем, пробуем

Так как тестировал я по SSH, мне удалось получить вывод программы до падения ядра:

My parent PID 293 My PID 1689 My new PID 1689
Первый результат, уже что-то. Но PID все равно не изменился.

Попытка #3 не экспортируемые символы ядра

Более внимательное изучение pid.c дало функцию, которая делает то, что нам нужно
static void __change_pid(struct task_struct *task, enum pid_type type,
struct pid *new)
Функция принимает задачу, для которой надо изменить PID, тип PID и, собственно, новый PID. Созданием нового PID занимается функция
struct pid *alloc_pid(struct pid_namespace *ns)

Эта функция принимает только пространство имен, в котором будет находиться новый PID, это пространство можно получить с помощью task_active_pid_ns .
Но есть одна проблема: эти символы ядра не экспортируются ядром и не могут использоваться в модулях. В решении этой проблемы мне помогла замечательная . Код функции find_sym взят оттуда.

Static asmlinkage void (*change_pidR)(struct task_struct *task, enum pid_type type, struct pid *pid); static asmlinkage struct pid* (*alloc_pidR)(struct pid_namespace *ns); static int __init test_init(void) { printk(KERN_ALERT "TEST driver loaded!\n"); change_pidR = find_sym("change_pid"); alloc_pidR = find_sym("alloc_pid"); ... } static ssize_t device_read(struct file *filp, char *buffer, size_t length, loff_t * offset) { printk("PID: %d.\n",current->pid); struct pid* newpid; newpid = alloc_pidR(task_active_pid_ns(current)); change_pidR(current,PIDTYPE_PID,newpid); printk("new PID: %d.\n",current->pid); ... }
Комплируем, запускаем

My parent PID 299 My PID 750 My new PID 751
PID изменен! Ядро автоматически выделило нашей программе свободный PID. Но можно ли использовать PID, который занял другой процесс, например PID 1? Добавим после аллокации код

Newpid->numbers.nr = 1;
Комплируем, запускаем

My parent PID 314 My PID 1172 My new PID 1
Получаем настоящий PID 1!

Bash выдал ошибку, из-за которой не будет работать переключение задач по комманде %n, но все остальные функции работают отлично.

Интересные особенности процессов с измененным PID

PID 0: войти нельзя выйти

Вернемся к коду и изменим PID на 0.

Newpid->numbers.nr = 0;
Комплируем, запускаем

My parent PID284 My PID 1517 My new PID 0
Выходит PID 0 не такой и особенный? Радуемся, пишм exit и…

Ядро падает! Ядро определило нашу задачу как IDLE TASK и, увидев завершение, просто упало. Видимо, перед завершением наша программа должна вернуть себе «нормальный» PID.

Процесс-невидимка

Вернемся к коду и выставим PID, гарантированно не занятый
newpid->numbers.nr = 12345;

Комплируем, запускаем

My parent PID296 My PID 735 My new PID 12345
Посмотрим, что находится в /proc

1 148 19 224 288 37 79 86 93 consoles fb kcore locks partitions swaps version 10 149 2 226 29 4 8 87 acpi cpuinfo filesystems key-users meminfo sched_debug sys vmallocinfo 102 15 20 23 290 5 80 88 asound crypto fs keys misc schedstat sysrq-trigger vmstat 11 16 208 24 291 6 81 89 buddyinfo devices interrupts kmsg modules scsi sysvipc zoneinfo 12 17 21 25 296 7 82 9 bus diskstats iomem kpagecgroup mounts self thread-self 13 176 210 26 3 737 83 90 cgroups dma ioports kpagecount mtrr slabinfo timer_list 139 18 22 27 30 76 84 91 cmdline driver irq kpageflags net softirqs tty 14 182 222 28 31 78 85 92 config.gz execdomains kallsyms loadavg pagetypeinfo stat uptime
Как видим /proc не определяет наш процесс, даже если мы заняли свободный PID. Предыдущего PID тоже нет в /proc, и это весьма странно. Возможно, мы находимся в другом пространстве имен и поэтому не видны основному /proc. Смонтируем новый /proc, и посмотрим что там

1 14 18 210 25 291 738 81 9 bus devices fs key-users locks pagetypeinfo softirqs timer_list 10 148 182 22 26 296 741 82 90 cgroups diskstats interrupts keys meminfo partitions stat tty 102 149 19 222 27 30 76 83 92 cmdline dma iomem kmsg misc sched_debug swaps uptime 11 15 2 224 28 37 78 84 93 config.gz driver ioports kpagecgroup modules schedstat sys version 12 16 20 226 288 4 79 85 acpi consoles execdomains irq kpagecount mounts scsi sysrq-trigger vmallocinfo 13 17 208 23 29 6 8 86 asound cpuinfo fb kallsyms kpageflags mtrr self sysvipc vmstat 139 176 21 24 290 7 80 87 buddyinfo crypto filesystems kcore loadavg net slabinfo thread-self zoneinfo
По прежнему нашего процесса нет, а значит мы в обычном пространстве имен. Проверим

Ps -e | grep bash
296 pts/0 00:00:00 bash

Только один bash, с которого мы и запускали программу. Ни предыдущего PID, ни текущего в списке нет.

Бывают такие моменты, когда приложение начинает глючить, и вместе с ним и все рабочее окружение, конечно, можно и перезагрузить компьютер, и исправность сама по себе улетучиться, но это не вариант каждый раз перезагружать свой компьютер. И для этого существует команда Kill , которая поможет вам, остановить зависший процесс.

Команда Kill может быть использована, чтобы убить или прекратить процесс, используя “Signal” или “PID”. Команда Kill посылает указанный сигнал чтобы завершить некорректно ведущее себя приложение. Если не указан ни один сигнал, посылается сигнал TERM. Этот сигнал TERM будет убивать процессы, которые не поймают его; для других процессов может быть необходимо использовать сигнал Kill (номер 9), так как этот сигнал не может быть перехвачен.

SIGTERM – это сигнал который запрашивает остановку работы процесса. Этому процессу дается некоторое время на завершение работы.

Ну а с помощью сигнала SIGKILL мы можем заставить процесс прекратить работу немедленно. И Программа не имеет права проигнорировать этот сигнал, и завершает работу приложения.

Ниже приведен формат команды Kill:

kill [ -signal | -s signal ] pid …

Самый простой способ убить процесс, это найти PID ресурса, а затем запустить PID, как аргумент с командой Kill.

Что такое PID?

Каждому процессу Linux или Unix или выполняемой программе, автоматически присваивается идентификационный номер уникального процесса (PID). PID автоматически присваивает номер для каждого процесса в системе.

Вы можете найти PID ресурса с использованием команды “pidof” или команды “ps”. Чтобы узнать PID процесса (скажем, firefox), используйте следующую команду

Pidof firefox

Вы также можете использовать команду в другой форме:

Ps -A | grep -i firefox

В приведенном выше примере, выводится число “23814” которое и является PID процесса firefox. После того, как PID процесса (firefox) вам известно, вы можете использовать команду Kill, чтобы убить процесс (Firefox), как показано ниже.

Kill 23814

Когда команда выполняет уничтожение, то есть она посылает сигнал процессу, чей PID передается вместе с командой в качестве аргумента.

Чтобы быть более конкретным, то команда Kill имеет следующие формы:

  • kill PID
  • kill -15 PID
  • kill -9 PID
  • kill -SIGTERM PID
  • kill -SIGTERM PID

Команда Kill имеет следующие коды возврата:

  • 0 – при успехе
  • 1 – неудача
  • 64 – частичный успех (если указано более одного процесса)

Еще одна команда, которую вы можете использовать, это KillAll . Killall также использует имя процесса вместо PID и завершает все экземпляры процесса с этим именем. Например, если вы запустили несколько экземпляров Firefox, вы можете завершить их все с помощью команды

Killall firefox

Для X-сервера, есть еще одна команда называется Xkill , которая может убивать процессы. Команда Xkill предназначена для графического режима, без прохождения имени процесса или его PID, то есть если вы запустите в терминале

В основном, мы смотрим 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), кумулятивное время процессора в формате 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: Starting The Apache HTTP Server... Sep 25 10:03:28 ubuntu systemd: Started The Apache HTTP Server.