Obtendo o PID da lista lsof

1

Eu tenho um aplicativo nativo de reação e quero escrever um script para a versão de teste inicial. Preciso derrubar a porta: 8081 se estiver viva. O comando:

lsof -i :8081
kill -9 <PID>

O lsof voltar este resultado:

    COMMAND     PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
chrome     2423 loow  127u  IPv4 13749099      0t0  TCP localhost.localdomain:36650->localhost.localdomain:tproxy (ESTABLISHED)
qemu-syst 15091 loow   64u  IPv4 13795587      0t0  TCP localhost.localdomain:43518->localhost.localdomain:tproxy (ESTABLISHED)
qemu-syst 15091 loow   66u  IPv4 13795588      0t0  TCP localhost.localdomain:43520->localhost.localdomain:tproxy (ESTABLISHED)
qemu-syst 15091 loow   89u  IPv4 13777485      0t0  TCP localhost.localdomain:40500->localhost.localdomain:tproxy (ESTABLISHED)
node      16210 loow   16u  IPv6 13747716      0t0  TCP *:tproxy (LISTEN)
node      16210 loow   18u  IPv6 13751322      0t0  TCP localhost.localdomain:tproxy->localhost.localdomain:36650 (ESTABLISHED)
node      16210 loow   19u  IPv6 13798473      0t0  TCP localhost.localdomain:tproxy->localhost.localdomain:43518 (ESTABLISHED)
node      16210 loow   21u  IPv6 13798475      0t0  TCP localhost.localdomain:tproxy->localhost.localdomain:43520 (ESTABLISHED)
node      16210 loow   27u  IPv6 13777958      0t0  TCP localhost.localdomain:tproxy->localhost.localdomain:40500 (ESTABLISHED)

O que exatamente eu preciso é o pid do serviço de nó, neste caso, 16210. Como posso obtê-lo do lsof?

Eu tentei lsof -ti :8081 , que retorna apenas os pids, mas retorna tudo isso. Eu tentei estendê-lo com grep: lsof -ti :8081 | grep node , que não retorna nada.

Então eu só preciso do id do processo, para levá-lo para o kill -9 $PID .

    
por PumpkinSeed 28.04.2017 / 10:59

2 respostas

3

Eu acho que toda a sua abordagem é falha, você provavelmente deve executar o seu serviço no systemd (ou envolvê-lo em um script start-stop estilo systemV que registra o PID), o que simplifica bastante a parada do serviço correto.

Como alternativa, a ferramenta convencional para encontrar um processo específico é pgrep e o pkill associado permite para matá-los facilmente:

pkill -9 -u node  react-native-app-name
Dito isto, para responder à sua pergunta literal: em geral, os processos de serviço corretos para parar são aqueles que fornecem o ouvinte naquela porta TCP, ou seja, restringem sua saída lsof com -sTCP:LISTEN

lsof -i :8081 -sTCP:LISTEN |awk 'NR > 1 {print $2}'  |xargs kill -15
    
por 28.04.2017 / 11:39
1
lsof -i :8081 | awk '{system("kill -9 " $2)}'

deve fazer o que quiser. Tenha cuidado com um sistema de carga muito alto, com muitos processos de curta duração. Pode ser que você mate o processo errado porque às vezes a saída de lsof provou não ser muito confiável ao longo do tempo.

    
por 28.04.2017 / 11:12