Comando Oneliner para usar kill dado o número da porta tcp ao invés do PID?

8

Costumo fazer, por exemplo,

sudo netstat -lpn |grep :8088

veja a saída

tcp6       0      0 :::8088                 :::*                    LISTEN      11189/java

e depois

sudo kill -kill 11189

Eu gostaria de ter um comando mais conveniente exatamente como killatport 8088 que usa o número da porta tcp como uma variável e que eu posso fazer como um alias para um pipeline que faz o que eu quero, mas como faço para obter o PID da saída e canalizá-lo para o comando kill? Eu suponho que eu possa usar o awk para obter o PID da saída do netstat, mas como proteger e fazer uma correspondência exata da porta para que a entrada 80 não corresponda à 8080 e da mesma forma? Devo fazer um programa em C? Ou já existe um pequeno utilitário como este?

    
por Niklas Rosencrantz 20.02.2014 / 18:13

2 respostas

10
O

fusor pode fazer isso:

sudo fuser -KILL -k -n tcp 8088
    
por Florian Diesch 20.02.2014 / 18:23
2

Um comando pode ser formulado assim:

netstat -lpn | grep ":1234\b" | awk '{sub(/\/.*/, "", $NF); print $NF}' | xargs -i kill -kill {}

Explicação:

  1. netstat -ltpn

    • Isso lista as portas de escuta ( l ) no TCP ( t ) e seus programas ( p ) sem resolver números de porta para nomes ( n ).
  2. grep ":1234\b"

    • Isso procura por :1234 seguido por um limite ( \b ), indicando o final da palavra (ou número, no nosso caso). Isso garante que não captemos :12345 , por exemplo.
  3. awk '{sub(/\/.*/, "", $NF); print $NF}'

    • Isso

      • substitui sub(/regex/,"replacewith", #fieldnumber)
      • esta regex \/.*
      • sem nada ""
      • no campo $NF , que significa o último campo (ou seja, o campo que contém PID/program )
      • imprime em seguida print $NF .

      O regex \/.* corresponde a um literal / e tudo depois dele, e então estamos substituindo-o por nada, essencialmente excluindo-o, então ficamos com apenas o número PID naquele campo.

  4. xargs -i kill -kill {}

    • xargs -i é um programa que permite fazer com que a saída do comando anterior atue como a entrada para outro comando. Nosso comando é kill -kill {} onde {} indica "a saída do comando anterior no pipeline", que é nosso número PID.

Nota: todo este comando pode ser um pouco perigoso porque você pode acidentalmente matar algo que não queria. Poderia usar com um pouco mais de sanitização. Apenas certifique-se de obter o número de porta correto ao usá-lo.

Se você quiser transformar isso em uma função, adicione o seguinte ao seu ~/.bashrc :

killatport(){
    netstat -lpn | grep ":\b" | awk '{sub(/\/.*/, "", $NF); print $NF}' | xargs -i kill -kill {}
}

Salve e aplique as alterações usando source ~/.bashrc . Agora você pode usar a função assim:

killatport 8088
    
por Alaa Ali 10.11.2014 / 14:25