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

299

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

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

Теги:
port
kill-process

13 ответов

148
Лучший ответ

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

 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
    Вы можете добавить, что для получения имен процессов через netstat могут потребоваться привилегии суперпользователя.
  • 2
    @JonasWielicki вы можете видеть те, которые у вас есть, без привилегий root.
Показать ещё 2 комментария
423

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

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

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

  • 1
    это также закрывает возможное подключенное гнездо к 8080?
  • 0
    Конечно, все файловые дескрипторы закрываются после завершения процесса.
Показать ещё 6 комментариев
186

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

lsof -i:8080

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

kill $(lsof -t -i:8080)

или более яростно:

kill -9 $(lsof -t -i:8080)
  • 4
    kill: использование: kill [-s sigspec | -n Signum | -sigspec] pid | jobspec ... или kill -l [sigspec] Это то, что я получаю, когда выполняю ваши команды
  • 2
    @SudhirBelagali сделал это с супер-пользователем sudo
Показать ещё 6 комментариев
82

Вы можете использовать команду 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; как иногда несколько процессов не убивают просто убить
  • 1
    Это был тот, который работает на Mac OS тоже
44

Я бы добавил этот однострочный слой только для LISTEN на конкретный порт:

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

  • 3
    Я думаю, что это должен быть лучший ответ. Спасибо @ Гал Брача
  • 0
    Это лучшее решение, потому что оно не убивает и мой браузер!
34

Это выводит на печать идентификаторы процессов всего, что выполняется на <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)
}
24

Знать 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

12

попробуйте это,

 sudo fuser -n tcp -k 8080
10
  • lsof -i tcp:8000 Эта команда перечисляет информацию о запуске процесса на порту 8000

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

  • 0
    Я только заметил, что несколько недель назад я случайно проголосовал за это, если вы немного отредактируете свой ответ, я смогу удалить его
6

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

netstat -plten | grep LISTEN | grep 8080

AIX:

netstat -Aan | grep LISTEN | grep 8080

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

rmsock f100050000b05bb8 tcpcb

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

  • 1
    rmsock: команда не найдена
2

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

0

чтобы опираться на то, что @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

-4

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

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

  • 0
    Вопрос явно требует помощи Linux; не винда.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню