web-dev-qa-db-fra.com

Déterminez le processus d'écoute sur un port donné

Comme le titre l'indique, j'utilise plusieurs serveurs de jeux et chacun d'entre eux a le même numéro name mais différent PID et le numéro port. Je voudrais faire correspondre le PID du serveur qui écoute sur certains ports, puis je voudrais tuer ce processus. J'ai besoin de ça pour compléter mon script bash.

Est-ce que c'est possible? Parce qu'il n'a pas encore trouvé de solution sur le web.

92
Cyclone

Le drapeau -p de netstat vous donne le PID du processus:

netstat -l -p

Edit: La commande nécessaire pour obtenir les PID des utilisateurs de socket sous FreeBSD est sockstat. Comme nous l'avons constaté lors de la discussion avec @Cyclone, la ligne qui fait le travail est la suivante:

sockstat -4 -l | grep :80 | awk '{print $3}' | head -1
117
stanwise

Version courte que vous pouvez passer à la commande kill:

lsof -i:80 -t
136
Laurynas

Les solutions netstat -p -l | grep $PORT et lsof -i :$PORT sont bonnes, mais je préfère la syntaxe d'extension fuser $PORT/tcp à POSIX (qui fonctionne pour coreutils) comme avec le tube:

pid=`fuser $PORT/tcp`

il imprime un pid pur pour que vous puissiez laisser tomber sed magic.

Une des choses qui rend fuser mes amoureux des outils est la possibilité d'envoyer un signal directement à ce processus (cette syntaxe est également une extension de POSIX):

$ fuser -k $port/tcp       # with SIGKILL
$ fuser -k -15 $port/tcp   # with SIGTERM
$ fuser -k -TERM $port/tcp # with SIGTERM

Aussi, -k est supporté par FreeBSD: http://www.freebsd.org/cgi/man.cgi?query=fuser

15
gavenkoa

netstat -nlp devrait vous dire le PID de ce qui écoute sur quel port.

9
user1276209

Je voulais par programme - utiliser seulement Bash - tuer le processus en écoutant sur un port donné.

Disons que le port est 8089, alors voici comment je l'ai fait:

badPid=$(netstat --listening --program --numeric --tcp | grep "::8089" | awk '{print $7}' | awk -F/ '{print $1}' | head -1)
kill -9 $badPid

J'espère que ça aidera quelqu'un d'autre! Je sais que ça va aider mon équipe.

3
Glavin001

Comme sockstat n’était pas installé nativement sur ma machine, j’ai hacké la réponse de stanwise pour utiliser netstat à la place.

netstat -nlp | grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:2000" | awk '{print $7}' | sed -e "s/\/.*//g""
2
dafky2000

Syntaxe:

kill -9 $ (lsof -t -i: numéro de port)

Exemple: Pour tuer le processus exécuté sur le port 4200, exécutez la commande suivante

kill -9 $(lsof -t -i:4200)

Testé sous Ubuntu.

2
Debashish Sen

sur Windows, l'option netstat pour obtenir le pid est -o et -p sélectionne un filtre de protocole, par exemple: netstat -a -p tcp -o

1
Jan Wilmans