Zabij proces działający na porcie 80

14

Oto proces, który chcę zabić:

sooorajjj@Treako ~/Desktop/MerkMod $ sudo netstat -tunap | grep :80
tcp6    0   0 :::80   :::*     LISTEN    20570/httpd
Sooraj S.
źródło

Odpowiedzi:

31

Istnieje kilka sposobów sprawdzenia, który uruchomiony proces używa portu.

Użycie utrwalacza da PID (y) wielu wystąpień związanych z portem nasłuchującym.

sudo apt-get install psmisc
sudo fuser 80/tcp

80/tcp:               1858  1867  1868  1869  1871

Po dowiedzeniu się, możesz zatrzymać lub zabić proces (y).

Możesz również znaleźć PID i więcej szczegółów za 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)  

Aby ograniczyć się do gniazd nasłuchujących na porcie 80 (w przeciwieństwie do klientów łączących się z portem 80):

sudo lsof -i tcp:80 -s tcp:listen

Aby zabić ich automatycznie:

sudo lsof -t -i tcp:80 -s tcp:listen | sudo xargs kill
Rui F. Ribeiro
źródło
1
Chciałbym zaznaczyć, że utrwalacz ma również -kprzełącznik, który zabija wszystkie pasujące procesy i -izabija interaktywnie (monitując o każdy z nich).
A. Wilcox
7

Oto oneliner, który pokazuje polecenie do uruchomienia:

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

Zastąp echoprzez, sudoaby proces został zabity.

jlliagre
źródło
Zamień echonasudo
EliuX,
To idealna odpowiedź, którą musimy zastąpić naszym numerem portu 80.
Youssof H.,
4

Trzy opcje wystawianie otwarte porty są oferowane w JSH „s whatisonport:

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

fuser -v "${PORT}"/tcp

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

Wolę, netstatponieważ jest szybki, zwięzły i może wyświetlać porty otwarte przez innych użytkowników. (Chociaż nadal będzie potrzebował uprawnień administratora / użytkownika, aby wyświetlić listę nazw i PID takich procesów).

Wyjścia

$ 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)
...

W grepdwóch przypadkach można użyć tylko portu lokalnego i pomiń otwarte połączenia ze zdalnym portem 80. (Alternatywą byłoby użycie -lz netstatlub z lsofużyciem -sTCP:LISTEN, ale podobają mi się greps powyżej, ponieważ będą przechwytują również połączenia wychodzące z danego portu, które czasami mogą być interesujące.)

Z lsofużywamy -P, aby wyświetlić :80zamiast :httpaby grep możliwe. Te -S 2siły opcja lsofdo wykonania w krótkim czasie.

Zabicie procesu

Zakładając, że chcemy użyć netstat, możemy pobrać PID w następujący sposób:

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

I moglibyśmy nawet przekazać te PID do kill:

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

Jednak często występuje błąd fałszywie dodatni podczas używania wyrażeń regularnych, więc polecam po prostu przyjrzeć się wyjściowemu wynikowi, netstata następnie ręcznie zdecydować, czy uruchomić:

$ kill -KILL 1914

Zobacz też

Mam inny skrypt o nazwie, listopenportsktóry może być interesujący.

joeytwiddle
źródło
3

Dowiedziałeś się już, który proces zabić: jest to numer procesu, 20570a jego plik binarny ma nazwę httpdzapisaną na końcu wiersza wyniku netstat. Możesz go zabić według numeru kill 20570lub imienia, killall httpdale nie poleciłbym tego zrobić w ten sposób.

Porty mniejsze niż 1024 mają standardowe zastosowanie (normalnie), możesz sprawdzić te i wiele innych less /etc/services. Wpis dotyczący portu 80 jest nawet komentowany:

http            80/tcp          www             # WorldWideWeb HTTP

Więc najprawdopodobniej jest to serwer WWW. Nazwa masz jest httpdi man httpdpowinno dać dużą wskazówkę, że jest to binarny, który pasuje Apache. Apache jest jednym z dużych graczy, ma kilka wygodnych programów do zarządzania, ale nie potrzebujesz ich do zwykłej akcji start / stop.

Masz Mennicę? Z normalnym pulpitem? Następnie spójrz w Control Centerdół Systemi kliknij Services. Musisz być administratorem, aby cokolwiek tam zrobić. Przewiń w dół, aż znajdziesz coś o nazwie „serwer WWW” (mam lighttpd zamiast Apache i nie wiem dokładnie, jak wyglądałby wpis Apache) i odznacz to.

Jeśli chcesz tylko tymczasowo go zatrzymać, spróbuj w konsoli

sudo service stop httpd

i zacznij od sudo service start httpd. service --status-allzwraca listę wszystkich usług, które servicewie i może obsłużyć. Skrót do restartu usługi (czyli: zatrzymać i uruchomić go w tej kolejności) to service --full-restart SERVICEz SERVICEbycia nazwą usługi, np .: httpdw przypadku Apache.

Większość programów, z którymi się znajdujesz, netstatmożna obsługiwać w ten sposób. Niektóre nie mogą, a niektóre nawet nie mają strony podręcznika, ale są one rzadkie.

deamentiaemundi
źródło
0

Jest na to prosty sposób. Najpierw sprawdź, który proces używa portu 80 przez netstat :

netstat -ntl | grep 80

Teraz masz nazwę procesu i zabij proces za pomocą polecenia killall :

killall -9 process name
amit singh
źródło
Jakie są niebezpieczeństwa związane z używaniem polecenia „killall”?
Peter Mortensen
2
-1 za killallbez wyjaśnienia lub ostrzeżenia.
guntbert
1
Istnieje kilka problemów z killall. Oprócz tego, że jest w stanie ułożyć system na kolana w przypadku problemu, może również zabić wiele instancji procesu, który nie jest powiązany z portem. Podsumowując, największym problemem killall jest to, że jeśli ktoś w polu Solaris spróbuje go użyć, zabija wszystkie uruchomione procesy.
Rui F Ribeiro