Tente isto:
pid=$(fuser 3000/tcp 2>/dev/null)
(requer psmisc
package)
Por favor, note que isto é confiável somente quando executado pelo usuário root. Outros usuários podem apenas esperar encontrar processos em execução com o mesmo usuário.
Explicação chata para acesso somente raiz com um exemplo aqui.
Qualquer que seja o método usado (fuser, ss, lsof, ...), todos eles acabam combinando a lista disponível de descritores de processo com uma lista disponível de conexões de rede (por exemplo, para tcp está disponível em /proc/net/tcp
).
Por exemplo, tentar obter o pid usando a porta 22/tcp
(com 22 = 0x0016) acabaria fazendo esse tipo de comparação:
Entrada de /proc/net/tcp
:% 0: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 141408 1 000000000a9ac1b5 100 0 0 10 0
com:% 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 descritor fd está disponível apenas para seu usuário (que é o root neste exemplo) ou root, somente esse usuário ou root pode descobrir que o pid é 358.