Określ proces nasłuchiwania pid na określonym porcie

101

Jak mówi tytuł, biegnę wieloma serwerami gry, a każdy z nich ma takie same name, ale różnią się PID, a portnumer. Chciałbym dopasować PIDserwer, który nasłuchuje na określonym porcie, a następnie chciałbym zakończyć ten proces. Potrzebuję tego, aby ukończyć mój skrypt bash.

Czy to w ogóle możliwe? Ponieważ nie znalazł jeszcze żadnych rozwiązań w sieci.

Cyklon
źródło

Odpowiedzi:

125

-pFlaga netstatdaje PID procesu:

netstat -l -p

Edycja: Polecenie potrzebne do uzyskania identyfikatorów PID użytkowników gniazd we FreeBSD to sockstat. Jak ustaliliśmy podczas dyskusji z @Cyclone, wiersz, który wykonuje zadanie, to:

sockstat -4 -l | grep :80 | awk '{print $3}' | head -1
stanowo
źródło
2
netstat: 80: unknown or uninstrumented protocolużywał 80portu (nginx) do testowania celów. Nie zadziałało.
Cyclone
5
spróbuj netstat -nlp | grep :80zamiast tego
stanwise
12
netstat: option requires an argument -- p
Cyclone
2
@jasonbrittain Na Cygwin netstatnazywa się Windows Native . Ma inną składnię.
standardowo
2
ta odpowiedź jest nieprawidłowa: netstat: opcja wymaga argumentu - p
Good Person
143

Krótka wersja, którą możesz przekazać, aby zabić polecenie:

lsof -i:80 -t
Laurynas
źródło
13
Obejmuje to również procesy, które są podłączone do tego portu. lsof -i4TCP:80 -sTCP:LISTEN -tjest prawdopodobnie tym, czego chcesz.
Nevir
Dokładnie to, czego szukałem. Chciałem zabić proces, wyszukując port, na którym jest uruchomiony.
mythicalcoder
@Nevir, co masz na myśli, mówiąc „obejmuje również procesy podłączone do tego portu”? Czy możesz wyjaśnić?
kishorer747
2
kill -9 `lsof -i:80 -t`dla ułatwienia kopiowania
bmjrowe
17

netstat -p -l | grep $PORTi lsof -i :$PORT rozwiązania są dobre, ale wolę fuser $PORT/tcpskładnię rozszerzenia od POSIX (która działa coreutils), jak z potokiem:

pid=`fuser $PORT/tcp`

drukuje czysty pid, więc możesz upuścić sed magię.

Jedną rzeczą, która sprawia, że fusermoje ulubione narzędzia są możliwość bezpośredniego wysyłania sygnału do tego procesu (ta składnia jest również rozszerzeniem POSIX):

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

FreeBSD obsługuje również -k: http://www.freebsd.org/cgi/man.cgi?query=fuser

gavenkoa
źródło
1
fuser nas schludniej i zwięźle
Dawoodjee
10

netstat -nlp powinien informować o PID, co nasłuchuje na którym porcie.


źródło
1
netstat: 80: unknown or uninstrumented protocolużywał 80portu (nginx) do testowania celów. Nie zadziałało.
Cyclone
3

Ponieważ sockstat nie był natywnie zainstalowany na moim komputerze, zhakowałem odpowiedź firmy Stanwise, aby zamiast tego użyć 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
źródło
3

Chciałem programowo - używając tylko Bash - zabić proces nasłuchujący na danym porcie.

Powiedzmy, że port to 8089, a oto jak to zrobiłem:

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

Mam nadzieję, że to pomoże komuś innemu! Wiem, że to pomoże mojemu zespołowi.

Glavin001
źródło
1
Oto funkcja, której używam, aby to zrobić: Na function kill-listener { lsof -i:$1 -t | xargs kill -9 }przykładzie portu 8089:kill-listener 8089
Huragan Hamilton,
3

Składnia:

kill -9 $ (lsof -t -i: numer portu)

Przykład: Aby zabić proces działający na porcie 4200, uruchom następujące polecenie

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

Przetestowano w Ubuntu.

Debashish Sen
źródło
2

w systemie Windows opcja netstat pobierająca pid to -o i -p wybiera filtr protokołu, np .: netstat -a -p tcp -o

Jan Wilmans
źródło