Belirli bir bağlantı noktasında dinleme sürecini belirleyin


101

Başlıktan da anlaşılacağı gibi, birden fazla oyun sunucusu çalıştırıyorum ve her birinin aynı nameama farklı PIDve portsayısı var. PIDBelirli bir portta dinleyen sunucunun eşleşmesini istiyorum ve sonra bu işlemi sonlandırmak istiyorum. Bash betiğimi tamamlamak için buna ihtiyacım var.

Bu mümkün mü? Çünkü internette henüz bir çözüm bulamadı.

Yanıtlar:


125

-pBayrağı netstatEğer sürecin PID verir:

netstat -l -p

Düzenleme: FreeBSD'de soket kullanıcılarının PID'lerini almak için gerekli olan komut sockstat. @Cyclone ile yaptığımız görüşme sırasında çalıştığımız gibi, işi yapan hat şudur:

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

2
netstat: 80: unknown or uninstrumented protocol80Purpoları test etmek için (nginx) bağlantı noktasını kullandı. Çalışmadı.
Cyclone

5
netstat -nlp | grep :80bunun yerine deneyin
stanwise

12
netstat: option requires an argument -- p
Cyclone

2
@jasonbrittain Cygwin'de Windows native netstatolarak adlandırılır. Başka sözdizimi var.
stanwise

2
bu cevap yanlış: netstat: seçenek bir argüman gerektirir - p
Good Person

143

Kill komutuna geçebileceğiniz kısa versiyon:

lsof -i:80 -t

13
Bu , o bağlantı noktasına bağlı işlemleri de içerir . lsof -i4TCP:80 -sTCP:LISTEN -tonun yerine muhtemelen istediğiniz şeydir.
Nevir

Tam olarak aradığım şey. Bir işlemi çalıştığı bağlantı noktasını arayarak öldürmek istedim.
mithicalcoder

@Nevir "o bağlantı noktasına bağlı işlemleri de içerir" derken neyi kastediyorsunuz? Açıklayabilir misin?
kishorer747

2
kill -9 `lsof -i:80 -t` kopyalama kolaylığı için
bmjrowe

17

netstat -p -l | grep $PORTve lsof -i :$PORT çözümler iyidir, ancak boru ile olduğu gibi fuser $PORT/tcpPOSIX'e (bunun işe yaradığı coreutils) uzantı sözdizimini tercih ederim :

pid=`fuser $PORT/tcp`

sedsihirden kurtulabilmeniz için saf pid yazdırır .

fuserSevdiğim araçları yapan bir şey, bu sürece doğrudan sinyal gönderme yeteneğidir (bu sözdizimi aynı zamanda POSIX'in bir uzantısıdır):

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

Ayrıca -k, FreeBSD tarafından desteklenir: http://www.freebsd.org/cgi/man.cgi?query=fuser


1
bizi daha temiz ve öz kaynaştırın
Dawoodjee

10

netstat -nlp hangi portta neyin dinlediğinin PID'sini size söylemelisiniz.


1
netstat: 80: unknown or uninstrumented protocol80Purpoları test etmek için (nginx) bağlantı noktasını kullandı. Çalışmadı.
Cyclone

3

Sockstat, makinemde yerel olarak kurulu olmadığından, bunun yerine netstat kullanmak için stanwise'ın cevabını hackledim ..

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

Programlı olarak - yalnızca Bash kullanarak - belirli bir bağlantı noktasında dinleme sürecini sonlandırmak istedim .

Diyelim ki bağlantı noktası 8089, o zaman işte böyle yaptım:

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

Umarım bunun bir başkasına yardımı olur! Ekibime yardımcı olacağını biliyorum.


1
İşte bunu yapmak için kullandığım işlev: function kill-listener { lsof -i:$1 -t | xargs kill -9 }8089 numaralı bağlantı noktası örneğinizi kullanarak:kill-listener 8089
Hamilton Kasırgası

3

Sözdizimi:

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

Örnek: 4200 numaralı bağlantı noktasında çalışan işlemi sonlandırmak için aşağıdaki komutu çalıştırın

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

Ubuntu'da test edildi.


2

Windows'ta, pid'leri almak için netstat seçeneği -o ve -p bir protokol filtresi seçer, örn .: netstat -a -p tcp -o

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.