Ответы:
Есть несколько способов определить, какой запущенный процесс использует порт.
Использование 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
Вот oneliner, который показывает команду для запуска:
echo kill $(sudo netstat -anp | awk '/ LISTEN / {if($4 ~ ":80$") { gsub("/.*","",$7); print $7; exit } }')
Замените echo
на, sudo
чтобы процесс действительно был убит.
echo
наsudo
80
.
Три варианта списка открытых портов предлагается в 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
который может быть интересен.
Вы уже выяснили, какой процесс нужно убить: это номер процесса, 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-страницы, но это редкость.
Есть простой способ сделать это. Сначала проверьте, какой процесс использует порт 80 с помощью netstat :
netstat -ntl | grep 80
Теперь вы получили имя процесса и уничтожаете его командой killall :
killall -9 process name
killall
без объяснения причин или предупреждений.
-k
переключатель, чтобы убить все совпадающие процессы, и-i
убить в интерактивном режиме (предлагая вам для каждого).