2012-03-24 19 views
64

Jak mówi tytuł, używam wielu serwerów gier, a każdy z nich ma ten sam numer name, ale różni się numerem PID i numerem port. Chciałbym dopasować PID serwera, który nasłuchuje na określonym porcie, a następnie chciałbym zabić ten proces. Potrzebuję tego, aby ukończyć skrypt basha.Określanie sygnału odtwarzania procesu na określonym porcie

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

Odpowiedz

90

-p Flaga netstat daje PID procesu:

netstat -l -p 

Edit: Komenda, co jest potrzebne, aby uzyskać PID użytkowników gniazd we FreeBSD jest sockstat. Jak wypracowane podczas dyskusji z @Cyclone, linii, która wykonuje prace to:

sockstat -4 -l | grep :80 | awk '{print $3}' | head -1 
+2

'netstat: 80: nieznany lub niezabezpieczony protokół' użył portu' 80' (nginx) do przetestowania purpoes. Nie zadziałało. – Cyclone

+0

Jak otrzymałeś ten błąd? Jakie to polecenie wytworzyło? – stanwise

+0

'netstat -l -p 80', kiedy robię' netstat -l -p', otrzymuję instrukcję: http://pastebin.com/raw.php?i=q9jeQSBj – Cyclone

7

powinieneś powiedzieć PID o tym, czego słuchasz na którym porcie.

+1

'netstat: 80: nieznany lub uninstrumented Protokołem używał portu '80' (nginx) do testowania purpoes. Nie zadziałało. – Cyclone

106

Krótka wersja które można przekazać do zabicia polecenie:

lsof -i:80 -t 
+4

Obejmuje to również procesy _connected_ na tym porcie. 'lsof -i4TCP: 80-sTCP: LISTEN -t' jest prawdopodobnie tym, czego potrzebujesz. – Nevir

+0

Dokładnie tego, czego szukałem. Chciałem zabić proces, szukając portu, na którym działa. – mythicalcoder

+0

@Nevir co masz na myśli przez "obejmuje również procesy, które są połączone na tym porcie"? Czy możesz wyjaśnić? – kishorer747

8

netstat -p -l | grep $PORT i lsof -i :$PORT rozwiązania są dobre ale wolę fuser $PORT/tcp rozszerzenie składni POSIX (który działa na coreutils) jak z rury:

pid=`fuser $PORT/tcp` 

drukuje czysty pid, dzięki czemu możesz zrzucić magię na sed.

Jedną rzeczą, która sprawia, że ​​fuser moje narzędzia kochanek jest możliwość wysyłania sygnału do tego procesu bezpośrednio (składnia ta jest również rozszerzenie POSIX):

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

także -k jest obsługiwany przez FreeBSD: http://www.freebsd.org/cgi/man.cgi?query=fuser

1

Od sockstat nie natywnie zainstalowany na moim komputerze mam włamał się odpowiedź stanwise do korzystania netstat zamiast ..

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

chcę ed do programowo - używając tylko Bash - zabij słuchanie procesu na danym porcie.

Powiedzmy, że port jest 8089, to tutaj jest, 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 ktoś inny! Wiem, że to pomoże mojej drużynie.

+0

Oto funkcja, której używam: 'function kill-listener { lsof -i: $ 1 -t | xargs kill -9 } ' Na przykładzie portu 8089:' kill-listener 8089' –

0

na systemie Windows, netstat opcja, aby uzyskać PID jest -o i -p wybiera filtr protokołu, np .: netstat -a -p tcp -o

Powiązane problemy