Как убить процесс, работающий на определенном порту в Linux?

764

Я пытался закрыть Tomcat, используя ./shutdown.shиз /binкаталога Tomcat . Но обнаружил, что сервер не был закрыт должным образом. И, таким образом, я не смог перезапустить
Мой кот работает по порту 8080.

Я хочу убить запущенный процесс Tomcat 8080. Сначала я хочу получить список процессов, запущенных на определенном порту (8080), чтобы выбрать, какой процесс нужно убить.

veer7
источник
2
возможно дубликат сценария оболочки, чтобы убить процесс прослушивания на порт 3000?
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功

Ответы:

940

Это fuser 8080/tcpнапечатает вам PID процесса, связанного с этим портом.

И это fuser -k 8080/tcpубьет этот процесс.

Работает только на Linux. Более универсальным является использование lsof -i4(или 6 для IPv6).

nudzo
источник
2
это также закрывает возможный подключенный разъем к 8080?
Ferra
9
Это не правильно закрыть порт. Порт переводится в состояние TIME_WAIT после завершения родительского процесса. Затем ОС в конечном итоге полностью закроет порт примерно через 60 секунд. Это означает, что вы не можете повторно использовать порт в течение как минимум 60 секунд (если вы не предоставите опцию повторного использования сокету).
Марк Лаката
2
На Дарвине, должно быть, используется другая версия fuser. Только берет файл, не поддерживает -k.
ар
3
'fuser -k -n tcp 8080' также убьет процесс
Хешам Яссин,
7
@dbliss fuser является частью psmisc. В случае, если вы получаете fuser: command not found, установите psmisc. Для CentOS / RHEL 7, запуститеsudo yum install psmisc
Том
701

Чтобы перечислить любой процесс, прослушивающий порт 8080:

lsof -i:8080

Чтобы убить любой процесс, прослушивающий порт 8080:

kill $(lsof -t -i:8080)

или более насильственно:

kill -9 $(lsof -t -i:8080)

( -9соответствует SIGKILL - terminate immediately/hard killсигналу: см. « Список сигналов убийства» и « Какова цель опции -9 в команде kill?» . Если сигнал не указан kill, сигнал TERM aka -15or soft killотправляется, чего иногда недостаточно для уничтожения). процесс.).

Франк Дернонкур
источник
9
kill: использование: kill [-s sigspec | -n Signum | -sigspec] pid | jobspec ... или kill -l [sigspec] Это то, что я получаю, когда
выполняю
2
@SudhirBelagali сделал это с супер-пользователемsudo
Марсель Джаман
5
Работал и на моем Mac
asherbar
2
Я хотел бы добавить, что иногда у вас нет прав для просмотра идентификатора процесса, в этом случае вам нужно это сделать sudo lsof -i:8080.
Akavall
1
почему вторые советы более жестокие?
веб-женщина
282

Используйте команду

 sudo netstat -plten |grep java

используется grep javaкак tomcatиспользует в javaкачестве своих процессов.

Он покажет список процессов с номером порта и идентификатором процесса

tcp6       0      0 :::8080                 :::*                    LISTEN      
1000       30070621    16085/java

число перед /javaявляется идентификатором процесса. Теперь используйте killкоманду, чтобы убить процесс

kill -9 16085

-9 подразумевает, что процесс будет убит принудительно.

veer7
источник
11
Вы можете добавить, что для получения имен процессов могут потребоваться права суперпользователя netstat.
Йонас Шефер
2
@JonasWielicki вы можете видеть те, которые у вас есть, без привилегий root.
ДБЛИС
Мне нужны права root для netstat. Есть ли способ узнать, откуда произошел этот процесс? Насколько я могу судить, я закрыл все приложения, но, возможно, это было из окна терминала, где я случайно переместил процессы в фоновую задачу. Может быть, мне следовало
запустить
151

Я бы добавил эту однострочную строку, чтобы убить только LISTEN на конкретном порту:

kill -9 $(lsof -t -i:3000 -sTCP:LISTEN)

Гал Брача
источник
9
Я думаю, что это должен быть лучший ответ. Спасибо @Gal Bracha
Сэм Ка Чиин
2
Это лучшее решение, потому что оно не убивает и мой браузер!
Руссо
Лучший ответ! Просто, лаконично и правильно делает свою работу.
Царь Бомба
117

Вы можете использовать команду lsof. Пусть номер порта как здесь 8090

lsof -i:8090

Эта команда возвращает список открытых процессов на этом порту.

Что-то вроде…

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ssh 75782 eoin 5u IPv6 0x01c1c234 0t0 TCP localhost:8090 (LISTEN)

