web-dev-qa-db-fra.com

Oneliner commande d'utiliser kill donné le numéro de port TCP au lieu de PID?

Je fais souvent par exemple.

Sudo netstat -lpn |grep :8088

voir la sortie

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

puis

Sudo kill -kill 11189

J'aimerais avoir une commande plus pratique exactement comme killatport 8088 qui utilise le numéro de port tcp comme variable et que je peux créer comme alias d'un pipeline qui fait ce que je veux, mais comment puis-je obtenir le PID à partir de la sortie et dirigez-le vers la commande kill? Je suppose que je pourrais peut-être utiliser awk pour obtenir le PID à partir de la sortie de netstat, mais comment puis-je sauvegarder et faire correspondre exactement le port afin que l'entrée 80 ne corresponde pas à 8080 et de la même manière? Devrais-je en faire un programme C à la place? Ou existe-t-il déjà un petit utilitaire comme celui-ci?

8
Niklas Rosencrantz

fuser peut le faire:

Sudo fuser -KILL -k -n tcp 8088
10
Florian Diesch

Une commande peut être formulée comme ceci:

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

Explication:

  1. netstat -ltpn

    • Ceci répertorie les ports d'écoute (l) sur TCP (t) et leurs programmes (p) sans résoudre les numéros de port en noms (n) .
  2. grep ":1234\b"

    • Ceci recherche :1234 suivi d'une frontière (\b), indiquant la fin du mot (ou un nombre, dans notre cas). Cela garantit que nous n'attrapons pas :12345 par exemple.
  3. awk '{sub(/\/.*/, "", $NF); print $NF}'

    • Cette

      • substitue sub(/regex/,"replacewith", #fieldnumber)
      • cette regex \/.*
      • avec rien ""
      • dans le champ $NF, ce qui signifie le dernier champ (c'est-à-dire le champ contenant PID/program)
      • puis l’imprime print $NF.

      La regex \/.* correspond à un littéral / et à tout ce qui suit, puis nous le remplaçons par rien, essentiellement en le supprimant. Il ne reste donc que le numéro PID dans ce champ.

  4. xargs -i kill -kill {}

    • xargs -i est un programme qui vous permet de transformer la sortie de la commande précédente en entrée d'une autre commande. Notre commande est kill -kill {}{} indique "le résultat de la commande précédente dans le pipeline", qui correspond à notre numéro PID.

Note: toute cette commande peut être un peu dangereuse car vous pourriez tuer accidentellement quelque chose que vous ne vouliez pas. Il pourrait être utile avec un peu plus de désinfection. Assurez-vous simplement d’obtenir le bon numéro de port lors de son utilisation.

Si vous souhaitez en faire une fonction, vous pouvez ajouter ce qui suit à votre ~/.bashrc:

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

Enregistrez et appliquez les modifications à l'aide de source ~/.bashrc. Maintenant, vous pouvez utiliser la fonction comme ceci:

killatport 8088
2
Alaa Ali