У меня есть небольшое приложение Java ServerSocket, работающее на порту 4444. Я хотел увидеть процесс, использующий этот порт в моем терминале OSX, и моей первой мыслью было сделать следующее:
netstat -a | grep 4444
однако это не дает мне никаких результатов.
lsof -i :4444
и я получаю следующий (правильный) результат:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 66389 admin 18u IPv6 0x1ae123a422ebe931 0t0 TCP *:krb524 (LISTEN)
Может ли кто-нибудь сказать мне, почему netstat не показывает порт, а lsof показывает?
Mac OSX основана на BSD, поэтому netstat
под Mac OSX не сможет показать вам имя pid / процесса. Как вы уже выяснили, lsof
это правильный выбор.
редактировать: Версия Netstat, включенная в Mac OSX, не интерпретирует -p
flag, как и в других дистрибутивах (протокол вместо программы), поэтому, хотя Netstat, вероятно, не работал по причинам, изложенным ниже, lsof
по-прежнему был правильным способом найти ответ.
Netstat по умолчанию использует понятные имена / определения для портов (например, ssh
вместо того 22
). Добавить -n
флаг для использования числовых адресов хостов и номеров портов. Дополнительно добавьте -p
чтобы показать PID и имя программы.
В итоге: netstat -anp | grep 4444
это, вероятно, то, что вам нужно.
Вот пример:
# netstat -anp | grep 10050
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 1121/zabbix_agentd
Netstat также распечатает любые другие связанные сетевые подключения, а не только сокеты в LISTEN
штат.