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.

Cyclone
la source

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
stanwise
la source
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
Laurynas
la source
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

gavenkoa
la source
1
fuser us net and concise
Dawoodjee
10

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


la source
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""
dafky2000
la source
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.

Glavin001
la source
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.

Debashish Sen
la source
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

Jan Wilmans
la source