Estoy usando CentOS 7. Quiero obtener el PID (si existe) del proceso que se ejecuta en el puerto 3000. Me gustaría obtener este PID con el fin de guardarlo en una variable en un script de shell. Hasta ahora tengo
[rails@server proddir]$ sudo ss -lptn 'sport = :3000'
State Recv-Q Send-Q Local Address:Port Peer Address:Port
Cannot open netlink socket: Protocol not supported
LISTEN 0 0 *:3000 *:* users:(("ruby",pid=4861,fd=7),("ruby",pid=4857,fd=7),("ruby",pid=4855,fd=7),("ruby",pid=4851,fd=7),("ruby",pid=4843,fd=7))
pero no puedo entender cómo aislar el PID por sí solo sin toda esta información adicional.
linux
shell-script
process
port
Dave
fuente
fuente
sudo ss -lptnH "sport = :22" | awk -F " " '{printf $6}' | sed 's/.\+pid=\([0-9]\+\).\+/\1/g'
. ¿Necesitas explicación?ss
sin esta opción. Debería funcionar incluso sin él:sudo ss -lptn "sport = :22" | awk -F " " '{printf $6}' | sed 's/.\+pid=\([0-9]\+\).\+/\1/g'
Respuestas:
Otra posible solución:
Por ejemplo:
fuente
TCP:LISTEN
.-s
clave. Lo he arreglado en el patrón. Un ejemplo tenía esta clave.Prueba esto:
(requiere
psmisc
paquete)Tenga en cuenta que esto es confiable solo cuando lo ejecuta el usuario root. Otros usuarios solo pueden esperar encontrar procesos que se ejecuten con el mismo usuario.
Explicación aburrida para el acceso solo root con un ejemplo aquí.
Cualquiera que sea el método utilizado (fusor, ss, lsof, ...) todos terminan haciendo coincidir la lista disponible de descriptores de proceso con una lista disponible de conexiones de red (por ejemplo, para tcp está disponible en
/proc/net/tcp
).Por ejemplo, tratar de obtener el pid utilizando el puerto
22/tcp
(con 22 = 0x0016) terminaría haciendo este tipo de comparación:Entrada desde
/proc/net/tcp
:0: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 141408 1 000000000a9ac1b5 100 0 0 10 0
con:
dr-x------. 2 root root 0 May 14 17:59 /proc/358/fd lrwx------. 1 root root 64 May 14 17:59 /proc/358/fd/3 -> socket:[141408]
Como este descriptor de fd solo está disponible para su usuario (que en este ejemplo es root) o root, solo ese usuario o root puede descubrir que el pid es 358.
fuente
Mientras
lsof
's-t
es la forma más simple de obtener el PID,lsof
también tiene formas de seleccionar otros campos usando la-F
opción:Con resultados como este (tenga en cuenta que el PID y los descriptores de archivo siempre se imprimen):
Entonces, si desea la ID del grupo de procesos en lugar del PID, puede hacer lo siguiente:
fuente
Esto es lo que necesitas exactamente
fuente
Advertencia: solo puedo probar esto en RedHat.
Debería ser posible con
netstat
?-n para puertos numéricos
-l para puertos de escucha
-p para ver PID
Puede usar los interruptores --inet o --inet6 para indicar
netstat
que solo busque IPv4 o IPv6 respectivamente, de lo contrario, podría obtener dos resultados.Alternativamente, puede indicar
awk
que imprima solo una vezEn
awk
solo usamos la salida ' / ' fromnetstat
'de PID / program como separador.fuente