Что использует этот сетевой сокет?


18

Я пытаюсь использовать NTP для обновления времени на моей машине. Тем не менее, это дает мне ошибку:

host # ntpdate ntp1.example.org
10 Aug 12:38:50 ntpdate[7696]: the NTP socket is in use, exiting

Что означает ошибка «используется сокет»? Как я могу увидеть, что использует этот сокет?

Это происходит в моей системе CentOS 4.x, но я также вижу это во FreeBSD 7.x, Ubuntu 10.04 и Solaris 10.


Ответы:


20

Ты можешь сделать

lsof -n | grep -i "TCP\|UDP" | grep -v "ESTABLISHED\|CLOSE_WAIT"

чтобы увидеть все ваши порты прослушивания, кроме долларов на пончики, которые запускает ntpd:

service ntpd status

А что означает «Что использует сокет»? Если я могу быть прощен за сглаживание некоторых морщин (и за самое простое объяснение, извинения большинства из них являются исправительными для вас) ... TCP / IP (язык Интернета) указывает, что у каждого компьютера есть IP-адрес, который однозначно идентифицирует этот компьютер в интернете. Кроме того, на каждом IP-адресе есть 65 000 пронумерованных портов, к которым можно подключиться.

Когда вы хотите подключиться к веб-серверу, вы открываете сайт в браузере, но механизм под ним фактически соединяет вас с портом 80 на IP-адресе веб-сервера. Демон веб-сервера (программа, прослушивающая соединения с портом 80) использует «сокет», чтобы держать этот порт открытым, зарезервировав его для себя. Только одна программа может использовать один и тот же порт одновременно.

Так как у вас был запущен ntpd, он использовал этот порт. «ntpdate» попытался получить доступ к этому порту, но, поскольку он уже оставался открытым, вы получили ошибку «сокет уже используется».

Изменить
Изменено также учетная запись для UDP


1
Это потрясает мой мир! grep для IPv4, а также для поиска различных вещей, основанных на IP.
Geoffc

«Извинения всем, кто уже знал это» - не извиняйся. Одна из целей этого сайта - дать хорошие ответы на распространенные вопросы. Целью этой ранней бета-версии является предоставление контента.
Стефан Ласевски

Я знаю, но я хотел убедиться, что спрашивающий знал, что я не пытался говорить с ними.
Мэтт Симмонс

Я задал вопрос, а ты не разговаривал со мной. Я также знаю ответ, но думаю, что это хороший вопрос для беты. И ваш ответ был намного лучше, чем все, что я бы написал;)
Стефан Ласевский

@MattSimmons нет Isofкоманды в моем CentOS 7.
три блока

10

Вы также можете использовать netstat для поиска открытых сокетов - это намного чище, чем использование lsof, как предлагали другие авторы. Попробуйте эту командную строку как root

netstat -lp -u -t

просматривать все прослушивающие соединения, включая связанные с ними pid и программы. Параметр -l - это то, что определяет прослушиваемые соединения, -p указывает, что вы хотите видеть PID / name, а -t и -u сообщают netstat, что вам нужны только соединения TCP и UDP (IPv4 и IPv6).

Если вы хотите видеть числовые порты и имена хостов (т.е. не разрешены в случае хостов и не преобразованы в имена сервисов в случае портов), вы можете добавить -nих в командную строку выше.

РЕДАКТИРОВАТЬ: Это работает на Linux - я не знаю, насколько хорошо это работает на BSD, так как у меня нет никаких коробок на основе BSD вокруг.


+1: это единственный ответ, который фактически показывает процесс ntpd (который по умолчанию прослушивает UDP).
Стефан Ласевский

Для людей: Ваши флаги эквивалентныnetstat --listen --programs --udp --tcp
Стефан Ласевский

1
FreeBSD не поддерживает '-p' («Показать программы»), поэтому люди используют LSOF. Он также не поддерживает флаги -l («Показать прослушивающие сокеты»), но я думаю, что вы можете сделать это с помощью | grep LISTEN, но это исключает UDP-соединения. Но в остальном я думаю, что эквивалентные флаги во FreeBSD:, netstat -p udp -p tcp -aно netstat -aмогут быть проще.
Стефан Ласевский

@Stefan: Мой ответ также покажет сокеты UDP.
kbyrd

@kbyrd: интересно. Это не показывает пакеты UDP для меня. Смотрите мой комментарий к вашему посту.
Стефан Ласевский

2

В FreeBSD вы также можете использовать sockstat в случае, если lsof не работает для вас (например, в виртуализированных системах, которые по какой-либо причине не имеют / dev / mem). Чтобы получить список всех программ с прослушиванием сокетов IPv4:

sockstat -l4

1

От имени root сделайте это:

lsof | grep IPv4 | grep LISTEN

Это покажет вам все процессы, которые прослушивают сокеты IPv4. Вы можете добавить, -bчтобы предотвратить lsofнекоторые вещи, которые могут его заблокировать. Если вы сделаете это, вы, вероятно, также захотите перенаправить stderrна /dev/null.


Для меня это не похоже на пакеты udp. Я тестирую на Ubuntu box, на котором запущен rsyslogd, слушаю порт 514 / udp.
Стефан Ласевский

Мне нужно сделать, sudo lsof |grep UDPчтобы увидеть UDP-пакеты.
Стефан Ласевский

1

Вы можете использовать, lsofчтобы найти, какое приложение использует этот сокет.



0

В FreeBSD используйте -uкоммутатор, чтобы ntpdateвместо него использовать непривилегированный порт.

Подобно: ntpdate -v -b -u 0.freebsd.pool.ntp.org

Используйте, man ntpdateчтобы увидеть, что -vи -bделает.


У ntpdate в Debian есть -uопция, так как она с ntp.org, я думаю, что у большинства систем она есть.
RobertL
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.