Rechercher (et tuer) le port de verrouillage du processus 3000 sur Mac

1813

Comment trouver (et tuer) les 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 ...

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, la suppression du fichier pid peut être nécessaire rm ~/mypath/myrailsapp/tmp/pids/server.pid

oma
la source
25
Une solution très soignée pour tuer un processus sur N'IMPORTE QUEL port spécifié par l'utilisateur peut être trouvée dans la réponse de @Kevin Suttle ci-dessous. Reproduit ici pour la postérité:function killport() { lsof -i TCP:$1 | grep LISTEN | awk '{print $2}' | xargs kill -9 }
user456584
4
Le port 3000 n'est pas «hautement spécifique au développement de rails» - Meteor fonctionne nativement sur 3000 également, et je suis sûr qu'il y en a d'autres.
gregorvand
Le commentaire de @ user456584 ci-dessus devrait être la réponse acceptée ^^^ Cette fonction a fonctionné pour tuer les nombreux processus que j'avais en cours d'exécution sur un port
Aneuway

Réponses:

3029
  1. Tu peux essayer netstat

    netstat -vanp tcp | grep 3000
    
  2. Pour macOS El Capitan et plus récent (ou si votre netstat ne prend pas en charge -p), utilisezlsof

    sudo lsof -i tcp:3000 
    
  3. Pour utiliser Centos 7

    netstat -vanp --tcp | grep 3000
    
ghostdog74
la source
22
Je vous remercie! Votre réponse a donné naissance à mon script "death_to 'port'". (#! / usr / bin / ruby lsof -t -i tcp:#{ARGV.first} | xargs kill)
Sv1
192
Le drapeau "laconique" à lsof produit une sortie appropriée pour la tuyauterie à une mise à mort suivante:lsof -t -i tcp:1234 | xargs kill
Manav
6
J'ai mis ceci dans mon ~/.bash_profile: findandkill() { port=$(lsof -n -i4TCP:$1 | grep LISTEN | awk '{ print $2 }') kill -9 $port } alias killport=findandkillAlors maintenant, je dois juste taper killport 8080et cela me fait gagner quelques secondes
Alfonso Pérez
3
Une autre astuce: assurez-vous d'essayer sudoavant le lsof si vous ne voyez aucune sortie
Abe Petrillo
4
Une autre astuce consiste à ajouter -Pà la lsofcommande pour que le port brut soit visible dans la sortie:lsof -P -i:3000
Jason Axelson
1878

Trouver:

sudo lsof -i :3000

Tuer:

kill -9 <PID>
Filip Spiridonov
la source
61
Parfois, lsof -i: port ne montre rien. essayez sudo lsof -i: port .
kilik52
31
Recommande d'essayer kill -15 <PID>avant de recourir à la -9sécurité.
Jamon Holmgren
7
@Jamon Holmgren pourquoi? que font les deux? et pourquoi est-ce kill <PID>pas suffisant / dangereux / incomplet?
Michael Trouw
13
@MichaelTrouw presque un an plus tard, mais voici votre réponse. :-) unix.stackexchange.com/a/8918 TL; DR kill -15donne au processus une chance de se nettoyer après lui-même.
Jamon Holmgren
9
Je pense que cette réponse devrait dire ce qui -9fait.
Joseph Fraley
207

Rien au-dessus n'a fonctionné pour moi. N'importe qui d'autre avec mon expérience pourrait essayer ce qui suit (a fonctionné pour moi):

Courir:

lsof -i :3000 (where 3000 is your current port in use)

puis vérifiez l'état du PID signalé:

ps ax | grep <PID>

enfin, "fini avec ça":

kill -QUIT <PID>
Austin
la source
18
Cela semble en fait une meilleure réponse que celle donnée beaucoup plus tard par Filip Spiridonov, qui a 277 votes positifs contre votre 9. Le vôtre était 6 mois plus tôt, et a les mêmes informations avec un peu plus d'explications. Il n'y a pas de justice ...
Floris
Essayez kill -TERM(ou juste kill) avant kill -QUIT. Tous les processus ne feront pas un arrêt ordonné sur SIGQUIT.
craig65535
160

Une ligne pour extraire le PID du processus en utilisant le port 3000 et le tuer.

lsof -ti:3000 | xargs kill

L'indicateur -t supprime tout sauf le PID de la sortie lsof, ce qui facilite sa suppression.

Zlemini
la source
13
Vous pouvez filtrer les ports "d'écoute" avec:lsof -ti:3000 -sTCP:LISTEN
Zlemini
1
Cette méthode me convient le mieux. Une doublure simple qui efface le port occupé. Merci!
Ryan Trainor
139

Solution la plus simple :

Pour un port unique:

kill $(lsof -ti:3000)  #3000 is the port to be freed

Tuez plusieurs ports avec une seule ligne de commande:

kill $(lsof -ti:3000,3001)  #here multiple ports 3000 and 3001 are the ports to be freed

lsof -ti: 3000

82500 (ID de processus / PID)

lsof -ti: 3001

82499

lsof -ti: 3001,3000

