Comment trouver des processus qui écoute/utilise mes ports TCP? Je suis sur Mac OS X.
Parfois, après un crash ou un bug, mon application Rails verrouille le port 3000. Je ne parviens pas à le trouver avec ps -ef ... Comment trouver la chose stupide et la tuer brutalement ...?
En faisant
Rails server
Je reçois
Adresse déjà utilisée - bind (2) (Errno :: EADDRINUSE)
Mise à jour 2014:
Pour compléter certaines des réponses ci-dessous: Après avoir exécuté les commandes kill, il peut être nécessaire de supprimer le fichier pid. rm ~/mypath/myrailsapp/tmp/pids/server.pid
Vous pouvez essayer netstat
netstat -vanp tcp | grep 3000
Pour macOS El Capitan et plus récent (ou si votre netstat ne supporte pas -p
), utilisez lsof
Sudo lsof -i tcp:3000
Pour Centos 7 use
netstat -vanp --tcp | grep 3000
Trouver:
[Sudo] lsof -i :3000
Tuer:
kill -9 <PID>
Rien ci-dessus n'a fonctionné pour moi. Toute autre personne avec mon expérience pourrait essayer ce qui suit (a travaillé pour moi):
Courir:
lsof -i :3000 (where 3000 is your current port in use)
puis vérifiez le statut du PID signalé:
ps ax | grep <PID>
enfin, "commencez avec ça":
kill -QUIT <PID>
One-Liner pour extraire le PID du processus en utilisant le port 3000 et le tuer.
lsof -ti:3000 | xargs kill
L'option -t supprime tout sauf le PID de la sortie lsof, ce qui facilite sa suppression.
Vous pouvez utiliser lsof -i:3000
.
C'est "List Open Files". Cela vous donne une liste des processus et des fichiers et ports qu’ils utilisent.
Dans votre .bash_profile
, créez un raccourci pour terminate
le processus 3000:
terminate(){
lsof -P | grep ':3000' | awk '{print $2}' | xargs kill -9
}
Ensuite, appelez $terminate
s'il est bloqué.
Pour tuer par la force un processus de ce type, utilisez la commande suivante
lsof -n -i4TCP:3000
Où 3000 est le numéro de port du processus en cours d'exécution
cela retourne l'identifiant du processus (PID) et lance
kill -9 "PID"
Remplacez le PID par le numéro obtenu après l'exécution de la première commande
lsof -P | grep ':3000' | awk '{print $2}'
Cela vous donnera juste le pid, testé sur MacOS.
Un des moyens de tuer un processus sur un port consiste à utiliser la bibliothèque python: freeport ( https://pypi.python.org/pypi/freeport/0.1.9 ). Une fois installé, simplement:
# install freeport
pip install freeport
# Once freeport is installed, use it as follows
$ freeport 3000
Port 3000 is free. Process 16130 killed successfully
Exécutez en ligne de commande sur OS-X El Capitan:
kill -kill `lsof -t -i tcp:3000`
L'option Terse de lsof ne renvoie que le PID.
Trouver la connexion ouverte
lsof -i -P | grep -i "écouter"
Tuer par ID de processus
tuer -9 'PID'
Trouvez le PID et tuez le processus.
lsof -ti:3000 | xargs kill
Moyens possibles pour y parvenir:
Haut
La commande top est le moyen classique de visualiser l’utilisation des ressources de votre système et de visualiser les processus qui utilisent le plus de ressources système. Top affiche une liste de processus, ceux qui utilisent le plus de ressources CPU en haut.
ps
La commande ps répertorie les processus en cours d'exécution. La commande suivante répertorie tous les processus en cours d'exécution sur votre système:
ps -A
Vous pouvez également diriger la sortie via grep pour rechercher un processus spécifique sans utiliser d’autres commandes. La commande suivante rechercherait le processus Firefox:
ps -A | grep firefox
Le moyen le plus courant de transmettre des signaux à un programme consiste à utiliser la commande kill.
kill PID_of_target_process
lsof
Liste de tous les fichiers ouverts et des processus qui les ont ouverts.
lsof -i -P | grep -i "listen"
kill -9 PID
ou
lsof -i tcp:3000
Trouver et tuer:
Cette ligne de commande unique est simple et fonctionne correctement.
kill -9 $(lsof -ti tcp:3000)
La solution la plus simple : Éliminez plusieurs ports avec une seule ligne de commande.
kill $(lsof -t -i:3000,3001) // 3000 and 3001 are the ports to be freed
lsof-t -i: 3000
82500
lsof -t -i: 3001
82499
lsof-t -i: 3001,3000
82499 82500
kill $ (lsof -t -i: 3001,3000)
Termine les processus 82499 et 82500 en une seule commande.
lsof-t -i: 3000
lsof -t -i: 3001
Vous pouvez l'utiliser dans les scripts package.json
"scripts": { "start": "kill $(lsof -t -i:3000,3001) && npm start" }
En utilisant sindresorhus 's fkill tool, vous pouvez faire ceci:
$ fkill :3000
Ajouter à ~/.bash_profile
:
function killTcpListen () {
kill -QUIT $(Sudo lsof -sTCP:LISTEN -i tcp:$1 -t)
}
Puis source ~/.bash_profile
et lancez
killTcpListen 8080
J'ai créé une petite fonction pour cela, ajoutez-la à votre fichier rc (.bashrc
, .zshrc
ou autre)
function kill-by-port {
if [ "$1" != "" ]
then
kill -9 $(lsof -ni tcp:"$1" | awk 'FNR==2{print $2}')
else
echo "Missing argument! Usage: kill-by-port $PORT"
fi
}
alors vous pouvez simplement taper kill-by-port 3000
pour tuer votre serveur Rails (en remplaçant 3000 par le port sur lequel il est exécuté)
à défaut, vous pouvez toujours taper kill -9 $(cat tmp/pids/server.pid)
à partir du répertoire racine de Rails
Ces deux commandes vous aideront à trouver et à tuer le processus serveur
- lsof -wni tcp: 3000
- tuer -9 pid
TL; DR:
lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill
Si vous êtes dans une situation où des clients et des serveurs utilisent le port, par exemple:
$ lsof -i tcp:3000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 2043 benjiegillam 21u IPv4 0xb1b4330c68e5ad61 0t0 TCP localhost:3000->localhost:52557 (ESTABLISHED)
node 2043 benjiegillam 22u IPv4 0xb1b4330c8d393021 0t0 TCP localhost:3000->localhost:52344 (ESTABLISHED)
node 2043 benjiegillam 25u IPv4 0xb1b4330c8eaf16c1 0t0 TCP localhost:3000 (LISTEN)
Google 99004 benjiegillam 125u IPv4 0xb1b4330c8bb05021 0t0 TCP localhost:52557->localhost:3000 (ESTABLISHED)
Google 99004 benjiegillam 216u IPv4 0xb1b4330c8e5ea6c1 0t0 TCP localhost:52344->localhost:3000 (ESTABLISHED)
alors vous ne voulez probablement pas tuer les deux.
Dans cette situation, vous pouvez utiliser -sTCP:LISTEN
pour afficher uniquement le pid des processus en cours d'écoute. En combinant cela avec le format abrégé -t
, vous pouvez automatiquement arrêter le processus:
lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill
lsof -i tcp:port_number
- listera le processus en cours d'exécution sur ce port
kill -9 PID
- va tuer le processus
dans votre cas, ce sera
lsof -i tcp:3000
à partir de votre terminal trouver le PID du processus
kill -9 PID
Voici une fonction d'aide bash pour tuer plusieurs processus par leur nom ou leur port
fkill() {
for i in $@;do export q=$i;if [[ $i == :* ]];then lsof -i$i|sed -n '1!p';
else ps aux|grep -i $i|grep -v grep;fi|awk '{print $2}'|\
xargs -I@ sh -c 'kill -9 @&&printf "X %s->%s\n" $q @';done
}
Usage:
$ fkill [process name] [process port]
Exemple:
$ fkill someapp :8080 node :3333 :9000
Vous devriez essayer ceci, cette technique est indépendante du système d'exploitation.
Dans votre application, il existe un dossier appelé tmp, à l'intérieur de celui-ci, un autre dossier appelé pids. Ce fichier contient le fichier pid du serveur . Supprimez simplement ce fichier. le port se tue automatiquement.
Je pense que c'est la solution de facilité.
Tu peux essayer ça
netstat -vanp tcp | grep 3000
Si vous voulez un moyen sans code - ouvrez le gestionnaire d'activités et forcez kill kill :)
Utilisez la commande suivante pour tuer le processus sur le port 3000 kill $(lsof -t -i:3000)