Определите процесс прослушивания pid на определенном порту - PullRequest
91 голосов
/ 25 марта 2012

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

Возможно ли это вообще?Потому что он еще не нашел каких-либо решений в Интернете.

Ответы [ 8 ]

134 голосов
/ 29 декабря 2012

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

lsof -i:80 -t
117 голосов
/ 25 марта 2012

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

netstat -l -p

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

* * 1010
14 голосов
/ 31 января 2014
Решения

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

pid=`fuser $PORT/tcp`

он печатает чистый pid, так что вы можете выбросить sed magic out.

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

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

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

9 голосов
/ 25 марта 2012

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

3 голосов
/ 29 марта 2017

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

Скажем, порт 8089, тогда вот как я это сделал:

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

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

2 голосов
/ 30 апреля 2019

Синтаксис:

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

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

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

Протестировано в Ubuntu.

2 голосов
/ 17 марта 2015

Так как sockstat не был изначально установлен на моей машине, я взломал ответ stanwise, чтобы использовать вместо него 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""
1 голос
/ 24 февраля 2018

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

...