Estou usando o CentOS 7. Quero obter o PID (se houver) do processo em execução na porta 3000. Gostaria de obter esse PID para salvá-lo em uma variável em um script de shell. Até agora eu tenho
[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))
mas não consigo descobrir como isolar o PID sozinho sem todas essas informações extras.
Outra solução possível:
Por exemplo:
Tente isto:
(requer
psmisc
pacote)Observe que isso é confiável apenas 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 root apenas com um exemplo aqui.
Qualquer que seja o método usado (fuser, ss, lsof, ...) todos eles acabam correspondendo à lista disponível de descritores de processo a uma lista disponível de conexões de rede (por exemplo, para tcp, está disponível em
/proc/net/tcp
).Por exemplo, tentar pegar 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 por acaso é root neste exemplo) ou root, apenas esse usuário ou root pode descobrir que o pid é 358.
Embora
lsof
's-t
seja a maneira mais simples de obter o PID,lsof
também possui maneiras de selecionar outros campos usando a-F
opção:Com a saída assim (observe que os descritores de arquivo e PID são sempre impressos):
Portanto, se você quiser o ID do grupo de processos em vez do PID, poderá fazer:
Isso é exatamente o que você precisa
Advertência: só posso testar isso no RedHat.
Deve ser possível com
netstat
?-n para portas numéricas
-l para portas de escuta
-p para ver PIDs
Você pode usar as opções --inet ou --inet6 para dizer
netstat
para procurar apenas IPv4 ou IPv6, respectivamente, caso contrário, você pode obter dois resultados.Alternativamente, você pode dizer
awk
para imprimir apenas uma vezEm
awk
nós apenas usamos o ' / ' danetstat
saída de PID/programa como um separador.