linux - puertos - ¿Cómo vincular una conexión de red a un PID sin usar lsof o netstat?
ver puertos abiertos red hat (6)
¿Por qué no miras el código fuente de netstat y ves cómo obtiene la información? Es de código abierto.
¿Hay alguna manera de vincular una conexión de red a un PID (ID de proceso) sin bifurcar a lsof o netstat?
Actualmente lsof se está utilizando para sondear qué conexiones pertenecen a qué ID de proceso. Sin embargo, lsof o netstat pueden ser bastante caros en un host ocupado y le gustaría evitar tener que usar estas herramientas.
¿Hay algún lugar similar a / proc / $ pid donde uno pueda buscar esta información? Sé cuáles son las conexiones de red al examinar / proc / net, pero no entiendo cómo vincular esto a un pid. En / proc / $ pid, no parece haber información de red.
Los hosts de destino son Linux 2.4 y Solaris 8 a 10. Si es posible, una solución en Perl, pero estoy dispuesto a hacer C / C ++.
Notas adicionales:
Me gustaría enfatizar que el objetivo aquí es vincular una conexión de red a un PID. Obtener uno u otro es trivial, pero juntar los dos a bajo costo parece ser difícil. Gracias por las respuestas hasta ahora!
Lo más fácil de hacer es
strace -f netstat -na
En Linux (no sé sobre Solaris). Esto le dará un registro de todas las llamadas al sistema realizadas. Es una gran cantidad de resultados, algunos de los cuales serán relevantes. Eche un vistazo a los archivos en el sistema de archivos / proc que está abriendo. Esto debería llevarte a cómo lo hace netstat. Indeciblemente, ltrace te permitirá hacer lo mismo a través de la biblioteca c. No es útil para usted en este caso, pero puede ser útil en otras circunstancias.
Si no está claro de eso, entonces eche un vistazo a la fuente.
Para Linux, eche un vistazo al /proc/net
(por ejemplo, cat /proc/net/tcp
enumera sus conexiones tcp). No estoy seguro acerca de Solaris.
Más información aquí .
Supongo que netstat básicamente usa esta misma información, así que no sé si podrás acelerarlo mucho. Asegúrese de probar los indicadores netstat ''-an'' para NO resolver direcciones IP a nombres de host en tiempo real (ya que esto puede llevar mucho tiempo debido a consultas DNS).
No sé con qué frecuencia necesita sondear, o lo que quiere decir con "caro", pero con las opciones correctas tanto netstat
como lsof
corren mucho más rápido que en la configuración predeterminada.
Ejemplos:
netstat -ltn
muestra solo la impresión de tomas de cc, y omite la resolución de n ame (lenta) que está activada por defecto.
lsof -b -n -i4tcp:80
omite todas las operaciones de bloqueo b , una nueva resolución y limita la selección a las tomas IPv4 tcp en el puerto 80.
En Solaris puede usar pfiles(1)
para hacer esto:
# ps -fp 308
UID PID PPID C STIME TTY TIME CMD
root 308 255 0 22:44:07 ? 0:00 /usr/lib/ssh/sshd
# pfiles 308 | egrep ''S_IFSOCK|sockname: ''
6: S_IFSOCK mode:0666 dev:326,0 ino:3255 uid:0 gid:0 size:0
sockname: AF_INET 192.168.1.30 port: 22
Para Linux, esto es más complejo (espantoso):
# pgrep sshd
3155
# ls -l /proc/3155/fd | fgrep socket
lrwx------ 1 root root 64 May 22 23:04 3 -> socket:[7529]
# fgrep 7529 /proc/3155/net/tcp
6: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 7529 1 f5baa8a0 300 0 0 2 -1
00000000:0016
es 0.0.0.0:22
. Aquí está el resultado equivalente de netstat -a
:
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
Eche un vistazo a estas respuestas que exploran a fondo las opciones disponibles: