¿Qué está usando este socket de red?

18

Estoy tratando de usar NTP para actualizar la hora en mi máquina. Sin embargo, me da un error:

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

¿Qué significa el error "el socket está en uso"? ¿Cómo puedo ver qué está usando este zócalo?

Esto sucede en mi sistema CentOS 4.x, pero también lo veo en FreeBSD 7.x, Ubuntu 10.04 y Solaris 10.

Stefan Lasiewski
fuente
En Stack Overflow: ¿Qué procesos están utilizando qué puertos en Unix? (2008-09-24)
Graham Perrin

Respuestas:

20

Tu puedes hacer

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

para ver todos sus puertos de escucha, pero dólares para donas que se está ejecutando ntpd:

service ntpd status

Y en cuanto a "¿Qué significa socket en uso"? Si se me puede perdonar por suavizar algunas arrugas (y para la explicación muy básica, las disculpas de la mayoría de esto es un remedio para usted) ... TCP / IP (el idioma de Internet) especifica que cada computadora tiene una dirección IP, que identifica de forma única esa computadora en Internet. Además, hay 65,000 puertos numerados en cada dirección IP a los que se puede conectar.

Cuando desea conectarse a un servidor web, abre el sitio en su navegador, pero la maquinaria que se encuentra debajo lo está conectando al puerto 80 en la IP del servidor web. El demonio del servidor web (el programa que escucha las conexiones al puerto 80) usa un "socket" para mantener abierto ese puerto, reservándolo para sí mismo. Solo un programa puede usar el mismo puerto a la vez.

Como tenía ntpd ejecutándose, estaba usando ese puerto. 'ntpdate' intentó acceder a ese puerto, pero como ya estaba abierto, recibió el error 'socket ya en uso'.

Editar
cambiado para tener en cuenta UDP también

Matt Simmons
fuente
1
¡Lsof mece mi mundo! grep en IPv4 también para encontrar varias cosas basadas en IP.
geoffc
"disculpas a todos los que ya sabían esto" - No te disculpes. Un propósito de este sitio es proporcionar buenas respuestas a preguntas comunes. El propósito de esta versión beta temprana es proporcionar contenido.
Stefan Lasiewski
Lo sé, pero quería asegurarme de que la persona que preguntaba supiera que no estaba tratando de hablar con ellos.
Matt Simmons
Hice la pregunta y no me estabas hablando mal. También sé la respuesta, pero creo que es una buena pregunta para la versión beta. Y su respuesta fue mucho mejor que cualquier cosa que escribiría;)
Stefan Lasiewski
@MattSimmons no hay Isofcomando en mi CentOS 7.
tres bloques el
10

También puede usar netstat para buscar tomas abiertas: es mucho más limpio que usar lsof como lo han sugerido los otros carteles. Prueba esta línea de comando como root

netstat -lp -u -t

para ver todas las conexiones de escucha, incluidos sus pid y programas asociados. El parámetro -l es lo que especifica las conexiones de escucha, -p especifica que desea ver el PID / nombre y -t y -u decirle a netstat que solo desea conexiones TCP y UDP (IPv4 e IPv6).

Si desea ver los puertos numéricos y los nombres de host (es decir, no resueltos en el caso de los hosts y no transformados en nombres de servicio en el caso de los puertos), puede agregarlos -na la línea de comandos anterior.

EDITAR: Esto funciona en Linux: no sé qué tan bien funciona en BSD, ya que no tengo ningún cuadro basado en BSD.

BR
fuente
+1: Esta es la única respuesta que realmente muestra el proceso ntpd (que escucha en UDP por defecto).
Stefan Lasiewski
Para los humanos: sus banderas son equivalentes anetstat --listen --programs --udp --tcp
Stefan Lasiewski
1
FreeBSD no admite '-p' ("Mostrar programas"), razón por la cual las personas usan LSOF. Tampoco es compatible con los indicadores -l ("Mostrar sockets de escucha"), pero creo que puede hacerlo | grep LISTEN, pero eso excluye las conexiones UDP. Pero de lo contrario, creo que las banderas equivalentes en FreeBSD son:, netstat -p udp -p tcp -apero netstat -apodrían ser más simples.
Stefan Lasiewski
@Stefan: Mi respuesta también mostrará los sockets UDP.
kbyrd
@kbyrd: Interesante. No muestra los paquetes UDP para mí. Mira mi comentario a tu publicación.
Stefan Lasiewski
2

En FreeBSD, también puede usar sockstat en caso de que lsof no funcione para usted (por ejemplo, en sistemas virtualizados que no tienen / dev / mem por alguna razón). Para obtener una lista de todos los programas con escucha de sockets IPv4:

sockstat -l4
diz
fuente
1

Como root, haz esto:

lsof | grep IPv4 | grep LISTEN

Esto le mostrará todos los procesos que están escuchando en sockets IPv4. Es posible que desee agregar -bpara evitar lsofhacer algunas cosas que podrían bloquearlo. Si lo haces, probablemente también quieras redirigir stderra /dev/null.

kbyrd
fuente
Para mí, esto no parece mostrar paquetes de udp. Estoy probando en un cuadro de Ubuntu que ejecuta rsyslogd, escuchando en el puerto 514 / udp.
Stefan Lasiewski
Necesito hacer sudo lsof |grep UDPpara ver los paquetes UDP.
Stefan Lasiewski
1

Puede usar lsofpara encontrar qué aplicación está usando este socket.

txwikinger
fuente
0

Jugando con este tres en uno en OS X 10.9.5:

sudo lsof | grep \ IPv | sort ; clear ; sudo lsof -U ; clear ; sudo netstat -a

Graham Perrin
fuente
0

Con FreeBSD, use el -uconmutador para que ntpdateuse un puerto sin privilegios.

Me gusta: ntpdate -v -b -u 0.freebsd.pool.ntp.org

Use man ntpdatepara ver qué -vy qué -bhace.

Monti
fuente
El ntpdate en Debian tiene la -uopción, ya que es de ntp.org, imagino que la mayoría de los sistemas lo tienen.
RobertL