82499 82500

kill $ (lsof -ti: 3001,3000)

Termine les processus 82499 et 82500 en une seule commande.

Pour l'utiliser dans des package.jsonscripts:

"scripts": { "start": "kill $(lsof -ti:3000,3001) && npm start" }

Abhijith Sasikumar
la source
2
Cela a fonctionné pour moi Merci :)
DILEEP THOMAS
2
Heureux que cela ait aidé.
Abhijith Sasikumar
113

Cette ligne de commande unique est facile à retenir:

npx kill-port 3000

Pour un outil plus puissant avec recherche:

npx fkill-cli


PS: Ils utilisent des packages javascript tiers. npxest intégré à Node.js.

Sources: tweet | github

Bruno Lemos
la source
Pouvez-vous partager des détails sur l'installation de npx à l'aide de brew? J'ai essayé de l'installer sur mon Mac High Sierra, 10.13.3 et cela ne fonctionnera pas.
realPK
@realPK npxest fourni avec npmce qui vient avec node.js, donc ce n'est pas un paquet séparé. Mettez simplement à jour votre node.js et vos versions de npm.
Bruno Lemos
Je fais surtout de Java, je ne me suis pas encore exposé à Node. J'ai trouvé une manière différente de tuer le service en cours d'exécution sur le port. TY pour avoir répondu.
realPK
5
Le besoin de NodeJS et JavaScript, pour tuer quelque chose qui tourne sur le port 3000, probablement des rails ... me semble trop lourd. l'ajout d'une ligne simple à votre .bashrc ou .zshrc avec un alias le résoudrait sans avoir besoin d'Internet. alias kill3000 = 'lsof -ti: 3000 | xargs kill 'alors vous pouvez faire: kill3000
Khalil Gharbaoui
Meilleure solution de ce problème .. merci
King Rayhan
107

Vous pouvez utiliser lsof -i:3000 .

C'est "Liste des fichiers ouverts". Cela vous donne une liste des processus et des fichiers et ports qu'ils utilisent.

DerMike
la source
Je suis sur 10,5 lepard (Q mis à jour). Je ne sais pas si cela importe ici, mais lsof n'affiche pas les ports. lsof -h (lsof 4.78) est trop cryptique moi aussi ...
oma
1
Hmm. Je ne sais pas avec certitude sur Leopard, mais essayez (en tant que root - c'est important, je pense) lsof -i:3000.
Matt Gibson
59

Dans votre .bash_profile, créez un raccourci pour terminatele processus 3000:

terminate(){
  lsof -P | grep ':3000' | awk '{print $2}' | xargs kill -9 
}

Ensuite, appelez $terminates'il est bloqué.

alexzg
la source
12
Vous pouvez rendre cela suffisamment flexible pour n'importe quel port: github.com/kevinSuttle/dotfiles/commit/…
Kevin Suttle
Et un tel nom descriptif = p
Michael Peterson
J'ai quelque chose de similaire à cela mais je passe dans le port. J'ai nommé ma fonction KP pour kill port.
Joseph Chambers
58

Pour tuer de force un processus comme celui-ci, utilisez la commande suivante

lsof -n -i4TCP:3000 

Où 3000 est le numéro de port sur lequel le processus s'exécute

cela renvoie l'ID de processus (PID) et s'exécute

kill -9 "PID"

Remplacez PID par le numéro que vous obtenez après avoir exécuté la première commande

Par exemple, si je veux tuer le processus en cours d'exécution sur le port 8080

Tadele Ayelegn
la source
38
lsof -P | grep ':3000' | awk '{print $2}'

Cela vous donnera juste le pid, testé sur MacOS.

Kris
la source
10
sur MAC tuer tous les pids sur le port 3000: lsof -P | grep ': 3000' | awk '{print $ 2}' | xargs kill -9
mike clagg
1
plusieurs processus peuvent-ils écouter le même port?
Kris
Notre application de rails génère des travailleurs qui sont des processus enfants, et je dois l'utiliser pour tuer des travailleurs orphelins
Mike Clagg
2
cela tue également les navigateurs
Web qui se
5
En voici un:lsof -n -iTCP:3407 -sTCP:LISTEN -n -l -P | grep 'LISTEN' | awk '{print $2}' | xargs kill -9
bob
29

Exécutez en ligne de commande sur OS-X El Captain:

kill -kill `lsof -t -i tcp:3000`

L'option laconique de lsof renvoie uniquement le PID.

JE42
la source
28

L'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
YBathia
la source
7
Ce n'est pas de loin le moyen le plus simple. Les réponses votées ne nécessitent pas que vous téléchargiez et installiez quoi que ce soit.
Greg Pasquariello
4
Lorsque les conditions préalables sont remplies, c'est tellement simple et facile à retenir. Nous avons une définition différente de «plus simple» et cette réponse est parfaitement valable et appropriée. Peut-être qu'il manque juste les instructions pour installer Freeport avec pip.
Cyril Duchon-Doris
sous le capot, Freeport n'est qu'un wrapper qui appelle lsof -t -i:3000.. semble inutile.
Corey Goldberg
Cette solution n'est pas la plus simple, mais elle est conforme à 100% à ce que l'OP a demandé ... Elle est donc en acte AF valide
danielrvt
26

Pour afficher les processus bloquant le port:

netstat -vanp tcp | grep 3000

Pour tuer les processus bloquant le port:

kill $(lsof -t -i :3000)

Henri
la source
Cela ne fonctionnera pas sur une machine Mac, retourne ce qui suit: kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]Il fonctionnera cependant dans la plupart des distributions Linux
Milan Velebit
1
@MilanVelebit En fait, cela fonctionne parfaitement sur ma machine Mac (Sierra). Cela fonctionne bien si votre port 3000est occupé. Cependant, si aucun processus ne bloque le port, vous obtiendrez une kill: not enough argumentserreur.
Henry
C'est juste bizarre, j'ai deux Mac (tous deux High Sierra tho), je me souviens avoir exécuté ces commandes sur les deux (anciennes habitudes) et je sais avec certitude qu'ils ne fonctionnent pas. Je viens de l'essayer à nouveau sur ma machine, sachant que le port est occupé, même erreur. : /
Milan Velebit
Avez-vous obtenu un PID valide lors de l'exécution netstat -vanp tcp | grep 3000, pour votre port occupé?
Henry
1
Je l'ai essayé dans les deux bashet zshshell. Fonctionne bien pour moi. Je ne sais pas pourquoi cela ne fonctionne pas pour vous. Peut-être quelque chose avec High Sierra? Je n'ai aucune idée: /
Henry
24

