GNU/Linux >> Znalost Linux >  >> Linux

Ukončit proces běžící na portu 80

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é.


Linux
  1. Jak zabít proces zombie na Linuxu

  2. Procesní potomci?

  3. Příklady příkazů kill v Linuxu

  1. Jak mohu zabít TCP port 16969 v Bash?

  2. Nalezení PID procesu pomocí konkrétního portu?

  3. Netcat - Jak naslouchat na TCP portu pomocí IPv6 adresy?

  1. Změnit prostředí běžícího procesu?

  2. Linux – Nalezení PID procesu pomocí konkrétního portu?

  3. Otevřený síťový port, ale není připojen žádný proces?