Процесс Kill, запущенный на порту 80

14

Это процесс, который я хочу убить:

sooorajjj@Treako ~/Desktop/MerkMod $ sudo netstat -tunap | grep :80
tcp6    0   0 :::80   :::*     LISTEN    20570/httpd
Сурадж С
источник

Ответы:

31

Есть несколько способов определить, какой запущенный процесс использует порт.

Использование fuser даст PID для нескольких экземпляров, связанных с портом прослушивания.

sudo apt-get install psmisc
sudo fuser 80/tcp

80/tcp:               1858  1867  1868  1869  1871

Узнав, вы можете остановить или убить процесс (ы).

Вы также можете найти PID и более подробную информацию, используя 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)  

Чтобы ограничить сокеты, которые прослушивают порт 80 (в отличие от клиентов, которые подключаются к порту 80):

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

Чтобы убить их автоматически:

sudo lsof -t -i tcp:80 -s tcp:listen | sudo xargs kill
Руи Ф Рибейро
источник
1
Я хотел бы отметить, что fuser также имеет -kпереключатель, чтобы убить все совпадающие процессы, и -iубить в интерактивном режиме (предлагая вам для каждого).
А. Уилкокс
7

Вот oneliner, который показывает команду для запуска:

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

Замените echoна, sudoчтобы процесс действительно был убит.

jlliagre
источник
Заменить echoнаsudo
EliuX
Это идеальный ответ, мы просто должны заменить номер нашего порта 80.
Юссоф Х.
4

Три варианта списка открытых портов предлагается в JSH «s whatisonport:

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

fuser -v "${PORT}"/tcp

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

Я предпочитаю, netstatпотому что это быстро, кратко, и может перечислить порты, открытые другими пользователями. (Хотя ему все еще потребуются привилегии суперпользователя / пользователя для перечисления имен и идентификаторов PID таких процессов.)

Выходы

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

Использование grepв двух случаях - это сопоставление только порта на локальной стороне и пропуск открытых соединений с удаленным портом 80. (Альтернативой может быть использование -lс netstatили с lsofиспользованием -sTCP:LISTEN, но мне нравятся приведенные выше greps, потому что они будут также перехватывать исходящие соединения с данного порта, что иногда может представлять интерес.)

С помощью lsofмы используем -Pдля отображения :80вместо того, :httpчтобы сделать возможным grep. В -S 2опции силы , lsofчтобы завершить своевременно.

Убить процесс

Предполагая, что мы хотим использовать netstat, мы могли бы получить PID следующим образом:

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

И мы могли бы даже передать эти PID kill:

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

Однако при использовании регулярных выражений часто существует вероятность ложных срабатываний, поэтому я бы рекомендовал просто посмотреть на начальный вывод netstatи затем вручную решить, запускать или нет:

$ kill -KILL 1914

Смотрите также

У меня есть другой скрипт, listopenportsкоторый может быть интересен.

joeytwiddle
источник
3

Вы уже выяснили, какой процесс нужно убить: это номер процесса, 20570а его двоичный файл имеет имя, httpdзаписанное в конце строки вывода netstat. Вы можете убить его по номеру kill 20570или по имени, killall httpdно я бы не рекомендовал делать это таким образом.

Порты ниже 1024 имеют стандартизированное использование (обычно), вы можете искать те и многие другие less /etc/services. Запись для порта 80 даже прокомментирована:

http            80/tcp          www             # WorldWideWeb HTTP

Так что это, скорее всего, веб-сервер. Имя у вас есть httpdи man httpdдолжны дать вам большой намек , что это бинарный Apache , который подходит. Apache - один из крупных игроков, у него есть несколько удобных управляющих программ, но они вам не нужны для простого запуска / остановки.

У вас есть мята? С нормальным рабочим столом? Затем посмотрите в Control Centerнижнюю Systemи нажмите Services. Вы должны быть администратором, чтобы сделать что-нибудь там. Прокрутите вниз, пока не найдете что-то с надписью «веб-сервер» (у меня вместо Apache lighttpd и я точно не знаю, как будет выглядеть запись Apache) и снимите флажок.

Если вы просто хотите временно остановить его, попробуйте в консоли

sudo service stop httpd

и начать с sudo service start httpd. service --status-allвозвращает список всех сервисов, которые serviceзнает и может обработать. Ярлык для перезапуска службы (то есть: остановки и запуска его в этом порядке) service --full-restart SERVICEс SERVICEбыть имя службы, например .: httpdв случае Apache.

Большинство программ, которые вы можете найти, netstatмогут быть обработаны таким образом. Некоторые не могут, а некоторые даже не имеют man-страницы, но это редкость.

deamentiaemundi
источник
0

Есть простой способ сделать это. Сначала проверьте, какой процесс использует порт 80 с помощью netstat :

netstat -ntl | grep 80

Теперь вы получили имя процесса и уничтожаете его командой killall :

killall -9 process name
амит сингх
источник
Каковы опасности использования команды killall?
Питер Мортенсен
2
-1 за killallбез объяснения причин или предупреждений.
Гунберт
1
Есть несколько проблем с killall. Помимо возможности поставить на колени систему в случае возникновения проблемы, она также может уничтожить несколько экземпляров процесса, который не связан с портом. В довершение всего, самая большая проблема killall заключается в том, что, если кто-то из ящика Solaris пытается его использовать, он убивает все запущенные процессы.
Руи Ф Рибейро