Определить pid процесса, прослушивающий определенный порт

101

Как говорит название, я бегу несколько игровых серверов, и каждый из них имеет то же самое , nameно разные PIDи в portномер. Я хотел бы сопоставить PIDсервер, который прослушивает определенный порт, а затем я хотел бы убить этот процесс. Мне это нужно для завершения моего сценария bash.

Это вообще возможно? Потому что он еще не нашел решений в сети.

Циклон
источник

Ответы:

125

-pФлаг netstatдает PID процесса:

netstat -l -p

Изменить: команда, необходимая для получения PID пользователей сокетов во FreeBSD, - это sockstat. Как мы выяснили во время обсуждения с @Cyclone, строка, которая выполняет эту работу:

sockstat -4 -l | grep :80 | awk '{print $3}' | head -1
стандартно
источник
2
netstat: 80: unknown or uninstrumented protocolиспользовал 80порт (nginx) для целей тестирования. Не сработало.
Cyclone
5
попробуйте netstat -nlp | grep :80вместо этого
stanwise
12
netstat: option requires an argument -- p
Cyclone
2
@jasonbrittain На Cygwin вызывается родная версия Windows netstat. У него другой синтаксис.
stanwise
2
ответ неверен: netstat: option требует аргумента - p
Good Person
143

Краткая версия, которую вы можете передать команде kill:

lsof -i:80 -t
Лауринас
источник
13
Это также включает процессы, которые подключены к этому порту. lsof -i4TCP:80 -sTCP:LISTEN -tэто, вероятно, то, что вы хотите вместо этого.
Невир,
Именно то, что я искал. Я хотел убить процесс, ища порт, на котором он работает.
мифический
@Nevir, что вы имеете в виду, говоря "также включает процессы, подключенные к этому порту"? Не могли бы вы объяснить?
kishorer747 05
2
kill -9 `lsof -i:80 -t`для удобства копирования
bmjrowe
17

netstat -p -l | grep $PORTи lsof -i :$PORT решения хороши, но я предпочитаю fuser $PORT/tcpсинтаксис расширения POSIX (который работает coreutils), как с pipe:

pid=`fuser $PORT/tcp`

он печатает чистый pid, чтобы вы могли выбросить sedмагию.

Одна вещь, которая делает fuserмои любимые инструменты, - это возможность напрямую отправлять сигнал этому процессу (этот синтаксис также является расширением POSIX):

$ fuser -k $port/tcp       # with SIGKILL
$ fuser -k -15 $port/tcp   # with SIGTERM
$ fuser -k -TERM $port/tcp # with SIGTERM

Также -k поддерживается FreeBSD: http://www.freebsd.org/cgi/man.cgi?query=fuser

гавенкоа
источник
1
fuser us более аккуратный и лаконичный
Dawoodjee
10

netstat -nlp должен сообщить вам PID того, что слушает какой порт.


источник
1
netstat: 80: unknown or uninstrumented protocolиспользовал 80порт (nginx) для целей тестирования. Не сработало.
Cyclone
3

Поскольку sockstat изначально не был установлен на моей машине, я взломал стандартный ответ, чтобы вместо этого использовать netstat ..

netstat -nlp | grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:2000" | awk '{print $7}' | sed -e "s/\/.*//g""
dafky2000
источник
3

Я хотел программно - используя только Bash - убить процесс, прослушивающий данный порт.

Допустим, это порт 8089, тогда я сделал следующее:

badPid=$(netstat --listening --program --numeric --tcp | grep "::8089" | awk '{print $7}' | awk -F/ '{print $1}' | head -1)
kill -9 $badPid

Надеюсь, это поможет кому-то другому! Я знаю, что это поможет моей команде.

Главин001
источник
1
Вот функция, которую я использую для этого: function kill-listener { lsof -i:$1 -t | xargs kill -9 }Используя ваш пример порта 8089:kill-listener 8089
Ураган Гамильтон
3

Синтаксис:

kill -9 $ (lsof -t -i: номер порта)

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

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

Проверено в Ubuntu.

Дебашиш Сен
источник
2

в Windows параметр netstat для получения идентификатора pid равен -o, а -p выбирает фильтр протокола, например: netstat -a -p tcp -o

Ян Вильманс
источник