Як вбити процес, що працює на певному порту в Linux?


760

Я спробував закрити tomcat ./shutdown.shз /binкаталогу tomcat . Але виявив, що сервер не закритий належним чином. І тому я не зміг перезапустити.
Мій tomcat працює на порту 8080.

Я хочу вбити процес, що працює в темкаті 8080. Я спершу хочу скласти список процесів, що працюють на певному порту (8080), щоб вибрати, який процес вбити.


Відповіді:


934

Це fuser 8080/tcpдозволить надрукувати вам PID процесу, пов'язаного на цьому порту.

І це fuser -k 8080/tcpвб'є цей процес.

Працює лише в Linux. Більш універсальним є використання lsof -i4(або 6 для IPv6).


2
чи закриває це також можливе підключене гніздо до 8080?
fer y

9
Він не належним чином закриває порт. Після вбиття батьківського процесу порт переводиться в стан TIME_WAIT. Після цього ОС приблизно закриє порт приблизно через 60 секунд. Це означає, що ви не можете повторно використовувати порт принаймні 60 секунд (якщо ви не надаєте параметр повторного використання в сокет).
Марк Лаката

2
У Дарвіні необхідно використовувати іншу версію fuser. Бере лише файл, не підтримує -k.
ар

3
'fuser -k -n tcp 8080' теж вб'є процес
Hesham Yassin

7
@dbliss fuser є частиною psmisc. Якщо ви отримаєте fuser: command not found, встановіть psmisc. Для CentOS / RHEL 7 запустітьsudo yum install psmisc
Том

699

Щоб перелічити будь-який процес прослуховування порту 8080:

lsof -i:8080

Щоб вбити будь-який процес, слухаючи порт 8080:

kill $(lsof -t -i:8080)

або більш жорстоко:

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

( -9Відповідає SIGKILL - terminate immediately/hard killсигналу: см Список Кілл сигналів і Яка мета -9 опції в команді вбити? Якщо сигнал не вказано в. kill, Сигнал TERM ака -15або soft killнадсилається, які іноді не досить , щоб убити процес.).


9
убивати: використання: убивати [-s sigspec | -n signum | -sigspec] pid | jobspec ... або вбий -l [sigspec] Це те, що я отримую, коли
виконую

2
@SudhirBelagali зробив це з супер користувачемsudo
Marcel Djaman

5
Працював і на моєму Mac
ашербар

2
Я хотів би додати, що іноді у вас немає дозволів на перегляд ідентифікатора процесу, у цьому випадку вам потрібно це зробити sudo lsof -i:8080.
Акавал

1
чому другі поради більш жорстокі?
Веб-жінка

281

Використовуйте команду

 sudo netstat -plten |grep java

використовуються grep javaяк tomcatвикористання javaв якості їх процесів.

Він покаже список процесів з номером порту та ідентифікатором процесу

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

число до цього /java- ідентифікатор процесу. Тепер використовуйте killкоманду, щоб вбити процес

kill -9 16085

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


11
Ви можете додати, що для отримання імен процесів вам можуть знадобитися root права netstat.
Йонас Шефер

2
@JonasWielicki ви можете бачити ті, хто вам належить без привілеїв root / root.
dbliss

Мені потрібні привілеї root для netstat. Чи є спосіб насправді дізнатися, з чого виник процес? Наскільки я міг сказати, я закрив усі програми, але це можливо було з вікна терміналу, де я ненавмисно підштовхнув процеси до фонового завдання. Можливо, я мав би
запустити

150

Я б додав цей однолінійний код, щоб знищити лише LISTEN на певному порту:

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


9
Я думаю, що це має бути найкращою відповіддю. Дякуємо @Gal Bracha
Сем Ках Чийн

2
Це найкраще рішення, оскільки воно не вбиває і мого браузера!
Руссо

Найкраща відповідь! Проста, лаконічна та виконує завдання правильно.
Цар Бомба

116

Можна скористатися командою 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

Цей працював на мене. ось посилання з оригінальної публікації: посилання


1
щоб вбити процес насильно, вам потрібно буде використовувати -9, як kill -9 75782; як іноді мало процесів не вбиваються просто вбити
veer7

73

Якщо ви хочете вбити процес, що працює на номері порту 8080, то спочатку вам потрібно знайти ідентифікаційний номер порту 8080 порту (PID), а потім його вбити. Виконайте таку команду, щоб знайти номер 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)працював на мене
Джунаїд

69

Найкращий спосіб знищити всі процеси на певному порту;

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

1
Працювали! Дякую.
Фред

Це спрацювало !, дякую.
Джейлерс

Чудово просте рішення за допомогою підшару. Дякую!
Джейсон Р Стівенс CFA

не вимагає введення пароля
Kuldeep Yadav

41

Це надрукує для викреслювання ідентифікаторів процесу всього, що працює на <port_number>:

fuser -n tcp <port_number> 

Крім того, він друкує деякі матеріали на складніше, так що:

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

Отримайте ПІД завдання і вбийте його.

lsof -ti:8080 | xargs kill

Дякую за відповідь. Дуже гладко працює в Mac OS. Ти найкращий. Просто голосуйте.
AMIC MING

1
Також добре працює з діапазонами портів lsof -ti:8080-8089 | xargs kill.
dvlsg

34

Щоб дізнатися про номер служби, що працює на конкретному порту:

netstat -tulnap | grep :*port_num*

ви отримаєте опис цього процесу. Тепер використовуйте kill або kill -9 pid. Легко вбивається.

напр

netstat -ap | grep :8080

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

Зараз:

kill -9 1880

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


28

Один лайнер

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


16

Виберіть номер порту та застосуйте команду grep в netstat, як показано нижче

netstat -ap | grep :7070

Вихід консолі

tcp 0 0 ::: 7070 ::: * LISTEN 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 ПІД

Приклад: -

вбити -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р


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

Я використовував systemctlbecuase в цьому випадку це була системна послуга.


2

У моєму випадку cent os має певне питання у запропонованій відповіді. Тому я застосував таке рішення:

  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


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>

-3

У Windows це буде, netstat -ano | grep "8080"і ми отримаємо наступне повідомленняTCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 10076

Ми можемо вбити PID, використовуючи taskkill /F /PID 10076


Питання чітко просить допомогти Linux; не Windows.
babycakes
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.