Trouvez la connexion ouverte

lsof -i -P | grep -i "écouter"

Tuer par ID de processus

tuer -9 'PID'

Sourabh Bhagat
la source
20

Trouvez et tuez:

Cette ligne de commande unique est facile et fonctionne correctement.

kill -9 $(lsof -ti tcp:3000)
Dylan Breugne
la source
14

Moyens possibles pour y parvenir:

Haut

La commande supérieure est la manière traditionnelle d'afficher l'utilisation des ressources de votre système et de voir les processus qui utilisent le plus de ressources système. Top affiche une liste de processus, ceux utilisant le plus de 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

La façon la plus courante de transmettre des signaux à un programme est d'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 
lisse
la source
10

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, trouvez le PID du processus

kill -9 PID

Shan
la source
10

Ces deux commandes vous aideront à trouver et à tuer le processus du serveur

  1. lsof -wni tcp: 3000
  2. tuer -9 pid
Saif chaudhry
la source
Mon plaisir, Aashiah
Saif chaudhry
5

Ajouter à ~/.bash_profile:

function killTcpListen () {
  kill -QUIT $(sudo lsof -sTCP:LISTEN -i tcp:$1 -t)
}

Ensuite source ~/.bash_profileet exécutez

killTcpListen 8080

rofrol
la source
4

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 voudrez probablement pas tuer les deux.

Dans cette situation, vous pouvez utiliser -sTCP:LISTENpour afficher uniquement le pid des processus qui écoutent. En combinant cela avec le -tformat laconique, vous pouvez automatiquement tuer le processus:

lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill
Benjie
la source
4

J'ai fait une petite fonction pour cela, l'ajoute à votre fichier rc ( .bashrc, .zshrcou 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 3000pour tuer votre serveur rails (en remplaçant 3000 par le port sur lequel il fonctionne)

à défaut, vous pouvez toujours taper à kill -9 $(cat tmp/pids/server.pid)partir du répertoire racine de rails

Caleb Keene
la source
J'ai dû effectuer une barre oblique inverse \$PORTpour que le message s'affiche correctement. Sinon, ça marche très bien!
ashwood
4

Pour tuer plusieurs ports.

$ npx kill-port 3000 8080 8081

Process on port 3000 killed
Process on port 8080 killed
Process on port 8081 killed

J'espère que cette aide!

Binh Ho
la source
1

Vous devriez essayer ceci, cette technique 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 manière la plus simple.

Arun P
la source
1

Voici une fonction d'assistance 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 $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
Miguel Mota
la source
1

Vous pouvez essayer ceci

netstat -vanp tcp | grep 3000
Foram Thakral
la source
0

Si vous voulez un moyen sans code - ouvrez le gestionnaire d'activités et forcez le nœud de suppression :)

HannahCarney
la source
0

J'utilise ceci:

cat tmp/pids/server.pid | pbcopy

alors kill -9 'paste'

Mihail hidr0 Kirilov
la source
-1

Étape 1: Trouvez le serveur qui fonctionne: ps aux | grep puma Étape 2: Tuez ces serveurs Tuez -9 [numéro de serveur]

Thiện Nguyễn
la source
-1

Sous mac OS

kill -9 $(lsof -i TCP:3000 | grep LISTEN | awk '{print $2}')

Néant
la source
1
Cela a été publié en tant que commentaire il y a 5 ans, et des réponses simulaires ont été publiées plusieurs fois.
Gilles Gouaillardet