Поиск по сайту:

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


Чтобы убить процесс Linux, вам нужен его идентификатор или имя. Если все, что вы знаете, это порт, который он использует, можете ли вы его убить? Да, несколькими разными способами.

Процессы убийства

Иногда процесс Linux может перестать отвечать на запросы. Он может перестать работать правильно или продолжать работать, но игнорировать запросы на его отключение или начать потреблять память, ЦП или пропускную способность сети.

Какими бы ни были ваши мотивы, есть способы убить процесс из командной строки Linux. Классический метод заключается в использовании команды kill с идентификатором процесса, который вы хотите завершить. У команды kill есть несколько близких родственников. Команда pkill уничтожит процесс по имени, а killall уничтожит все процессы, которые могут быть найдены с общей частью имени.

Если все, что вы знаете о процессе, это то, что он использует порт на вашем компьютере, есть еще способы идентифицировать и убить его. В сетевых терминах «порт» может означать физическое соединение, в которое вы вставляете кабель с вилкой на конце, например сетевой кабель CAT5 или 6, или может означать программный порт.

Программный порт — это заключительная часть сетевого соединения. IP-адрес устройства идентифицирует компьютер или другое сетевое устройство. Приложения внутри компьютера используют разные порты. Они обеспечивают другой уровень детализации. Сетевой трафик поступил на правильный компьютер с использованием IP-адреса, и с помощью адресации портов он может быть доставлен правильному приложению.

Это похоже на то, как почта поступает в отель, затем сортируется и доставляется в соответствующие номера. IP-адрес подобен уличному адресу отеля, а номера комнат — номерам портов.

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

Создание соединений с помощью socat

Чтобы у нас было несколько подключений, которые нужно уничтожить, мы будем использовать socat для создания сетевых подключений с использованием разных протоколов. Вам необходимо установить socat . Чтобы установить его в Ubuntu, используйте эту команду:

sudo apt install socat

В Fedora используйте dnf:

sudo dnf install socat

На Manjaro вам нужно ввести:

sudo pacman -S socat

Синтаксис socat прост, хотя и несколько многословен. Нам нужно указать исходный и конечный адреса. Для каждого из них нам нужно указать протокол, IP-адрес и номер порта. Мы можем заменить STDIN или STDOUT в качестве источника или назначения.

Эта команда создает соединение между сокетом прослушивания TCP на порту 7889, IP-адресом обратной связи 127.0.0.1 и STDOUT. Амперсанд «&» запускает команду в фоновом режиме, поэтому мы сохраняем доступ к командной строке.

socat tcp-listen:7889,bind=127.0.0.1 stdout &

Мы создадим еще два подключения, чтобы у нас был небольшой выбор сокетов, использующих разные протоколы. Мы создадим соединение UDP и соединение SCTP. Единственная часть команды, которая меняется, — это протокол.

socat udp-listen:7889,bind=127.0.0.1 stdout &
socat sctp-listen:9999,bind=127.0.0.1 stdout &

Использование убийства

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

Чтобы перечислить детали процесса на порту 7889, который использует протокол TCP, мы используем параметр -i (интернет-адрес), как здесь.

lsof -i tcp:7889

PID этого процесса — 3141, и мы можем использовать его с kill:

sudo kill 3141

Мы можем сэкономить некоторые усилия, если будем использовать трубы. Если мы направим вывод lsof в awk и скажем awk искать строки, содержащие интересующий нас порт — 7889 — и напечатайте второе поле из этой строки, мы изолируем PID.

lsof -i tcp:7889 | awk '/7889/{print $2}'

Затем мы можем направить вывод из awk в команду kill, используя xargs. Команда xargs принимает входные данные по конвейеру и передает их другой команде в качестве параметров командной строки. Мы будем использовать xargs с командой kill.

lsof -i tcp:7889 | awk '/7889/{print $2}' | xargs kill

Мы не получаем никакой визуальной обратной связи. В типичном стиле Linux отсутствие новостей — это хорошая новость. Если вы хотите убедиться, что процесс завершен, вы можете использовать lsof еще раз.

lsof -i tcp:7889

Поскольку lsof ничего не сообщает, мы знаем, что такого соединения нет.

Мы можем удалить процесс, использующий протокол UDP, просто заменив «tcp» на «udp» в нашей предыдущей команде.

lsof -i udp:7889 | awk '/7889/{print $2}' | xargs kill

Однако lsof не распознает протокол SCTP.

lsof -i sctp:7889

Для этого мы можем использовать команду ss. Мы используем параметр -S (SCTP) для поиска сокетов SCTP, параметр -a (all) для поиска всех типов сокетов (прослушивание, принятие, подключен и т. д.) и параметр -p (процессы) для отображения сведений о процессе, использующем сокет.

ss -Sap

Мы можем проанализировать этот вывод с помощью grep и awk. Мы также могли бы разобрать его с помощью grep и некоторых регулярных выражений PERL, но этот способ намного проще для понимания. Если бы вы собирались использовать это более одного или двух раз, вы, вероятно, сделали бы из него псевдоним или функцию оболочки.

Мы направим выходные данные из ss в grep и найдем наш номер порта, 7889. Мы направим выходные данные из grep в <awk. В awk мы используем параметр -F (строка-разделитель), чтобы установить запятую «,» в качестве разделителя полей. Мы ищем строку, содержащую «pid=», и печатаем второе поле с разделителями-запятыми из этой строки.

ss -Sap | grep "7889" | awk -F',' '/pid=/{print $2}'

Это дало нам строку «pid=2859».

Мы можем снова передать это в awk, установить разделитель полей на знак равенства «=» и напечатать второе поле из этой строки, которая будет текст за знаком равенства.

ss -Sap | grep "7889" | awk -F',' '/pid=/{print $2}' | awk -F'=' '{print $2}'

Теперь мы изолировали идентификатор процесса. Мы можем использовать  xargs , чтобы передать PID в kill в качестве параметра командной строки.

ss -Sap | grep "7889" | awk -F',' '/pid=/{print $2}' | awk -F'=' '{print $2}' | xargs kill

Это убивает процесс, который использовал сокет протокола SCTP на порту 7889.

Команда фьюзера

Команда fuser значительно упрощает работу. Недостатком является то, что он работает только с сокетами TCP и UDP. С положительной стороны, это два наиболее распространенных типа сокетов, с которыми вам придется иметь дело. Команда fuser уже была установлена на проверенных нами компьютерах с Ubuntu, Fedora и Manjaro.

Все, что вам нужно сделать, это использовать опцию -k (kill) и указать порт и протокол. Вы можете либо использовать параметр -n (пространство имен) и указать протокол и порт, либо использовать «формат ярлыка с косой чертой» и указать номер порта первым.

fuser -n tcp 7889
fuser 7889/udp

Номер порта, протокол и PID завершенного процесса печатаются в окне терминала.

Сначала попробуйте фьюзер

Скорее всего, он будет установлен на компьютере, на котором вы работаете, и протокол, скорее всего, будет TCP или UDP, так что есть большая вероятность, что вам подойдет самый простой способ.