Відповіді:
Існує кілька способів знайти, який запущений процес використовує порт.
Використовуючи фюзер, він дасть 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
, але мені подобаються відповідні греки вище, тому що вони будуть також вловлювати вихідні з'єднання з даного порту, що може іноді представляти інтерес.)
З 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
. Вам потрібно бути адміністратором, щоб робити що-небудь там. Прокрутіть униз до тих пір, поки не знайдете щось з написом "веб-сервер" (у мене є lighttpd замість Apache і не знаю, як точно виглядатиме запис Apache), і зніміть його.
Якщо ви просто хочете тимчасово зупинити це, спробуйте, в консолі
sudo service stop httpd
і почати з sudo service start httpd
. service --status-all
повертає список усіх служб, service
про які знає і може обробляти. Ярлик для перезапуску служби (тобто: зупинки і запуску його в цьому порядку) service --full-restart SERVICE
з SERVICE
бути ім'я служби, наприклад.: httpd
В разі Apache.
Більшість програм, з якими ви знаходитесь, netstat
можуть обробляти таким чином. Деякі не можуть, а деякі навіть не мають довідкової сторінки, але вони рідкісні.
Існує простий спосіб зробити це. Спочатку перевірте, який процес використовує порт 80 через netstat :
netstat -ntl | grep 80
Тепер ви отримали ім'я процесу та вбити процес за допомогою команди killall :
killall -9 process name
killall
без пояснень чи попередження.
-k
перемикач, щоб знищити всі відповідні процеси та-i
вбивати інтерактивно (підказуючи для кожного з них).