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.

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

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

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


1
fuser us lebih rapi dan ringkas
Dawoodjee

10

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


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

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.


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.


2

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.