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

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

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


person veer7    schedule 20.07.2012    source источник
comment
возможный дубликат сценария оболочки, чтобы убить процесс, прослушивающий порт 3000?   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 14.10.2014


Ответы (31)


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

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

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

person nudzo    schedule 21.07.2012
comment
закрывает ли это возможный подключенный сокет к 8080? - person fer y; 28.01.2014
comment
Конечно, все файловые дескрипторы закрываются по окончании процесса. - person nudzo; 29.01.2014
comment
Он неправильно закрывает порт. Порт переводится в состояние TIME_WAIT после того, как родительский процесс убит. Затем ОС в конечном итоге полностью закроет порт примерно через 60 секунд. Это означает, что вы не можете повторно использовать порт в течение как минимум 60 секунд (если только вы не предоставите сокету возможность повторного использования). - person Mark Lakata; 04.09.2015
comment
На Дарвине должна использоваться другая версия fuser. Принимает только файл, не поддерживает -k. - person a p; 15.11.2016
comment
'fuser -k -n tcp 8080' тоже убьет процесс - person Hesham Yassin; 09.02.2017
comment
@dbliss fuser является частью psmisc. Если вы получили fuser: command not found, установите psmisc. Для CentOS / RHEL 7 запустите sudo yum install psmisc - person Tom; 10.01.2019

Чтобы вывести список всех процессов, прослушивающих порт 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, также известный как -15 или soft kill, что иногда не так. недостаточно, чтобы убить процесс.).

person Franck Dernoncourt    schedule 15.09.2015
comment
kill: использование: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... или kill -l [sigspec] Это то, что я получаю, когда выполняю ваши команды - person Sudhir Belagali; 05.04.2017
comment
@SudhirBelagali сделал это с суперпользователем sudo - person Marcel Djaman; 11.05.2017
comment
Работал и на моем Mac - person asherbar; 07.01.2018
comment
Я хотел бы добавить, что иногда у вас нет прав на просмотр идентификатора процесса, в этом случае вам нужно сделать sudo lsof -i:8080. - person Akavall; 19.08.2018
comment
почему второй совет более жестокий? - person Webwoman; 17.09.2018
comment
@Webman более жестоко означает, что он убивает мой веб-браузер :( Вот лучшее решение от Гал Браха: kill -9 $ (lsof -t -i: 3000 -sTCP: LISTEN) - person Russo; 20.09.2018
comment
@Webman -9 соответствует SIGKILL - terminate immediately/hard kill: см. Список сигналов отключения и Для чего нужен параметр -9 в команде kill?) - person Franck Dernoncourt; 20.09.2018
comment
исходя из этого, с помощью sudo: killport() {sudo kill -9 $(sudo lsof -t -i:${1} -sTCP:LISTEN)}, а затем killport 8080 - person Nicolas Marshall; 08.01.2019

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

 sudo netstat -plten |grep java

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

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

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

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

kill -9 16085

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

person veer7    schedule 20.07.2012
comment
Вы можете добавить, что для получения имен процессов через netstat могут потребоваться привилегии root. - person Jonas Schäfer; 20.07.2012
comment
@JonasWielicki, вы можете видеть те, которые у вас есть, без прав root. - person dbliss; 09.08.2016
comment
Мне нужны были привилегии root для netstat. Есть ли способ узнать, из чего произошел этот процесс? Насколько я мог судить, я закрыл все приложения, но, возможно, это было из окна терминала, где я случайно переместил процессы в фоновую задачу. Может, мне стоило сначала запустить команду терминала 'ps', чтобы увидеть все процессы ... - person JesseBoyd; 12.10.2017
comment
sudo netstat -plten | grep :8080 будет работать, даже если вы не знаете приложение. Это обнаружило рубиновый процесс, который lsof -i не нашел для меня. - person MikeF; 01.10.2020

Вариант 1. Однострочный способ убить только LISTEN на определенном порту:

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

Вариант 2. Если у вас установлен npm, вы также можете запустить

npx kill-port 3000
person Gal Bracha    schedule 22.01.2017
comment
Думаю, это лучший ответ. Спасибо @Gal Bracha - person Sam Kah Chiin; 22.02.2018
comment
Это лучшее решение, потому что оно не убивает и мой браузер! - person Russo; 20.09.2018
comment
Основываясь на этом ответе, я создал функцию в ~/.bashrc: killp() { kill -9 $(lsof -t -i:"$1" -sTCP:LISTEN) }, чтобы иметь возможность использовать ее так killp 3000. (Не забудьте добавить новые строки для { }) - person Arthur; 06.08.2020

Вы можете использовать команду 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

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

person Kop4lyf    schedule 11.02.2015
comment
чтобы принудительно убить процесс, вам нужно будет использовать -9, например kill -9 75782; поскольку иногда несколько процессов не убиваются с помощью просто kill - person veer7; 25.02.2015

Один лайнер

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

Объяснение здесь: используйте комбинацию lsof и 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
person dlmeetei    schedule 26.11.2019

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

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

person Mahfuz    schedule 18.05.2018
comment
Спасибо друг. sudo kill -9 $(sudo lsof -t -i:8080) работал у меня - person Junaid; 31.12.2018
comment
Замечательно, это команда, которая у меня сработала, Ubuntu - person Jose Mhlanga; 08.04.2021

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

kill -9 $(sudo lsof -t -i:8080)
person Berkay Kırmızıoğlu    schedule 04.12.2019
comment
не sudo запрашивает пароль - person Kuldeep Yadav; 21.04.2020

Это выводит на стандартный вывод идентификаторы процессов всего, что запущено на <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)
}
person Brian Peterson    schedule 27.09.2013

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

netstat -tulnap | grep :*port_num*

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

e.g

netstat -ap | grep :8080

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

Теперь:

kill -9 1880

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

person Sanjay s.    schedule 12.08.2014

Получите PID задачи и завершите ее.

lsof -ti:8080 | xargs kill
person Rahul Garg    schedule 29.11.2018
comment
Спасибо за ответ. Очень плавно работает в Mac OS. Вы самые лучшие. Просто проголосуйте за. - person AMIC MING; 29.11.2019
comment
Также хорошо работает с диапазонами портов, например lsof -ti:8080-8089 | xargs kill. - person dvlsg; 06.03.2020

Сначала вам нужно запустить (заменить на свой номер порта):

fuser -k 3000/tcp

Это освободит порт. После того, как вы запустите вышеуказанную команду, запустите:

service docker restart

И ваша проблема решена.

person Anshuman Bardhan    schedule 21.07.2020
comment
ЛУЧШИЙ ОТВЕТ ПРЯМО ЗДЕСЬ! - person Michael Paccione; 27.01.2021
comment
хороший ответ, спасибо, это тоже работает для меня - person perymerdeka; 01.03.2021

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

 sudo fuser -n tcp -k 8080
person Adil Abbasi    schedule 26.06.2015

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

netstat -ap | grep :7070

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

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

Убить службу на основе PID (идентификационного номера процесса)

kill -9 3332
person Lova Chittumuri    schedule 06.08.2019

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

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

person Nandhitha Ramaraj    schedule 16.12.2015
comment
Я только что заметил, что несколько недель назад я случайно проголосовал за это, и если вы немного отредактируете свой ответ, я смогу удалить его. - person Robin-Hoodie; 11.01.2018

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

netstat -plten | grep LISTEN | grep 8080

AIX:

netstat -Aan | grep LISTEN | grep 8080

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

rmsock f100050000b05bb8 tcpcb

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

person ben rhouma moez    schedule 12.08.2014

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

netstat -tulpn 

пример:-

 Local Address  Foreign Address  State    PID/Program name

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

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

kill -9 PID

Пример: -

убить -9 15986

person Kundan Kumar    schedule 07.03.2018

Вы можете узнать список всех портов, работающих в системе, а также его детали (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, если у вас нет доступа к ним.

person YAP    schedule 14.03.2019

Выполните следующую команду, чтобы найти PID номера порта 8080:

sudo lsof -t -i: 8080

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

sudo kill -9

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

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

person RajuS    schedule 17.06.2020

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

person Harshit Garg    schedule 22.05.2017

Просто запустите эту команду. Не забудьте заменить portnumber своим портом;)

  kill -9 $(sudo lsof -t -i:portnumber)
person monica    schedule 13.06.2020
comment
В большинстве случаев sudo в Mac не требуется. - person Aditya Parmar; 14.07.2020

sudo apt-get install psmisc (or sudo yum install psmisc)
sudo fuser 80/tcp

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

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

kill -9 1858 г.

person Fadid    schedule 04.06.2018

Это решение для Windows:

C:\Users\Niroshan>netstat -ano|findstr "PID :8080"

Proto Local Address Foreign Address State PID
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 18264

taskkill /pid 18264 /f
person Niroshan Ratnayake    schedule 14.07.2020
comment
Спрашивается про линукс. - person Robert; 14.07.2020

Я работаю над системой 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.

person Daniel Jonsson    schedule 05.05.2020

  1. сначала проверьте процесс netstat -lt
  2. проверить идентификатор процесса fuser <port number>/tcp
  3. убить процесс, запущенный на порту kill <process id>
person Gunjan Paul    schedule 24.05.2020

Это убьет программы, работающие на порту 80.

sudo fuser -k 80/tcp
person Asad Ullah    schedule 17.06.2021

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

stopProcessByPortNumber() {
port=":${1}"
portStrLine="$(netstat -ano | findstr LISTENING | findstr $port)"
processId="$(grep -oP '(\d+)(?!.*\d)' <<< $portStrLine)"
echo $processId
taskkill -PID $processId -F
}
person Lucas Moyano Angelini    schedule 09.02.2019

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

  ss -tanp | grep 65432 | head -1 | grep -Po "(?<=pid=).*(?=,)" | xargs kill
person Kamesh Jungi    schedule 10.02.2020

опираться на то, что сказал @ 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.

person JesseBoyd    schedule 12.10.2017

Как убить процесс, если служба на порту не отвечает

timeout 1 telnet localhost 8080 2>&1 | if grep -q 'Unable'; then sudo kill -9 $(sudo lsof -t -i:8080); fi

Что оно делает

  1. Начните тайм-аут с одной секунды, чтобы выйти из telnet
  2. '2 ›& 1 | 'сообщение об ошибке трубы без выхода
  3. Если сообщение об ошибке содержит «Невозможно», запустите код, чтобы отключить порт блокировки процесса 8080.

Это можно поместить в файл и регулярно запускать из sudo crontab.

person Punnerud    schedule 31.08.2020

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

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

person Chaklader    schedule 28.09.2016
comment
Вопрос явно требует помощи Linux; не винда. - person babycakes; 30.12.2016