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.
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
Version courte que vous pouvez passer à la commande kill:
lsof -i:80 -t
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
netstat -nlp
devrait vous dire le PID de ce qui écoute sur quel port.
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.
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""
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.
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