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

Быстрые ссылки
Killing Processes
Creating Connections With socat
Using Kill
The fuser Command
Try fuser First
Введение
Иногда процесс в Linux зависает, начинает потреблять ресурсы или ведёт себя подозрительно. Классический способ завершения процесса — команда kill с PID. Но что делать, если у вас есть только номер порта? Это можно исправить: по порту можно найти процесс и корректно (или принудительно) его завершить.
Коротко о терминах: порт — это программная «дверь», через которую приложение принимает сетевой трафик. IP адрес доставляет пакет на машину, порт — в приложение. Представьте: IP — адрес гостиницы, а номер комнаты — порт.
Создание тестовых подключений с помощью socat
Чтобы безопасно потренироваться, полезно создать слушатели на разных протоколах. Для этого используется socat. Установите его, если ещё нет:
Ubuntu/Debian:
sudo apt install socatFedora:
sudo dnf install socatManjaro/Arch:
sudo pacman -S socatПримеры создания слушателей (в фоне):
socat tcp-listen:7889,bind=127.0.0.1 stdout &socat udp-listen:7889,bind=127.0.0.1 stdout &socat sctp-listen:9999,bind=127.0.0.1 stdout &Эти команды создают локальные сокеты на указанных портах. Далее мы используем их, чтобы показать, как находить процессы.
Поиск процесса по порту и завершение с помощью kill
Если вы знаете PID, завершение простое:
sudo kill Но часто PID неизвестен. Для TCP/UDP можно использовать lsof — утилиту для списка открытых файлов, включающих сетевые сокеты.
Посмотреть процесс на tcp:7889:
lsof -i tcp:7889Если команда показывает строку с PID (в колонке PID), можно передать его в kill. Чтобы автоматизировать — используйте конвейер:
lsof -i tcp:7889 | awk '/7889/{print $2}' | xargs killАналогично для UDP:
lsof -i udp:7889 | awk '/7889/{print $2}' | xargs killПроверка: если lsof больше ничего не показывает для порта, соединение закрыто:
lsof -i tcp:7889Важно: иногда process может перезапускаться (например, сервисный менеджер). В таких случаях сначала остановите службу через systemctl или другой менеджер.
Когда нужен ss (SCTP и подробный вывод)
lsof не умеет показывать SCTP-сокеты. Для всех типов сокетов, включая SCTP, используйте ss. Пример вывода со списком процессов:
ss -SapЧтобы найти процесс по порту 7889 и извлечь PID, можно парсить вывод ss:
ss -Sap | grep "7889" | awk -F',' '/pid=/{print $2}' | awk -F'=' '{print $2}' | xargs killРазбор: в выводе ss строки с процессом содержат фрагмент pid=<число>, поэтому мы сначала фильтруем по порту, затем парсим pid= и передаём PID в kill.

Команда fuser — самый простой путь для TCP/UDP
fuser умеет искать процессы по порту и сразу убивать их. Минус: поддерживает только TCP и UDP, но это самые распространённые случаи.
Примеры:
fuser -n tcp 7889или короткий формат:
fuser 7889/udpЧтобы убить процессы на порту:
fuser -k 7889/tcpfuser выведет PID и протокол, который был затронут.
Важно: fuser завершает процессы, но не подскажет, является ли завершение безопасным. Сначала проверьте, не критичный ли это сервис.
Альтернативные подходы и предосторожности
- systemctl: если процесс — сервис systemd, сначала остановите его через systemctl stop
. Это корректнее, чем убивать PID. - docker/k8s: если процесс внутри контейнера — управляйте контейнерами (docker stop, kubectl delete pod), а не хостовыми PID.
- set -e для скриптов: при автоматизации добавляйте проверки, чтобы случайно не убить нужный процесс.
Важно: kill по PID убивает именно процесс с этим PID в текущем namespace. Если используется PID namespace (контейнеры), PID может относиться к контейнеру, а не к хосту.
Когда методы не сработают
- Процесс немедленно перезапускается системным менеджером (systemd, monit, supervisor). В таком случае нужно отключить автозапуск или остановить сервис через менеджер.
- Процесс находится в другом namespace — PID на хосте не соответствует PID внутри контейнера. Для контейнеров используйте инструменты управления контейнерами.
- Права: без sudo вы не увидите или не сможете убить процессы, принадлежащие другим пользователям.
Практические советы и ментальные модели
- Правило 1: если это системный сервис — используйте systemctl stop; если контейнер — остановите контейнер.
- Правило 2: для одного процесса сначала пытайтесь корректно завершить (SIGTERM), затем, при необходимости, SIGKILL.
- При расследовании: сначала lsof/ss → идентификация процесса → проверка owner и команды запуска → попытка корректного остановления → принудительное завершение.
Чек‑лист по ролям
Системный администратор:
- Проверить, не является ли сервис критичным.
- Остановить через systemctl или другой менеджер.
- Если нужно — выполнить graceful restart.
Разработчик/локальная машина:
- Проверить процессы через lsof/ss.
- Убить процесс локально (kill) и перезапустить приложение.
Оператор контейнеров:
- Найти контейнер с привязанным портом (docker ps / kubectl).
- Остановить/удалить контейнер через соответствующие команды.
Полезные сниппеты и алиасы
Алиас для быстрого поиска PID по TCP-порту с использованием lsof:
alias pidbytcp='lsof -i tcp:$1 | awk "\/$1\/{print \$2}"'Универсальный скрипт для TCP/UDP/SCTP (bash):
#!/bin/bash
PORT=$1
PROTO=${2:-tcp}
if [[ $PROTO == "sctp" ]]; then
ss -Sap | grep "$PORT" | awk -F',' '/pid=/{print $2}' | awk -F'=' '{print $2}' | xargs sudo kill
else
sudo fuser -k ${PORT}/${PROTO}
fiИспользуйте с sudo, проверив сначала вывод без -k, чтобы не убить нужный процесс случайно.
Краткий глоссарий
- PID — идентификатор процесса.
- Port — программный порт (номер) для сетевого соединения.
- lsof — список открытых файлов, включая сокеты.
- ss — утилита для отображения сокетов (замена netstat).
- fuser — демонстрирует процессы, использующие файл/порт.
Советы по безопасности и соответствию
- Логируйте операции остановки критичных сервисов и сохраняйте причину.
- В production сначала оцените влияние перед убийством процесса.
- Для данных пользователей/клиентов уведомляйте команду поддержки, если планируете принудительную остановку.
Критерии приёмки
- Процесс, занимавший порт, больше не отображается в lsof/ss для этого порта.
- Сервис, если он должен был быть остановлен, не запущен заново автоматически (или был корректно перезапущен контролируемым способом).
- Нет побочных эффектов для критичных сервисов.
Итог
По порту можно надёжно найти и завершить процесс в Linux: для TCP/UDP начните с fuser или lsof; для SCTP — используйте ss. Всегда проверяйте, что вы убиваете (owner, команда запуска) и предпочитайте корректное завершение через менеджер сервисов перед принудительным kill.
Важно: будьте осторожны в production — лучше сначала уведомить команду и выполнить контролируемое выключение.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента