Déterminer le processus pid écoutant sur un certain port


101

Comme le titre l'indique, j'exécute plusieurs serveurs de jeu, et chacun d'eux a le même namemais différent PIDet le portnombre. Je voudrais faire correspondre le PIDserveur qui écoute sur un certain port, puis je voudrais tuer ce processus. J'en ai besoin pour terminer mon script bash.

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

Réponses:


125

Le -pdrapeau de netstatvous donne le PID du processus:

netstat -l -p

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

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

2
netstat: 80: unknown or uninstrumented protocolutilisé le 80port (nginx) pour tester les purpoes. Pas travaillé.
Cyclone

5
essayez netstat -nlp | grep :80plutôt
stanwise

12
netstat: option requires an argument -- p
Cyclone

2
@jasonbrittain Sur Cygwin, Windows native netstatest appelée. Il a une autre syntaxe.
stanwise

2
cette réponse est fausse: netstat: l'option nécessite un argument - p
Good Person

143

Version courte que vous pouvez passer à la commande kill:

lsof -i:80 -t

13
Cela inclut également les processus connectés sur ce port. lsof -i4TCP:80 -sTCP:LISTEN -test probablement ce que vous voulez, à la place.
Nevir

Exactement ce que je cherchais. Je voulais tuer un processus en recherchant le port sur lequel il s'exécute.
mythicalcoder

@Nevir qu'entendez-vous par "inclut également les processus connectés sur ce port"? Pouvez-vous expliquer?
kishorer747

2
kill -9 `lsof -i:80 -t`pour faciliter la copie
bmjrowe

17

netstat -p -l | grep $PORTet les lsof -i :$PORT solutions sont bonnes mais je préfère la fuser $PORT/tcpsyntaxe d'extension à POSIX (qui fonctionne pour coreutils) comme avec pipe:

pid=`fuser $PORT/tcp`

il imprime du pur pid pour que vous puissiez abandonner la sedmagie.

Une chose qui rend fusermes outils amoureux est la capacité d'envoyer directement un signal à 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

-K est également pris en charge par FreeBSD: http://www.freebsd.org/cgi/man.cgi?query=fuser


1
fuser us net and concise
Dawoodjee

10

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


1
netstat: 80: unknown or uninstrumented protocolutilisé le 80port (nginx) pour tester les purpoes. Pas travaillé.
Cyclone

3

Comme sockstat n'était pas installé nativement sur ma machine, j'ai piraté 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""

3

Je voulais par programme - en utilisant uniquement Bash - tuer le processus en écoute 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 cela va aider mon équipe.


1
Voici la fonction que j'utilise pour le faire: function kill-listener { lsof -i:$1 -t | xargs kill -9 }En utilisant votre exemple de port 8089:kill-listener 8089
Hurricane Hamilton

3

Syntaxe:

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

Exemple: pour arrêter le processus en cours d'exécution sur le port 4200, exécutez la commande suivante

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

Testé sous Ubuntu.


2

sous windows, l'option netstat pour obtenir le pid est -o et -p sélectionne un filtre de protocole, ex .: netstat -a -p tcp -o

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.