Existuje několik způsobů, jak zjistit, který běžící proces používá port.
Pomocí fixační jednotky poskytne PID(y) více instancí spojených s naslouchajícím portem.
sudo apt-get install psmisc
sudo fuser 80/tcp
80/tcp: 1858 1867 1868 1869 1871
Po zjištění můžete proces (procesy) zastavit nebo zabít.
Můžete také najít PID a další podrobnosti pomocí 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)
Chcete-li omezit na sokety, které poslouchají na portu 80 (na rozdíl od klientů, kteří se připojují k portu 80):
sudo lsof -i tcp:80 -s tcp:listen
Chcete-li je zabít automaticky:
sudo lsof -t -i tcp:80 -s tcp:listen | sudo xargs kill
Zde je linka, která ukazuje příkaz ke spuštění:
echo kill $(sudo netstat -anp | awk '/ LISTEN / {if($4 ~ ":80$") { gsub("/.*","",$7); print $7; exit } }')
Nahraďte echo
od sudo
aby byl proces skutečně zabit.
whatisonport
jsh nabízí tři možnosti pro výpis otevřených portů :
netstat -anp --numeric-ports | grep ":${PORT}\>.*:"
fuser -v "${PORT}"/tcp
lsof -P -S 2 -i "tcp:${PORT}" | grep "\(:${PORT}->.*:\|:$PORT (LISTEN)$\)"
Preferuji netstat
protože je rychlý, stručný a umí vypsat porty otevřené jinými uživateli. (Ačkoli k vypsání názvů a PID takových procesů bude stále potřebovat oprávnění superuživatele/uživatele.)
Výstupy
$ 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)
...
Použití grep
ve dvou případech je odpovídat pouze portu na místní straně a přeskočit otevřená připojení ke vzdálenému portu 80. (Alternativou by bylo použití -l
s netstat
nebo pomocí lsof
použít -sTCP:LISTEN
, ale líbí se mi výše uvedené grepy, protože zachytí i odchozí připojení od daný port, který může být občas zajímavý.)
S lsof
používáme -P
zobrazíte :80
místo :http
aby byl grep možný. -S 2
volba vynutí lsof
dokončit včas.
Ukončení procesu
Za předpokladu, že chceme použít netstat
, mohli bychom získat PID takto:
$ netstat -anp --numeric-ports | grep ":80\>.*:" | grep -o "[0-9]*/" | sed 's+/$++'
1914
...
A dokonce bychom mohli předat tyto PID do kill
:
... | xargs -d '\n' kill -KILL
Při použití regulárních výrazů však často existuje možnost falešně pozitivních výsledků, takže bych doporučil podívat se pouze na počáteční výstup netstat
a poté se ručně rozhodnout, zda se má nebo nemá spustit:
$ kill -KILL 1914
Viz také
Mám další skript s názvem listopenports
které mohou být zajímavé.