Визначте прослуховування Pid процесу на певному порту


101

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

Це навіть можливо? Тому що він ще не знайшов жодного рішення в Інтернеті.

Відповіді:


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) для тестування цілей. Не працював.
Циклон

5
спробуйте netstat -nlp | grep :80замість цього
строго

12
netstat: option requires an argument -- p
Циклон

2
@jasonbrittain На Cygwin netstatназивається рідний windows . Він має інший синтаксис.
строго

2
ця відповідь неправильна: netstat: опція вимагає аргументу - p
Good Person

143

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

lsof -i:80 -t

13
Сюди також входять процеси, підключені до цього порту. lsof -i4TCP:80 -sTCP:LISTEN -tце, мабуть, те, що ви хочете, натомість.
Невір

Саме те, що я шукав. Я хотів убити процес шляхом пошуку порту, на якому він працює.
mythicalcoder

@Nevir, що ви маєте на увазі під "також включає процеси, підключені до цього порту"? Чи можете ви поясніть, будь ласка?
kishorer747

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) для тестування цілей. Не працював.
Циклон

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""

3

Я хотів програмно - використовуючи лише Bash - вбити процес прослуховування в заданому порту.

Скажімо, порт 8089, то ось, як я це зробив:

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

Я сподіваюся, що це допомагає комусь іншому! Я знаю, що це допоможе моїй команді.


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

3

Синтаксис:

вбити -9 $ (lsof -t -i: portnumber)

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

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

Тестували в Ubuntu.


2

у Windows опція netstat, щоб отримати pid, є -o і -p вибирає фільтр протоколу, напр .: netstat -a -p tcp -o

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