Trouver (et tuer) le port de verrouillage 3000 sur Mac
Comment puis-je trouver des processus qui écoutent/utilisent 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 le trouve pas en utilisant ps-ef... Comment puis-je trouver la chose stupide et la tuer, brutalement... ?
rails server
je reçois
adresse déjà utilisée-bind(2) (Errno::EADDRINUSE)
2014 mise à jour:
pour compléter certaines des réponses ci-dessous: après avoir exécuté les commandes kill, la suppression du fichier pid pourrait être nécessaire rm ~/mypath/myrailsapp/tmp/pids/server.pid
26 réponses
-
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
), utilisezlsof
sudo lsof -i tcp:3000
-
Pour Centos 7 utiliser
netstat -vanp --tcp | grep 3000
Rechercher:
[sudo] lsof -i :3000
Tuer:
kill -9 <PID>
rien de ce qui précède n'a fonctionné pour moi. N'importe qui d'autre avec mon expérience pourrait essayer ce qui suit (travaillé pour moi):
Run:
lsof -i :3000 (where 3000 is your current port in use)
puis vérifier l'état du PID déclaré:
ps ax | grep <PID>
enfin, "retire-toi avec ça":
kill -QUIT <PID>
une monocouche pour extraire le PID du procédé à l'aide du port 3000 et le tuer.
lsof -ti:3000 | xargs kill
le drapeau-t supprime tout sauf le PID de la sortie lsof, ce qui le rend facile à tuer.
vous pouvez utiliser lsof -i:3000
.
C'est-à-dire"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 procédé 3000:
terminate(){
lsof -P | grep ':3000' | awk '{print }' | xargs kill -9
}
alors, appelez $terminate
si c'est bloqué.
pour tuer par la force un processus comme celui-ci, utilisez la commande suivante
lsof -n -i4TCP:3000
où 3000 est le numéro de port le processus est en cours à
renvoie l'identifiant du processus(PID)) et courir
kill -9 "PID"
remplacer PID par le nombre que vous obtenez après avoir exécuté la première commande
lsof -P | grep ':3000' | awk '{print }'
cela vous donnera juste le pid, testé sur MacOS.
une des façons de tuer un processus sur un port est d'utiliser la bibliothèque python: freeport ( https://pypi.python.org/pypi/freeport/0.1.9 ). Une fois installé, il suffit de:
# install freeport
pip install freeport
# Once freeport is installed, use it as follows
$ freeport 3000
Port 3000 is free. Process 16130 killed successfully
Exécuter en ligne de commande sur OS-X El Capitaine:
kill -kill `lsof -t -i tcp:3000`
L'option de lsof ne renvoie que le PID.
cette ligne de commande unique est facile à retenir:
npx kill-port 3000
pour un outil de recherche plus puissant:
npx fkill-cli
PS: ils utilisent des paquets javascript tiers
trouver la connexion ouverte
lsof - I-P | grep-i "listen"
tuer par numéro de procédé
kill -9 "PID"
moyens possibles d'y parvenir:
haut
la commande supérieure est la façon traditionnelle de voir l'utilisation des ressources de votre système et de voir les processus qui absorbent le plus de ressources du système. Top affiche une liste de processus, avec ceux qui utilisent le plus de CPU en haut.
ps
la commande ps liste les processus en cours d'exécution. La commande suivante liste tous les processus tournant sur votre système:
ps -A
vous pouvez également pipe la sortie par grep pour rechercher un processus spécifique sans utiliser d'autres commandes. La commande suivante recherchera le processus Firefox:
ps -A | grep firefox
la façon la plus courante de transmettre des signaux à un programme est avec la commande kill.
kill PID_of_target_process
lsof
Liste de toutes les les fichiers et les processus qui les a ouverts.
lsof -i -P | grep -i "listen"
kill -9 PID
ou
lsof -i tcp:3000
ajouter à ~/.bash_profile
:
function killTcpListen () {
kill -QUIT $(sudo lsof -sTCP:LISTEN -i tcp: -t)
}
puis source ~/.bash_profile
et courir
killTcpListen 8080
en utilisant sindresorhus 's fkill outil, vous pouvez le faire:
$ fkill :3000
trouver et tuer:
cette ligne de commande unique est facile et fonctionne correctement.
kill -9 $(lsof -ti tcp:3000)
pour voir les processus bloquant le port:
netstat -vanp tcp | grep 3000
Pour Tuer le processus de blocage du port:
kill $(lsof -t -i :3000)
TL; DR:
lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill
si vous êtes dans une situation où il y a à la fois des clients et des serveurs utilisant 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 ne montrer que le pid des processus qui écoutent. En combinant cela avec le format -t
vous pouvez automatiquement tuer le processus:
lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill
j'ai fait une petite fonction pour cela, l'ajouter à votre fichier rc ( .bashrc
, .zshrc
ou autre)
function kill-by-port {
if [ "" != "" ]
then
kill -9 $(lsof -ni tcp:"" | awk 'FNR==2{print }')
else
echo "Missing argument! Usage: kill-by-port $PORT"
fi
}
alors vous pouvez simplement taper kill-by-port 3000
pour tuer votre serveur rail (remplaçant 3000 pour le port sur lequel il tourne)
sinon, vous pouvez toujours taper kill -9 $(cat tmp/pids/server.pid)
à partir du répertoire racine des rails
vous devriez essayer cette technique, elle est indépendante du système D'exploitation.
à côté de votre application il y a un dossier appelé tmp, à l'intérieur il y a 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 voie facile.
Voici une fonction helper bash pour tuer plusieurs processus par nom ou 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 }'|\
xargs -I@ sh -c 'kill -9 @&&printf "X %s->%s\n" $q @';done
}
Utilisation:
$ fkill [process name] [process port]
exemple:
$ fkill someapp :8080 node :3333 :9000
vous pouvez utiliser la commande
lsof -h
utilisation de cette commande pour trouver le port est
-i i select by IPv[46] address: [46][proto][@host|addr][:svc_list|port_list]
dans votre cas, entrez
lsof -i :3000
Si rien n'des travaux ci-dessus, essayez:
lsof -n -i4TCP:3000
Étape 1: trouver le serveur qui est en cours D'exécution:
ps aux | grep puma
Étape 2: tuer ces serveurs
Kill -9 [numéro de serveur]
vous pouvez également modifier la configuration sur le port serveur (config/puma.rb) ligne 12.
$ port ENV.fetch ("PORT") { 3000 }
à
$ port ENV.fetch ("PORT") { 3001 }
ou tout port spécifique que vous jugez approprié. cela évite la nécessité d'une chasse au trésor pour les processus. vous pouvez toujours redémarrer votre ordinateur. aussi quand vous initialisez le serveur sur un autre port, il sera normalement tuer le premier serveur que vous aviez ouvertes.
vous devriez essayer ce code en utilisant le terminal:
$ killall -9 ruby