Чтобы освободить порт, убейте процесс, используя его (идентификатор процесса - 75782)…

kill -9 75782

Этот работал для меня. вот ссылка из оригинального поста: ссылка

Kop4lyf
источник
1
для принудительного завершения процесса вам нужно будет использовать -9, например kill -9 75782; так как иногда некоторые процессы не
убиваются
74

Если вы хотите уничтожить процесс, запущенный на порту 8080, то сначала вам нужно найти идентификационный номер процесса порта (PID) 8080, а затем уничтожить его. Выполните следующую команду, чтобы найти 8080 номер порта PID:

sudo lsof -t -i:8080

Вот,

  • sudo - команда для запроса прав администратора (идентификатор пользователя и пароль).
  • lsof - список файлов (также используется для отображения связанных процессов)
  • -t - показать только идентификатор процесса
  • -i - показывать только процесс подключения к интернету
  • : 8080 - показывать только процессы с этим номером порта

Теперь вы можете легко убить свой PID с помощью следующей команды:

sudo kill -9 <PID>

Вот,

  • kill - команда, чтобы убить процесс
  • -9 - насильно

Вы можете использовать одну команду, чтобы убить процесс на определенном порту, используя следующую команду:

sudo kill -9 $(sudo lsof -t -i:8080)

Для получения дополнительной информации вы можете увидеть следующую ссылку Как убить процесс на конкретном порту в Linux

Махфуз
источник
Спасибо друг. sudo kill -9 $(sudo lsof -t -i:8080)работал для меня
Джунаид
70

Лучший способ убить все процессы на определенном порту;

kill -9 $(sudo lsof -t -i:8080)
Berkay Kırmızıoğlu
источник
1
Работал! Спасибо.
Фред
Это сработало !, Спасибо.
Джейлерс
Чудесно простое решение с использованием подоболочки. Спасибо!
Джейсон Р Стивенс CFA
не может запрашивать пароль
Kuldeep Yadav
41

Это печатает, чтобы выводить идентификаторы процесса всего, что работает <port_number>:

fuser -n tcp <port_number> 

Он также печатает некоторые вещи в stderr, поэтому:

fuser -n tcp <port_number> 2> /dev/null

Затем мы можем предоставить эти идентификаторы процесса killкоманде:

sudo kill $(fuser -n tcp <port_number> 2> /dev/null)

Вы также можете поместить это в функцию, если вы делаете это много:

function killport() {
    sudo kill $(fuser -n tcp $1 2> /dev/null)
}
Брайан Петерсон
источник
35

Получить PID задания и убить его.

lsof -ti:8080 | xargs kill
Рахул Гарг
источник
Спасибо за ответ. Очень плавно работает в Mac OS. Вы самые лучшие. Просто голосуй.
AMIC MING
1
Хорошо работает с портами портов тоже вроде lsof -ti:8080-8089 | xargs kill.
dvlsg
34

Чтобы узнать PID службы, работающей на конкретном порту:

netstat -tulnap | grep :*port_num*

вы получите описание этого процесса. Теперь используйте kill или kill -9 pid. Легко убит.

например

netstat -ap | grep :8080

tcp6       0      0 :::8080       :::*    LISTEN      1880/java 

Сейчас же:

kill -9 1880

Не забудьте запустить все команды как root

Санджай с.
источник
30

Один лайнер

kill -9 $(lsof -t -i tcp:8080)

объяснение здесь: используйте комбинацию lsof and kill

root@localhost:~# lsof -i tcp:8080
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
java    23672 sine  238u  IPv6 3028222      0t0  TCP localhost:http-alt (LISTEN)

выберите pid и используйте kill

kill 23672
dlmeetei
источник
22

попробуй так,

 sudo fuser -n tcp -k 8080
Адиль Аббаси
источник
16

Выберите номер порта и примените команду grep in netstat, как показано ниже

netstat -ap | grep :7070

Консольный выход

tcp 0 0 ::: 7070 ::: * СЛУШАТЬ 3332 / Java

Убить сервис на основе PID (идентификационный номер процесса)

kill -9 3332
Лова Читтумури
источник
13
  1. lsof -i tcp:8000 Эта команда выводит информацию о процессе, запущенном в порту 8000

  2. kill -9 [PID] Эта команда убивает процесс

Нандхита Рамарадж
источник
Я только что заметил, что несколько недель назад я случайно проголосовал за это, если вы немного отредактируете свой ответ, я смогу удалить его
Робин Гуди
12

Linux : Сначала вы можете найти PID этой команды, если знаете порт:

netstat -tulpn 

пример:-

 Local Address  Foreign Address  State    PID/Program name

  :::3000       :::*             LISTEN    15986/node 

