Beenden Sie den Prozess, der auf Port 80 ausgeführt wird

13

Dies ist der Prozess, den ich töten möchte:

sooorajjj@Treako ~/Desktop/MerkMod $ sudo netstat -tunap | grep :80
tcp6    0   0 :::80   :::*     LISTEN    20570/httpd
Sooraj S.
quelle

Antworten:

30

Es gibt verschiedene Möglichkeiten, um herauszufinden, welcher laufende Prozess einen Port verwendet.

Bei Verwendung der Fixiereinheit werden die PIDs der mehreren Instanzen angegeben, die dem Überwachungsport zugeordnet sind.

sudo apt-get install psmisc
sudo fuser 80/tcp

80/tcp:               1858  1867  1868  1869  1871

Nachdem Sie es herausgefunden haben, können Sie die Prozesse entweder stoppen oder beenden.

Sie können die PIDs und weitere Details auch mit lsof finden

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)  

Zur Begrenzung auf Sockets , die hören auf Port 80 (im Gegensatz zu Kunden gegenüber, die auf 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
Rui F Ribeiro
quelle
1
Ich möchte darauf hinweisen, dass die Fixiereinheit auch den -kSchalter hat, alle übereinstimmenden Prozesse zu beenden und -iinteraktiv zu beenden (was Sie zu jedem einzelnen auffordert).
A. Wilcox
7

Hier ist ein Oneliner, der den auszuführenden Befehl anzeigt:

echo kill $(sudo netstat -anp | awk '/ LISTEN / {if($4 ~ ":80$") { gsub("/.*","",$7); print $7; exit } }')

Ersetzen echodurch, sudodamit der Prozess tatsächlich beendet wird.

jlliagre
quelle
Ersetzen echofürsudo
EliuX
Dies ist die perfekte Antwort, durch die wir nur unsere Portnummer ersetzen müssen 80.
Youssof H.
4

In jsh 's werden drei Optionen zum Auflisten offener Ports angeboten whatisonport:

netstat -anp --numeric-ports | grep ":${PORT}\>.*:" 

fuser -v "${PORT}"/tcp

lsof -P -S 2 -i "tcp:${PORT}" | grep "\(:${PORT}->.*:\|:$PORT (LISTEN)$\)"

Ich bevorzuge, netstatweil es schnell und präzise ist und Ports auflisten kann, die von anderen Benutzern geöffnet wurden. (Obwohl weiterhin Superuser- / Benutzerrechte erforderlich sind, 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 grepin zwei Fällen ist auf der lokalen Seite nur den Hafen zu entsprechen, und übersprang offene Verbindungen zu einem Remote - Port 80 (Eine Alternative wäre die Verwendung -lmit netstatoder mit lsofzu verwenden -sTCP:LISTEN, aber ich mag den greps oben , weil sie wollen Fangen Sie auch ausgehende Verbindungen vom angegebenen Port ab, was gelegentlich von Interesse sein kann.)

Mit verwenden lsofwir, -Pum anzuzeigen, :80anstatt :httpdas grep möglich zu machen. Die -S 2Option muss lsofrechtzeitig abgeschlossen werden.

Den Prozess beenden

Angenommen, wir möchten verwenden netstat, könnten wir die PIDs wie folgt erfassen:

$ netstat -anp --numeric-ports | grep ":80\>.*:" | grep -o "[0-9]*/" | sed 's+/$++'
1914
...

Und wir könnten diese PIDs sogar weitergeben an kill:

... | xargs -d '\n' kill -KILL

Bei der Verwendung von regulären Ausdrücken kann es jedoch häufig zu Fehlalarmen kommen. Daher würde ich empfehlen, nur die anfängliche Ausgabe von zu betrachten netstatund dann manuell zu entscheiden, ob Folgendes ausgeführt werden soll oder nicht:

$ kill -KILL 1914

Siehe auch

Ich habe ein anderes Skript namens, listopenportsdas von Interesse sein kann.

joeytwiddle
quelle
3

Sie haben bereits herausgefunden, welcher Prozess beendet werden soll: Die Prozessnummer 20570und die Binärdatei haben den Namen httpd, der am Ende der Zeile der Ausgabe von steht netstat. Sie können es nach Nummer kill 20570oder Name töten, killall httpdaber ich würde nicht empfehlen, es so zu machen.

Ports unter 1024 werden (normalerweise) standardisiert verwendet. Sie können diese und viele andere Ports nachschlagen less /etc/services. Der Eintrag für Port 80 ist sogar kommentiert:

http            80/tcp          www             # WorldWideWeb HTTP

Es handelt sich also höchstwahrscheinlich um einen Webserver. Der Name, den Sie haben, ist httpdund man httpdsollte Ihnen den großen Hinweis geben, dass es die Apache-Binärdatei ist, die passt. Apache ist einer der großen Player. Es stehen einige komfortable Management-Programme zur Verfügung, die Sie jedoch nicht für eine bloße Start / Stopp-Aktion benötigen.

Sie haben Minze? Mit einem normalen Desktop? Dann schauen Sie in das Control CenterUnter Systemund klicken Sie Services. Sie müssen Administrator sein, um dort etwas zu tun. Scrollen Sie nach unten, bis Sie etwas mit der Bezeichnung "Webserver" finden (ich habe lighttpd anstelle von Apache und weiß nicht genau, wie der Apache-Eintrag aussehen würde) und deaktivieren Sie es.

Wenn Sie es nur vorübergehend stoppen möchten, versuchen Sie es in der Konsole

sudo service stop httpd

und beginnen mit sudo service start httpd. service --status-allGibt eine Liste aller Dienste zurück service, die bekannt sind und verarbeitet werden können. Eine Verknüpfung für einen Neustart eines Dienstes (das heißt: stop und es in dieser Reihenfolge starten) ist service --full-restart SERVICEmit SERVICEdem Namen des Dienstes zu sein, zB .: httpdbei Apache.

Die meisten Programme, mit denen Sie arbeiten, netstatkönnen auf diese Weise behandelt werden. Einige können nicht und einige haben nicht einmal eine Manpage, aber diese sind selten.

deamentiaemundi
quelle
0

Es gibt einen einfachen Weg, dies zu tun. Überprüfen Sie zunächst, welcher Prozess Port 80 von netstat verwendet :

netstat -ntl | grep 80

Jetzt haben Sie den Prozessnamen und beenden den Prozess mit dem Befehl killall :

killall -9 process name
amit singh
quelle
Was sind die Gefahren bei der Verwendung des Befehls 'killall'?
Peter Mortensen
2
-1 für killallohne Erklärung oder Warnung.
Guntbert
1
Es gibt mehrere Probleme mit Killall. Neben der Möglichkeit, ein System im Falle eines Problems in die Knie zu zwingen, kann es auch mehrere Instanzen eines Prozesses töten, der nicht mit dem Port verbunden ist. Um das Ganze abzurunden, besteht das größte Problem von killall darin, dass alle laufenden Prozesse abgebrochen werden, wenn jemand in einer Solaris-Box versucht, es zu verwenden.
Rui F Ribeiro