Estou usando o CentOS 7. Quero obter o PID (se houver) do processo em execução na porta 3000. Gostaria de obter esse PID com o objetivo de 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.
linux
shell-script
process
port
Dave
fonte
fonte
sudo ss -lptnH "sport = :22" | awk -F " " '{printf $6}' | sed 's/.\+pid=\([0-9]\+\).\+/\1/g'
. Você precisa de explicação?ss
sem essa opção. Deve funcionar mesmo sem:sudo ss -lptn "sport = :22" | awk -F " " '{printf $6}' | sed 's/.\+pid=\([0-9]\+\).\+/\1/g'
Respostas:
Outra solução possível:
Por exemplo:
fonte
TCP:LISTEN
.-s
chave. Eu consertei isso no padrão. Um exemplo tinha essa chave.Tente o seguinte:
(requer
psmisc
pacote)Observe que isso é confiável apenas quando executado pela raiz do usuário. 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 (fusor, ss, lsof, ...), todos acabam combinando a lista disponível de descritores de processos 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 esse descritor fd está disponível apenas para seu usuário (que é root neste exemplo) ou root, somente esse usuário ou root pode descobrir que o pid é 358.
fonte
Enquanto
lsof
's-t
é a maneira mais simples para obter o PID,lsof
também tem maneiras de selecionar outros campos usando o-F
opção:Com saída assim (observe que os descritores de PID e de arquivo são sempre impressos):
Portanto, se você quiser o ID do grupo de processos em vez do PID, poderá:
fonte
É disso que você precisa exatamente
fonte
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 --inet ou --inet6 interruptores para contar
netstat
para apenas olhar para IPv4 ou IPv6, respectivamente, caso contrário você pode obter dois resultados.Como alternativa, você pode dizer
awk
para imprimir apenas uma vezEm
awk
apenas usamos a saída ' / ' fromnetstat
'do PID / programa como um separador.fonte