Затем вы берете процесс убийства. выполните следующую команду:

убить -9 PID

Пример: -

убить -9 15986

Кундан Кумар
источник
10

Linux : Вы можете использовать эту команду, если знаете порт:

netstat -plten | grep LISTEN | grep 8080

AIX :

netstat -Aan | grep LISTEN | grep 8080

Затем вы берете первый столбец (пример: f100050000b05bb8) и запускаете следующую команду:

rmsock f100050000b05bb8 tcpcb

убить процесс.

Бен Рума Моез
источник
10

Вы можете узнать список всех портов, запущенных в системе, вместе с его деталями (pid, адрес и т. Д.):

netstat -tulpn

Вы можете узнать подробности о конкретном номере порта , указав номер порта в следующей команде:

sudo netstat -lutnp | grep -w '{port_number}'

пример: sudo netstat -lutnp | grep -w '8080' Подробности будут предоставлены следующим образом:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name

если вы хотите убить процесс с помощью pid, то :kill -9 {PID}

если вы хотите убить процесс, используя номер порта :fuser -n tcp {port_number}

используйте, sudoесли вы не можете получить доступ к любому.

ПЕА
источник
6

kill -9 `fuser 8080/tcp|xargs -n 1`эта команда также убивает процесс, который прослушивает порт 8080 с TCP-соединением

Харшит Гарг
источник
4
sudo apt-get install psmisc (or sudo yum install psmisc)
sudo fuser 80/tcp

Результат: 80 / tcp: 1858 1867 1868 1869 1871

Убить процесс по одному

убить -9 1858

Fadid
источник
3

Я работаю над системой Yocto Linux, которая имеет ограниченный набор доступных инструментов Linux. Я хотел убить процесс, который использовал определенный порт (1883).

Сначала, чтобы увидеть, какие порты мы слушаем, я использовал следующую команду:

root@root:~# netstat -lt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 0.0.0.0:hostmon         0.0.0.0:*               LISTEN      
tcp        0      0 localhost.localdomain:domain 0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:9080            0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:1883            0.0.0.0:*               LISTEN      
tcp        0      0 :::hostmon              :::*                    LISTEN      
tcp        0      0 localhost:domain        :::*                    LISTEN      
tcp        0      0 :::ssh                  :::*                    LISTEN      
tcp        0      0 :::1883                 :::*                    LISTEN      

Затем я нашел имя процесса с использованием порта 1883 следующим образом:

root@root:~# fuser 1883/tcp
290 
root@root:~# ps | grep 290
  290 mosquitt 25508 S    /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf
12141 root      8444 S    grep 290

Как мы видим выше, эта программа /usr/sbin/mosquittoиспользует порт 1883.

Наконец, я убил процесс:

root@root:~# systemctl stop mosquitto

Я использовал, systemctlпотому что в этом случае это был сервис systemd.

Даниэль Йонссон
источник
2

В моем случае у цента есть проблема в предложенном ответе. Поэтому я использовал следующее решение:

  ss -tanp | grep 65432 | head -1 | grep -Po "(?<=pid=).*(?=,)" | xargs kill
Камеш Юнги
источник
1

основываться на том, что @ veer7 сказал:

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

$ sudo netstat -plten |grep java
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      1000       906726      25296/java      
tcp6       0      0 :::8009                 :::*                    LISTEN      1000       907503      25296/java      
tcp6       0      0 :::8080                 :::*                    LISTEN      1000       907499      25296/java      
$ ps 25296
  PID TTY      STAT   TIME COMMAND
25296 ?        Sl     0:16 /usr/lib/jvm/java-8-openjdk-amd64/bin/java -Dcatalina.base=/hom

Используйте 'ps' и номер процесса, который netstat сообщил обратно

JesseBoyd
источник
1

Другой способ с Git Bash:

stopProcessByPortNumber() {
port=":${1}"
portStrLine="$(netstat -ano | findstr LISTENING | findstr $port)"
processId="$(grep -oP '(\d+)(?!.*\d)' <<< $portStrLine)"
echo $processId
taskkill -PID $processId -F
}
Лукас Мояно Анджелини
источник
1
  1. сначала проверьте процесс netstat -lt
  2. проверить идентификатор процесса fuser <port number>/tcp
  3. убить процесс, запущенный в порту kill <process id>
Gunjan Paul
источник
-3

В Windows это будет netstat -ano | grep "8080"и мы получим следующее сообщениеTCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 10076

Мы можем убить PID, используя taskkill /F /PID 10076

Chaklader
источник
Вопрос явно требует помощи Linux; не винда.
детские пирожные