我正在尝试使用 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
至于“正在使用的套接字是什么意思”?如果我可以原谅我抚平一些皱纹(对于非常基本的解释,其中大部分的道歉对您来说是补救措施)...TCP/IP(互联网语言)指定每台计算机都有一个 IP 地址,它在互联网上唯一标识该计算机。此外,每个 IP 地址上还有 65,000 个可连接的编号端口。
当您想要连接到 Web 服务器时,您可以在浏览器中打开该站点,但底层的机器实际上是将您连接到 Web 服务器 IP 上的端口 80。 Web 服务器的守护进程(侦听端口 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 上,如果 lsof 不起作用(例如,在出于某种原因没有 /dev/mem 的虚拟化系统上),您还可以使用 sockstat。要获取所有正在侦听 IPv4 套接字的程序的列表:
sockstat -l4
答案4
您可以使用lsof
来查找哪个应用程序正在使用此套接字。