
Я пытаюсь использовать 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.
решение1
Ты можешь сделать
lsof -n | grep -i "TCP\|UDP" | grep -v "ESTABLISHED\|CLOSE_WAIT"
чтобы увидеть все ваши порты прослушивания, но не доллары, а пончики, которые запущены ntpd:
service ntpd status
А что касается "Что означает socket in use"? Если меня простят за сглаживание некоторых морщин (и за очень простое объяснение, извините, большая часть этого будет для вас поправимой)...TCP/IP (язык Интернета) определяет, что каждый компьютер имеет IP-адрес, который уникально идентифицирует этот компьютер в Интернете. Кроме того, на каждом IP-адресе есть 65 000 пронумерованных портов, к которым можно подключиться.
Когда вы хотите подключиться к веб-серверу, вы открываете сайт в своем браузере, но механизм, который находится за ним, на самом деле подключает вас к порту 80 на IP-адресе веб-сервера. Демон веб-сервера (программа, прослушивающая соединения с портом 80) использует «сокет», чтобы держать этот порт открытым, резервируя его для себя. Только одна программа может использовать один и тот же порт одновременно.
Поскольку у вас был запущен ntpd, он использовал этот порт. «ntpdate» попытался получить доступ к этому порту, но поскольку он уже был открыт, вы получили ошибку «сокет уже используется».
Редактировать
Изменено также для учета UDP
решение2
Вы также можете использовать netstat для поиска открытых сокетов — это гораздо чище, чем использование lsof, как предлагали другие постеры. Попробуйте эту командную строку как root
netstat -lp -u -t
для просмотра всех прослушиваемых подключений, включая их связанные pid и программы. Параметр -l определяет прослушиваемые подключения, -p указывает, что вы хотите увидеть PID/имя, а -t и -u сообщают netstat, что вам нужны только TCP и UDP-подключения (IPv4 и IPv6).
Если вы хотите увидеть числовые имена портов и хостов (т. е. не преобразованные в случае хостов и не преобразованные в имена служб в случае портов), вы можете добавить -n
в командную строку выше.
РЕДАКТИРОВАТЬ:Это работает на Linux. Не знаю, насколько хорошо это работает на BSD, так как у меня нет под рукой ни одной машины на базе BSD.
решение3
На FreeBSD вы также можете использовать sockstat в случае, если lsof не работает у вас (например, на виртуализированных системах, в которых по какой-либо причине нет /dev/mem). Чтобы получить список всех программ с прослушивающими сокетами IPv4:
sockstat -l4
решение4
Вы можете использовать его lsof
, чтобы узнать, какое приложение использует этот сокет.