Гид по технологиям

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

• 5 min read • Системное администрирование • Обновлено 20 Nov 2025
Убить процесс по порту в Linux
Убить процесс по порту в Linux

Ноутбук с Linux, отображающий приглашение bash

Быстрые ссылки

  • 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 socat

Fedora:

sudo dnf install socat

Manjaro/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.

lsof не отображает SCTP-сокеты

Команда fuser — самый простой путь для TCP/UDP

fuser умеет искать процессы по порту и сразу убивать их. Минус: поддерживает только TCP и UDP, но это самые распространённые случаи.

Примеры:

fuser -n tcp 7889

или короткий формат:

fuser 7889/udp

Чтобы убить процессы на порту:

fuser -k 7889/tcp

fuser выведет 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 — лучше сначала уведомить команду и выполнить контролируемое выключение.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро