Es gibt mehrere Möglichkeiten herauszufinden, welcher laufende Prozess einen Port verwendet.
Unter Verwendung von fuser gibt es die PID(s) der mehreren Instanzen an, die dem Listening-Port zugeordnet sind.
sudo apt-get install psmisc
sudo fuser 80/tcp
80/tcp: 1858 1867 1868 1869 1871
Nachdem Sie dies herausgefunden haben, können Sie den/die Prozess(e) entweder stoppen oder beenden.
Sie können die PIDs und weitere Details auch mit lsof
findensudo 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)
Um auf Sockets zu beschränken, die lauschen auf Port 80 (im Gegensatz zu Clients, die sich mit Port 80 verbinden):
sudo lsof -i tcp:80 -s tcp:listen
Um sie automatisch zu töten:
sudo lsof -t -i tcp:80 -s tcp:listen | sudo xargs kill
Hier ist ein Einzeiler, der den auszuführenden Befehl zeigt:
echo kill $(sudo netstat -anp | awk '/ LISTEN / {if($4 ~ ":80$") { gsub("/.*","",$7); print $7; exit } }')
Ersetzen Sie echo
bis sudo
damit der Prozess tatsächlich beendet wird.
Drei Optionen zum Auflisten offener Ports werden in whatisonport
von jsh angeboten :
netstat -anp --numeric-ports | grep ":${PORT}\>.*:"
fuser -v "${PORT}"/tcp
lsof -P -S 2 -i "tcp:${PORT}" | grep "\(:${PORT}->.*:\|:$PORT (LISTEN)$\)"
Ich bevorzuge netstat
weil es schnell und prägnant ist und von anderen Benutzern geöffnete Ports auflisten kann. (Obwohl es immer noch Superuser-/Benutzerrechte benötigt, um die Namen und PIDs solcher Prozesse aufzulisten.)
Ausgänge
$ 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)
...
Die Verwendung von grep
In zwei Fällen wird nur der Port auf der lokalen Seite abgeglichen und offene Verbindungen zu einem entfernten Port 80 übersprungen. (Eine Alternative wäre die Verwendung von -l
mit netstat
, oder mit lsof
um -sTCP:LISTEN
zu verwenden , aber ich mag die Greps oben, weil sie auch outgoing abfangen Verbindungen von der angegebene Port, der gelegentlich von Interesse sein kann.)
Mit lsof
wir verwenden -P
um :80
anzuzeigen statt :http
grep möglich zu machen. Die -S 2
Option erzwingt lsof
rechtzeitig abzuschließen.
Beenden des Prozesses
Angenommen, wir möchten netstat
verwenden , könnten wir die PIDs so abrufen:
$ netstat -anp --numeric-ports | grep ":80\>.*:" | grep -o "[0-9]*/" | sed 's+/$++'
1914
...
Und wir könnten diese PIDs sogar an kill
übergeben :
... | xargs -d '\n' kill -KILL
Bei der Verwendung von regulären Ausdrücken besteht jedoch häufig die Möglichkeit eines Fehlalarms, daher würde ich empfehlen, sich nur die anfängliche Ausgabe von netstat
anzusehen und dann manuell entscheiden, ob ausgeführt werden soll oder nicht:
$ kill -KILL 1914
Siehe auch
Ich habe ein anderes Skript namens listopenports
die von Interesse sein könnten.