Ada beberapa cara untuk menemukan proses berjalan mana yang menggunakan porta.
Menggunakan fuser akan memberikan PID dari beberapa instance yang terkait dengan port mendengarkan.
sudo apt-get install psmisc
sudo fuser 80/tcp
80/tcp: 1858 1867 1868 1869 1871
Setelah mengetahuinya, Anda dapat menghentikan atau mematikan proses tersebut.
Anda juga dapat menemukan PID dan detail lainnya menggunakan lsof
sudo lsof -i tcp:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1858 root 6u IPv4 5043 0t0 TCP ruir.mxxx.com:http (LISTEN)
nginx 1867 www-data 6u IPv4 5043 0t0 TCP ruir.mxxx.com:http (LISTEN)
nginx 1868 www-data 6u IPv4 5043 0t0 TCP ruir.mxxx.com:http (LISTEN)
nginx 1869 www-data 6u IPv4 5043 0t0 TCP ruir.mxxx.com:http (LISTEN)
nginx 1871 www-data 6u IPv4 5043 0t0 TCP ruir.mxxx.com:http (LISTEN)
Untuk membatasi soket yang mendengarkan pada port 80 (berlawanan dengan klien yang terhubung ke port 80):
sudo lsof -i tcp:80 -s tcp:listen
Untuk membunuh mereka secara otomatis:
sudo lsof -t -i tcp:80 -s tcp:listen | sudo xargs kill
Berikut adalah oneliner yang menunjukkan perintah untuk menjalankan :
echo kill $(sudo netstat -anp | awk '/ LISTEN / {if($4 ~ ":80$") { gsub("/.*","",$7); print $7; exit } }')
Ganti echo
oleh sudo
untuk proses untuk benar-benar dibunuh.
Tiga opsi untuk mencantumkan port terbuka ditawarkan di whatisonport
jsh :
netstat -anp --numeric-ports | grep ":${PORT}\>.*:"
fuser -v "${PORT}"/tcp
lsof -P -S 2 -i "tcp:${PORT}" | grep "\(:${PORT}->.*:\|:$PORT (LISTEN)$\)"
Saya lebih suka netstat
karena cepat, ringkas, dan dapat mencantumkan port yang dibuka oleh pengguna lain. (Meskipun masih memerlukan hak pengguna super/pengguna untuk mencantumkan nama dan PID dari proses tersebut.)
Keluaran
$ netstat -anp --numeric-ports | grep ":80\>.*:"
tcp6 0 0 :::80 :::* LISTEN 1914/apache2
$ fuser -v "80/tcp"
USER PID ACCESS COMMAND
80/tcp: root 1914 F.... apache2
www-data 12418 F.... apache2
...
$ lsof -P -S 2 -i "tcp:80" | grep "\(:80->.*:\|:80 (LISTEN)$\)"
apache2 1914 root 4u IPv6 11920 0t0 TCP *:80 (LISTEN)
apache2 12418 www-data 4u IPv6 11920 0t0 TCP *:80 (LISTEN)
...
Penggunaan grep
dalam dua kasus adalah mencocokkan hanya port di sisi lokal, dan melewatkan koneksi terbuka ke port jarak jauh 80. (Alternatifnya adalah menggunakan -l
dengan netstat
, atau dengan lsof
untuk menggunakan -sTCP:LISTEN
, tapi saya suka greps di atas karena mereka juga akan menangkap outgoing koneksi dari port yang diberikan, yang terkadang menarik.)
Dengan lsof
kami menggunakan -P
untuk menampilkan :80
bukannya :http
untuk memungkinkan grep. -S 2
opsi memaksa lsof
untuk menyelesaikan tepat waktu.
Membunuh proses
Dengan asumsi kita ingin menggunakan netstat
, kita dapat mengambil PID seperti ini:
$ netstat -anp --numeric-ports | grep ":80\>.*:" | grep -o "[0-9]*/" | sed 's+/$++'
1914
...
Dan kami bahkan dapat meneruskan PID tersebut ke kill
:
... | xargs -d '\n' kill -KILL
Namun sering ada potensi false positive saat menggunakan regexps, jadi saya akan merekomendasikan hanya melihat output awal dari netstat
lalu secara manual memutuskan apakah akan menjalankan atau tidak:
$ kill -KILL 1914
Lihat juga
Saya memiliki skrip lain bernama listopenports
yang mungkin menarik.