В Linux я могу использовать netstat -pntl | grep $PORT
или fuser -n tcp $PORT
, чтобы узнать, какой процесс (PID) прослушивает указанный порт TCP. Как мне получить ту же информацию в Mac OS X?
Кто прослушивает данный TCP-порт в Mac OS X?
Ответы (17)
В macOS Big Sur
и новее используйте эту команду:
sudo lsof -i -P | grep LISTEN
или просто увидеть IPv4:
sudo lsof -nP -i4TCP:$PORT | grep LISTEN
В более старых версиях используйте одну из следующих форм:
sudo lsof -nP -iTCP:$PORT | grep LISTEN
sudo lsof -nP -i:$PORT | grep LISTEN
Замените $PORT
номером порта или списком номеров портов, разделенных запятыми.
Если вам нужна информация о портах ниже # 1024, добавьте перед sudo
(за которым следует пробел).
Флаг -n
предназначен для отображения IP-адресов вместо имен хостов. Это заставляет команду выполняться намного быстрее, потому что поиск DNS для получения имен хостов может быть медленным (несколько секунд или минут для многих хостов).
Флаг -P
предназначен для отображения необработанных номеров портов вместо разрешенных имен, таких как http
, ftp
, или более эзотерических имен служб, таких как dpserve
, socalia
.
Смотрите комментарии для получения дополнительных опций.
Для полноты картины, потому что часто используются вместе:
Чтобы убить PID:
sudo kill -9 <PID>
# kill -9 60401
sudo
, чтобы увидеть процессы, которыми вы не владеете.
- person Gordon Davisson; 12.12.2010
sudo lsof -i TCP:$PORT | grep LISTEN
- person dhaval; 17.08.2012
grep
: sudo lsof -iTCP:$PORT -sTCP:LISTEN
- person Siu Ching Pong -Asuka Kenji-; 13.07.2013
sudo
. Можно попробовать, поскольку он позволяет запускать его без ввода пароля. :)
- person Tom Fink; 12.03.2014
kill -9 <the-f-ing-pid>
для его устранения
- person Zennichimaro; 05.03.2020
read K_PORT; lsof -iTCP:$K_PORT -sTCP:LISTEN | tail -n 1 | awk '{ print $2 }' | xargs kill -9
- person Vasu Adari; 27.06.2020
lsof: unacceptable port specification in: -i 4TCP
- person Vedmant; 01.02.2021
| grep LISTEN
я рекомендую использовать sed, чтобы вы также могли видеть заголовки столбцов | sed -n '1p;/LISTEN/p'
- person Jeff; 11.02.2021
Начиная со Snow Leopard, до Catalina и Big Sur, каждая версия macOS поддерживает следующее:
sudo lsof -iTCP -sTCP:LISTEN -n -P
Лично я получил эту простую функцию в моем ~/.bash_profile
:
listening() {
if [ $# -eq 0 ]; then
sudo lsof -iTCP -sTCP:LISTEN -n -P
elif [ $# -eq 1 ]; then
sudo lsof -iTCP -sTCP:LISTEN -n -P | grep -i --color $1
else
echo "Usage: listening [pattern]"
fi
}
Затем команда listening
дает вам список процессов, прослушивающих какой-либо порт, и listening smth
ищет в нем какой-то шаблон.
Имея это, довольно легко спросить о конкретном процессе, например listening dropbox
или порт, например listening 22
.
В команде lsof
есть несколько специализированных параметров для запроса порта, протокола, процесса и т. Д., Но лично я нашел вышеупомянутую функцию гораздо более удобной, поскольку мне не нужно запоминать все эти низкоуровневые параметры. lsof
- довольно мощный инструмент, но, к сожалению, не очень удобный в использовании.
-pntl
, в котором будут перечислены все службы. В принятом ответе предлагается указать один или несколько номеров порта, что удаленно отличается.
- person seeafish; 07.11.2019
Вы также можете использовать:
sudo lsof -i -n -P | grep TCP
Это работает в Mavericks.
-i
делает это значительно быстрее. 0,02 секунды против 2 секунд. В моем приложении это имело большое значение.
- person Eric Boehs; 20.12.2014
Обновление, январь 2016 г.
По-настоящему удивленный, никто не предложил:
lsof -i :PORT_NUMBER
чтобы получить основную необходимую информацию. Например, проверка порта 1337:
lsof -i :1337
Другие варианты, в зависимости от обстоятельств:
sudo lsof -i :1337
lsof -i tcp:1337
Вы можете легко использовать это для извлечения самого PID. Например:
lsof -t -i :1337
что также эквивалентно (в результате) этой команде:
lsof -i :1337 | awk '{ print $2; }' | head -n 2 | grep -v PID
Быстрая иллюстрация:
Для полноты картины, поскольку часто используются вместе:
Чтобы убить PID:
kill -9 <PID>
# kill -9 60401
или как один лайнер:
kill -9 $(lsof -t -i :1337)
lsof -t -i :1338
. -t
вернет идентификатор процесса, поэтому вам не придется выполнять awk / head.
- person KFunk; 20.08.2016
kill -9 $(lsof -t -i :5000)
на el capitan
- person goksel; 29.09.2016
whatsonport() { ps -ef | grep `lsof -t -i :$1` }
, так что: ⇒ whatsonport 3000 --> 501 14866 14865 0 6:07AM ttys006 0:01.73 node .
- person Sigfried; 13.04.2017
lsof -i :PORT_NUMBER
сделал для меня работу.
- person marika.daboja; 12.05.2020
Это работает в Mavericks (OSX 10.9.2).
sudo lsof -nP -iTCP:$PORT -sTCP:LISTEN
Для портов LISTEN, ESTABLISHED и CLOSED
sudo lsof -n -i -P | grep TCP
Только для портов LISTEN
sudo lsof -n -i -P | grep LISTEN
Для конкретного порта LISTEN, например: порт 80
sudo lsof -n -i -P | grep ':80 (LISTEN)'
Или, если вам просто нужна краткая сводка [службы / приложения не описаны], воспользуйтесь NETSTAT. Хорошая сторона здесь в том, что sudo не требуется
netstat -a -n | grep 'LISTEN '
Объяснение используемых предметов:
-n подавить имя хоста
-i для протоколов IPv4 и IPv6
-P не указывать имена портов
-a [over netstat] для всех сокетов
-n [over netstat] не разрешать имена, показывать сетевые адреса в виде чисел
Проверено на High Sierra 10.13.3 и Mojave 10.14.3.
- последний синтаксис netstat также работает в Linux
в OS X вы можете использовать параметр -v для netstat, чтобы указать связанный pid.
тип:
netstat -anv | grep [.]PORT
вывод будет выглядеть так:
tcp46 0 0 *.8080 *.* LISTEN 131072 131072 3105 0
PID - это число перед последним столбцом, в данном случае 3105.
grep LISTEN
, чтобы показывать только слушателей.
- person pts; 07.01.2016
lsof
не смог найти порт. но netstat
показал, что он был открыт. -v
был секретным соусом, которого мне не хватало.
- person Aaron McMillin; 29.11.2017
В macOS есть простой способ получить идентификатор процесса, который прослушивает определенный порт, с помощью netstat. В этом примере выполняется поиск процесса, обслуживающего контент на порту 80:
найти сервер, работающий на порту 80
netstat -anv | egrep -w [.]80.*LISTEN
образец вывода
tcp4 0 0 *.80 *.* LISTEN 131072 131072 715 0
Второй из последнего столбца - это PID. Выше это 715.
параметры
-a
- показать все порты, в том числе используемые серверами
-n
- показывать числа, не искать имена. Это делает команду на много быстрее
-v
- подробный вывод, чтобы получить идентификаторы процессов
-w
- поисковые слова. В противном случае команда вернет информацию для портов 8000 и 8001, а не только "80".
LISTEN
- давать информацию только для портов в режиме LISTEN, т.е. серверов
В последней версии macOS вы можете использовать эту команду:
lsof -nP -i4TCP:$PORT | grep LISTEN
Если вам трудно запомнить, то, возможно, вам следует создать функцию bash
и экспортировать ее с более удобным именем, например так
vi ~/.bash_profile
а затем добавьте в этот файл следующие строки и сохраните его.
function listening_on() {
lsof -nP -i4TCP:"$1" | grep LISTEN
}
Теперь вы можете ввести listening_on 80
в свой терминал и посмотреть, какой процесс прослушивает порт 80
.
В Snow Leopard (OS X 10.6.8) запуск man lsof дает:
lsof -i 4 -a
(фактический ручной ввод - 'lsof -i 4 -a -p 1234')
Предыдущие ответы не работали на Snow Leopard, но я пытался использовать netstat -nlp, пока не увидел использование lsof в ответе pts.
Я парень Linux. В Linux это очень просто с netstat -ltpn
или любой комбинацией этих букв. Но в Mac OS X netstat -an | grep LISTEN
это самое гуманное. Другие очень уродливы, и их трудно запомнить при поиске и устранении неисправностей.
lsof -n -i | awk '{ print $1,$9; }' | sort -u
Это показывает, кто чем занимается. Удалите -n, чтобы увидеть имена хостов (немного медленнее).
If no address is specified, this option [-i] selects the listing of all Internet and x.25 (HP-UX) network files.
- person Misha Tavkhelidze; 05.05.2014
-sTCP:LISTEN
в lsof
- person Misha Tavkhelidze; 11.01.2016
Это сделало то, что мне было нужно.
ps -eaf | grep `lsof -t -i:$PORT`
Я сделал небольшой скрипт, чтобы не только видеть, кто где слушает, но и отображать установленные связи и с какими странами. Работает на OSX Siera
#!/bin/bash
printf "\nchecking established connections\n\n"
for i in $(sudo lsof -i -n -P | grep TCP | grep ESTABLISHED | grep -v IPv6 |
grep -v 127.0.0.1 | cut -d ">" -f2 | cut -d " " -f1 | cut -d ":" -f1); do
printf "$i : " & curl freegeoip.net/xml/$i -s -S | grep CountryName |
cut -d ">" -f2 | cut -d"<" -f1
done
printf "\ndisplaying listening ports\n\n"
sudo lsof -i -n -P | grep TCP | grep LISTEN | cut -d " " -f 1,32-35
#EOF
Sample output
checking established connections
107.178.244.155 : United States
17.188.136.186 : United States
17.252.76.19 : United States
17.252.76.19 : United States
17.188.136.186 : United States
5.45.62.118 : Netherlands
40.101.42.66 : Ireland
151.101.1.69 : United States
173.194.69.188 : United States
104.25.170.11 : United States
5.45.62.49 : Netherlands
198.252.206.25 : United States
151.101.1.69 : United States
34.198.53.220 : United States
198.252.206.25 : United States
151.101.129.69 : United States
91.225.248.133 : Ireland
216.58.212.234 : United States
displaying listening ports
mysqld TCP *:3306 (LISTEN)
com.avast TCP 127.0.0.1:12080 (LISTEN)
com.avast TCP [::1]:12080 (LISTEN)
com.avast TCP 127.0.0.1:12110 (LISTEN)
com.avast TCP [::1]:12110 (LISTEN)
com.avast TCP 127.0.0.1:12143 (LISTEN)
com.avast TCP [::1]:12143 (LISTEN)
com.avast TCP 127.0.0.1:12995 (LISTEN)
com.avast [::1]:12995 (LISTEN)
com.avast 127.0.0.1:12993 (LISTEN)
com.avast [::1]:12993 (LISTEN)
Google TCP 127.0.0.1:34013 (LISTEN)
Это может быть полезно, чтобы проверить, подключены ли вы к Северной Корее! ;-)
Вдохновленный пользователем Брент Селф:
lsof -i 4 -a | grep LISTEN
Для macOS я использую две команды вместе, чтобы показать информацию о процессах, прослушивающих машину, и о процессе, подключающемся к удаленным серверам. Другими словами, чтобы проверить порты прослушивания и текущие (TCP) соединения на хосте, вы можете использовать две следующие команды вместе
1. netstat -p tcp -p udp
2. lsof -n -i4TCP -i4UDP
Думал, что добавлю свой вклад, надеюсь, это может кому-то помочь.
Это хороший способ для macOS High Sierra:
netstat -an |grep -i listen
netstat -p tcp | grep $PORT
не отображает PID, поскольку netstat в Mac OS X не может отображать PID. - person pts   schedule 12.12.2010netstat -anv
отображает порт в Mac OS X (источник: решение, приведенное ниже @SeanHamiliton) - person Curtis Yallop   schedule 27.04.2018