AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 443764
Accepted
Dave
Dave
Asked: 2018-05-15 12:04:53 +0800 CST2018-05-15 12:04:53 +0800 CST 2018-05-15 12:04:53 +0800 CST

Como obtenho apenas o PID, sem nenhuma informação extra, de um processo rodando na porta 3000?

  • 772

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.

linux shell-script
  • 5 5 respostas
  • 13193 Views

5 respostas

  • Voted
  1. Best Answer
    Yurij Goncharuk
    2018-05-15T12:22:36+08:002018-05-15T12:22:36+08:00

    Outra solução possível:

    lsof -t -i :<port> -s <PROTO>:LISTEN
    

    Por exemplo:

    # lsof -i :22 -s TCP:LISTEN
    COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    sshd    1392 root    3u  IPv4  19944      0t0  TCP *:ssh (LISTEN)
    sshd    1392 root    4u  IPv6  19946      0t0  TCP *:ssh (LISTEN)
    # lsof -t -i :22 -s TCP:LISTEN
    1392
    
    • 36
  2. A.B
    2018-05-15T12:11:36+08:002018-05-15T12:11:36+08:00

    Tente isto:

    pid=$(fuser 3000/tcp 2>/dev/null)
    

    (requer psmiscpacote)

    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.

    • 10
  3. muru
    2018-05-15T20:35:56+08:002018-05-15T20:35:56+08:00

    Embora lsof's -tseja a maneira mais simples de obter o PID, lsoftambém possui maneiras de selecionar outros campos usando a -Fopção:

    $ lsof -F'?'
    lsof:   ID    field description
         a    access: r = read; w = write; u = read/write
         c    command name
         d    device character code
         D    major/minor device number as 0x<hex>
         f    file descriptor (always selected)
         G    file flaGs
         i    inode number
         k    link count
         K    task ID (TID)
         l    lock: r/R = read; w/W = write; u = read/write
         L    login name
         m    marker between repeated output
         n    comment, name, Internet addresses
         o    file offset as 0t<dec> or 0x<hex>
         p    process ID (PID)
         g    process group ID (PGID)
         P    protocol name
         r    raw device number as 0x<hex>
         R    paRent PID
         s    file size
         S    stream module and device names
         t    file type
         T    TCP/TPI info
         u    user ID (UID)
         0    (zero) use NUL field terminator instead of NL
    

    Com a saída assim (observe que os descritores de arquivo e PID são sempre impressos):

    $ sudo lsof -F cg -i :22 -s TCP:LISTEN 
    p901
    g901
    csshd
    f3
    f4
    

    Portanto, se você quiser o ID do grupo de processos em vez do PID, poderá fazer:

    $ sudo lsof -F g -i :22 -s TCP:LISTEN | awk '/^g/{print substr($0, 2)}'
    901
    
    • 5
  4. Arushix
    2018-05-15T23:31:21+08:002018-05-15T23:31:21+08:00

    Isso é exatamente o que você precisa

    sudo lsof -n -i :3000  | awk '/LISTEN/{print $2}'
    12726
    12730
    12732
    
    • 2
  5. Robert Riedl
    2018-05-15T22:39:29+08:002018-05-15T22:39:29+08:00

    Advertência: só posso testar isso no RedHat.

    Deve ser possível com netstat?

     sudo netstat -npl --inet | awk '/:3000/' | awk -F "[ /]+" '{print $7}'
    

    -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 netstatpara procurar apenas IPv4 ou IPv6, respectivamente, caso contrário, você pode obter dois resultados.

    Alternativamente, você pode dizer awkpara imprimir apenas uma vez

    sudo netstat -npl | awk '/:3000/' | awk -F "[ /]+" '{print $7; exit}' 
    

    Em awknós apenas usamos o ' / ' da netstatsaída de PID/programa como um separador.

    • 1

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Dividir por delimitador e concatenar problema de string

  • astyle não altera a formatação do arquivo de origem

  • MySQL Select com função IN () com array bash

  • Passe o sistema de arquivos raiz por rótulo para o kernel do Linux

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve