Як вбити процес, що працює на певному порту в 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.