Tentukan proses pid mendengarkan pada port tertentu

101

Seperti judulnya, saya menjalankan beberapa server game, dan masing-masing memiliki server yang sama nametetapi berbeda PIDdan portjumlahnya. Saya ingin mencocokkan PIDserver yang mendengarkan pada port tertentu, dan kemudian saya ingin menghentikan proses ini. Saya membutuhkannya untuk menyelesaikan skrip bash saya.

Apakah itu mungkin? Karena belum menemukan solusi apa pun di web.

Topan
sumber

Jawaban:

125

The -pBendera netstatmemberi Anda PID dari proses:

netstat -l -p

Edit: Perintah yang diperlukan untuk mendapatkan PID dari pengguna soket di FreeBSD adalah sockstat. Saat kami berlatih selama diskusi dengan @Cyclone, baris yang melakukan pekerjaan itu adalah:

sockstat -4 -l | grep :80 | awk '{print $3}' | head -1
stanwise
sumber
2
netstat: 80: unknown or uninstrumented protocolmenggunakan 80port (nginx) untuk menguji purpoes. Tidak bekerja.
Topan
5
coba netstat -nlp | grep :80sebagai gantinya
mulai
12
netstat: option requires an argument -- p
Topan
2
@jasonbrittain Pada Cygwin, windows native netstatdipanggil. Ini memiliki sintaks lainnya.
stanwise
2
jawaban ini salah: netstat: opsi memerlukan argumen - p
Orang Baik
143

Versi singkat yang dapat Anda lewati untuk membunuh perintah:

lsof -i:80 -t
Laurynas
sumber
13
Ini juga termasuk proses yang terhubung pada port tersebut. lsof -i4TCP:80 -sTCP:LISTEN -tmungkin itulah yang Anda inginkan.
Nevir
Persis apa yang saya cari. Saya ingin menghentikan proses dengan mencari port tempat ia berjalan.
mythicalcoder
@ Nevir apa yang Anda maksud dengan "juga menyertakan proses yang terhubung pada port itu"? Bisakah Anda menjelaskan?
kishorer747
2
kill -9 `lsof -i:80 -t`untuk kemudahan menyalin
bmjrowe
17

netstat -p -l | grep $PORTdan lsof -i :$PORT solusinya bagus tetapi saya lebih suka fuser $PORT/tcpsintaks ekstensi ke POSIX (yang berfungsi untuk coreutils) seperti pipa:

pid=`fuser $PORT/tcp`

itu mencetak pid murni sehingga Anda bisa melepaskan sedsihir.

Satu hal yang membuat fuseralat kekasih saya adalah kemampuan untuk mengirim sinyal ke proses itu secara langsung (sintaks ini juga ekstensi ke POSIX):

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

Juga -k didukung oleh FreeBSD: http://www.freebsd.org/cgi/man.cgi?query=fuser

gavenkoa.dll
sumber
1
fuser us lebih rapi dan ringkas
Dawoodjee
10

netstat -nlp harus memberi tahu Anda PID dari apa yang mendengarkan di port mana.


sumber
1
netstat: 80: unknown or uninstrumented protocolmenggunakan 80port (nginx) untuk menguji purpoes. Tidak bekerja.
Topan
3

Karena sockstat tidak diinstal secara asli di komputer saya, saya meretas jawaban stanwise untuk menggunakan netstat sebagai gantinya ..

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.dll
sumber
3

Saya ingin secara terprogram - hanya menggunakan Bash - menghentikan proses mendengarkan pada port tertentu.

Katakanlah port-nya adalah 8089, maka inilah cara saya melakukannya:

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

Saya harap ini membantu orang lain! Saya tahu ini akan membantu tim saya.

Glavin001
sumber
1
Berikut ini fungsi yang saya gunakan untuk melakukannya: function kill-listener { lsof -i:$1 -t | xargs kill -9 }Menggunakan contoh port 8089:kill-listener 8089
Hurricane Hamilton
3

Sintaksis:

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

Contoh: Untuk menghentikan proses yang berjalan di port 4200, jalankan perintah berikut

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

Diuji di Ubuntu.

Debashish Sen
sumber
2

di windows, opsi netstat untuk mendapatkan pid's adalah -o dan -p memilih filter protokol, mis .: netstat -a -p tcp -o

Jan Wilmans
sumber