Mac'te işlem kilitleme bağlantı noktası 3000'i bulma (ve öldürme)


1809

TCP portlarımı dinleyen / kullanan işlemleri nasıl bulurum (ve öldürürüm)? Mac OS X kullanıyorum.

Bazen, bir çökme veya bir hatadan sonra, raylar uygulamam 3000 numaralı bağlantı noktasını kilitliyor. Ps -ef kullanarak bulamıyorum ...

Yaparken

rails server

alırım

Adres zaten kullanılıyor - bind (2) (Errno :: EADDRINUSE)

2014 güncellemesi:

Aşağıdaki yanıtlardan bazılarını tamamlamak için: kill komutlarını uyguladıktan sonra pid dosyasını silmek gerekebilir rm ~/mypath/myrailsapp/tmp/pids/server.pid


25
Kullanıcı tarafından belirlenen herhangi bir bağlantı noktasında bir işlemi öldürmek için çok düzgün bir çözüm, @Kevin Suttle'ın aşağıdaki cevabında bulunabilir. Burada gelecek nesiller için yeniden function killport() { lsof -i TCP:$1 | grep LISTEN | awk '{print $2}' | xargs kill -9 }
üretildi

4
Port 3000 'son derece ray geliştirme özel' değildir - Meteor doğal olarak 3000 üzerinde çalışır ve eminim başkaları var.
gregorvand

@ user456584 'in yukarıdaki yorumu kabul edilen cevap olmalı ^^^ Bu fonksiyon bir limanda çalıştığım birçok işlemi öldürmek için çalıştı
Aneuway

Yanıtlar:


3025
  1. Deneyebilirsin netstat

    netstat -vanp tcp | grep 3000
    
  2. İçin MacOS El Capitan ve daha yeni (veya netstat desteklemiyorsa -p), kullanımlsof

    sudo lsof -i tcp:3000 
    
  3. For Centos 7 kullanım

    netstat -vanp --tcp | grep 3000
    

22
Teşekkür ederim! Cevabınız "death_to 'port'" senaryomu doğurdu. (#! / usr / bin / ruby lsof -t -i tcp:#{ARGV.first} | xargs kill)
Sv1

191
Lsof için "terse" bayrağı bir sonraki öldürmeye boru tesisatı için uygun çıktı üretir:lsof -t -i tcp:1234 | xargs kill
Manav

5
Bunu benim içine koydum ~/.bash_profile: findandkill() { port=$(lsof -n -i4TCP:$1 | grep LISTEN | awk '{ print $2 }') kill -9 $port } alias killport=findandkillŞimdi killport 8080
Alfonso Pérez

3
Başka bir ipucu: sudoHerhangi bir çıktı görmüyorsanız lsof'tan önce denediğinizden emin olun
Abe Petrillo

4
Başka bir ipucu, ham portun çıktıda görünmesi -Piçin lsofkomuta eklemektir :lsof -P -i:3000
Jason Axelson

1874

bul:

sudo lsof -i :3000

Öldürmek:

kill -9 <PID>

61
Bazen lsof -i: port hiçbir şey göstermez. sudo lsof -i: port'u deneyin .
kilik52

31
Güvenlik için kill -15 <PID>başvurmadan önce denemenizi öneririz -9.
Jamon Holmgren

7
@Jamon Holmgren neden? ikisi de ne yapar? ve neden kill <PID>yeterli / tehlikeli / eksik değil?
Michael Trouw

13
@MichaelTrouw neredeyse bir yıl sonra, ama işte cevabınız. :-) unix.stackexchange.com/a/8918 TL; DR kill -15, işleme kendi başına temizleme şansı veriyor.
Jamon Holmgren

9
Bence bu cevap ne -9diyor.
Joseph Fraley

206

Yukarıdaki hiçbir şey benim için işe yaramadı. Deneyimlerime sahip olan herkes aşağıdakileri deneyebilir (benim için çalıştı):

Çalıştırmak:

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

ardından bildirilen PID'nin durumunu kontrol edin:

ps ax | grep <PID>

son olarak, "onunla birlikte olun":

kill -QUIT <PID>

18
Bu aslında 9'a karşı 277 upvotes olan Filip Spiridonov'un çok daha sonra vermesinden daha iyi bir yanıt gibi görünüyor. Adalet yok ...
Floris

Daha önce deneyin kill -TERM(veya sadece kill) kill -QUIT. Her işlem SIGQUIT üzerinde düzenli bir kapatma yapmaz.
craig65535

159

3000 numaralı bağlantı noktasını kullanarak işlemin PID'sini çıkarmak ve öldürmek için bir astar.

lsof -ti:3000 | xargs kill

-T bayrağı, Pso dışında her şeyi lsof çıktısından kaldırır ve onu öldürmeyi kolaylaştırır.


13
"Dinleme" bağlantı noktalarını lsof -ti:3000 -sTCP:LISTEN
şunlarla filtreleyebilirsiniz

1
Bu yöntem benim için en uygunudur. Meşgul bağlantı noktasını temizleyen basit bir astar. Teşekkürler!
Ryan Trainor

138

En kolay çözüm :

Tek bağlantı noktası için:

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

Tek satır komutuyla birden fazla bağlantı noktasını öldürün:

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

lsof -ti: 3000

82500 (İşlem Kimliği / PID)

lsof -ti: 3001

82499

lsof -ti: 3001,3000

82499 82500

kill $ (lsof -ti: 3001,3000)

Tek bir komutla hem 82499 hem de 82500 işlemlerini sonlandırır.

Bunu package.jsonkomut dosyalarında kullanmak için:

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


2
Bu benim için çalıştı Teşekkürler :)
DILEEP THOMAS

2
Yardımcı oldu sevindim.
Abhijith Sasikumar

113

Bu tek komut satırını hatırlamak kolaydır:

npx kill-port 3000

Arama özellikli daha güçlü bir araç için:

npx fkill-cli


Not: Üçüncü taraf javascript paketleri kullanıyorlar. npxNode.js ile yerleşik olarak gelir.

Kaynaklar: tweet | github


Demleme kullanarak npx kurulumuyla ilgili ayrıntıları paylaşabilir misiniz? Mac High Sierra, 10.13.3'e yüklemeyi denedim ve işe yaramayacak.
realPK

@realPK npxile birlikte npmgelir node.js, bu yüzden ayrı bir paket değildir. Sadece node.js dosyanızı ve npm sürümlerinizi yükseltin.
Bruno Lemos

Çoğunlukla Java yapıyorum, henüz Düğüme maruz kalmadım. Bağlantı noktasında çalışan öldürme hizmetinin farklı bir yolunu buldum. Yanıt için TY.
realPK

5
Bağlantı noktası 3000'de çalışan bir şeyi öldürmek için NodeJS ve JavaScript'e olan ihtiyaç muhtemelen raylar ... bana çok fazla yük gibi geliyor. .bashrc veya .zshrc'ye bir takma adla basit bir satır eklemek, internete ihtiyaç duymadan çözecektir. takma ad kill3000 = 'lsof -ti: 3000 | xargs kill 'sonra şunları yapabilirsiniz: kill3000
Khalil Gharbaoui

Bu sorunun en iyi çözümü .. teşekkürler
King Rayhan

107

Kullanabilirsiniz lsof -i:3000.

Bu "Açık Dosyaları Listele" dir. Bu işlemlerin ve kullandıkları dosya ve bağlantı noktalarının bir listesini verir.


10.5 lepard'dayım (güncellenmiş Q). Burada önemli olup olmadığını bilmiyorum, ama lsof portları göstermiyor. lsof -h (lsof 4.78) ben de çok şifreli ...
oma

1
Hmm. Leopard'da kesin olarak bilmiyorum, ama deneyin ( kök olarak - bu önemli, sanırım) lsof -i:3000.
Matt Gibson

59

Cihazınızda 3000 işlemi .bash_profileiçin bir kısayol oluşturun terminate:

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

Ardından, $terminateengellenmişse arayın .


12
Bunu herhangi bir liman için yeterince esnek yapabilirsiniz: github.com/kevinSuttle/dotfiles/commit/…
Kevin Suttle

Ve böyle açıklayıcı bir isim = p
Michael Peterson

Buna benzer bir şeyim var ama limanda geçiyorum. Kill port için KP fonksiyonumu seçtim.
Joseph Chambers

58

Böyle bir işlemi zorla öldürmek için aşağıdaki komutu kullanın

lsof -n -i4TCP:3000 

3000'in port numarası olduğu durumlarda işlem

bu işlem kimliğini (PID) döndürür ve çalıştırır.

kill -9 "PID"

İlk komutu çalıştırdıktan sonra PID'yi aldığınız numarayla değiştirin

Örnek için, 8080 bağlantı noktasında çalışan işlemi öldürmek istersem


38
lsof -P | grep ':3000' | awk '{print $2}'

Bu size MacOS'ta test edilen pid'i verecektir.


10
MAC üzerinde bağlantı noktası 3000 tüm pids öldürmek: lsof -P | grep ': 3000' | awk '{2 $ yazdır}' | xargs kill -9
mike clagg

1
birden fazla işlem aynı bağlantı noktasını dinleyebilir mi?
Kris

Bizim raylar uygulaması çocuk süreçleri olan işçi
doğurur

2
bu da bağlantı noktasına bağlanan webbrowsers öldürür
fjsj

5
İşte bir tane:lsof -n -iTCP:3407 -sTCP:LISTEN -n -l -P | grep 'LISTEN' | awk '{print $2}' | xargs kill -9
bob

29

OS-X El Captain'da komut satırında yürütün:

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

Lsof'un Terse seçeneği yalnızca PID değerini döndürür.


28

Bir bağlantı noktasında bir işlemi öldürmenin yollarından biri python kitaplığını kullanmaktır: freeport ( https://pypi.python.org/pypi/freeport/0.1.9 ). Kurulduktan sonra, basitçe:

# install freeport
pip install freeport

# Once freeport is installed, use it as follows
$ freeport 3000
Port 3000 is free. Process 16130 killed successfully

7
Bu, şimdiye kadar, en basit yol değil. Yükseltilmiş yanıtlar, herhangi bir şey indirip yüklemenizi gerektirmez.
Greg Pasquariello

4
Önkoşullar karşılandığında, bu çok basit ve hatırlanması kolaydır. Farklı bir "en basit" tanımımız var ve bu cevap tamamen geçerli ve uygun. Belki de pip ile freeport kurmak için talimatlar eksik.
Cyril Duchon-Doris

kaputun altında, freeport sadece çağıran bir sargıdır lsof -t -i:3000.. gereksiz görünüyor.
Corey Goldberg

Bu çözüm en kolay değil, ama OP'nin istediği ile% 100 uyumlu ... Bu yüzden geçerli bir AF belgesi var
danielrvt

26

Bağlantı noktasını engelleyen işlemleri görüntülemek için:

netstat -vanp tcp | grep 3000

Limanı engelleyen işlemleri öldürmek için:

kill $(lsof -t -i :3000)


Bu bir Mac makinesinde çalışmaz, aşağıdakileri döndürür: kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]Ancak, çoğu linux dağıtımında çalışacaktır
Milan Velebit

1
@ MilanVelebit Aslında Mac makinemde (Sierra) mükemmel çalışıyor. Limanınız meşgulse iyi çalışır 3000. Ancak bağlantı noktasını hiçbir işlem engellemiyorsa, kill: not enough argumentshata mesajı alırsınız .
Henry

Bu çok garip, iki Mac'im var (her ikisi de High Sierra tho), bu komutları her ikisinde de çalıştırdığımı hatırlıyorum (eski alışkanlıklar) ve kesinlikle çalışmadıklarını biliyorum. Bağlantı noktasının dolu olduğunu bilerek, makinemde tekrar denedim, aynı hata. : /
Milan Velebit

Çalışan netstat -vanp tcp | grep 3000limanınız için geçerli bir PID aldınız mı ?
Henry

1
Ben hem denedim bashve zshkabuk. Benim için iyi çalışıyor. Neden senin için işe yaramadığından emin değilim. High Sierra ile ilgili bir şey olabilir mi? Hiçbir fikrim yok: /
Henry

24

Açık bağlantıyı bulun

lsof -i -P | grep -i "dinle"

İşlem kimliğiyle öldür

öldür -9 'PID'


20

Bul ve öldür:

Bu tek komut satırı kolaydır ve düzgün çalışır.

kill -9 $(lsof -ti tcp:3000)

14

Bunu başarmanın olası yolları:

üst

Üst komut, sisteminizin kaynak kullanımını görüntülemenin ve en çok sistem kaynağını kaplayan işlemleri görmenin geleneksel yoludur. En üstte en fazla CPU kullanan işlemlerin olduğu bir işlem listesi görüntüler.

ps

Ps komutu çalışan işlemleri listeler. Aşağıdaki komut sisteminizde çalışan tüm işlemleri listeler:

ps -A

Ayrıca, herhangi bir komut kullanmadan belirli bir işlemi aramak için çıktıyı grep aracılığıyla borulandırabilirsiniz. Aşağıdaki komut Firefox işlemini arar:

ps -A | grep firefox

Sinyalleri bir programa aktarmanın en yaygın yolu kill komutudur.

kill PID_of_target_process

lsof

Tüm açık dosyaların ve bunları açan işlemlerin listesi.

lsof -i -P | grep -i "listen"
kill -9 PID

veya

 lsof -i tcp:3000 

10

lsof -i tcp:port_number - o bağlantı noktasında çalışan işlemi listeleyecektir

kill -9 PID - süreci öldürecek

senin durumunda, olacak

lsof -i tcp:3000 terminalinizden işlemin PID'sini bulun

kill -9 PID


10

Bu iki komut, sunucu işlemini bulmanıza ve öldürmenize yardımcı olacaktır

  1. lsof -wni tcp: 3000
  2. öldürmek -9 pid

Benim için zevk, Aashiah
Saif chaudhry

5

Şuraya ekle ~/.bash_profile:

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

Sonra source ~/.bash_profileve koş

killTcpListen 8080



4

TL; DR:

lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill

Bağlantı noktasını kullanan istemcilerin ve sunucuların olduğu bir durumdaysanız, örneğin:

$ 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)

muhtemelen ikisini de öldürmek istemezsiniz.

Bu durumda -sTCP:LISTENyalnızca dinleyen işlemlerin pid'ini göstermek için kullanabilirsiniz . Bunu -tkısa format ile birleştirerek işlemi otomatik olarak öldürebilirsiniz:

lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill

4

Ben senin rc dosyasına ekleyebilir Bunun için biraz işlevini yapılan ( .bashrc, .zshrcya da her neyse)

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
}

o zaman kill-by-port 3000rails sunucunuzu öldürmek için yazabilirsiniz (üzerinde çalıştığı herhangi bir port için 3000 yerine)

bunu başaramazsanız, her zaman kill -9 $(cat tmp/pids/server.pid)rails kök dizininden yazabilirsiniz


\$PORTMesajın doğru görüntülenmesi için ters eğik çizgi yapmam gerekiyordu . Aksi takdirde, harika çalışıyor!
ashwood

4

Çoklu portları öldürmek için.

$ npx kill-port 3000 8080 8081

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

Umarım bu yardım!


1

Bunu denemelisiniz, Bu teknik OS Independent.

Uygulamanızın yanında tmp adında bir klasör var, içinde pids adında başka bir klasör var. Bu dosya sunucu pid dosyasını içerir. Sadece bu dosyayı silin. port kendini otomatik olarak öldürür.

Bence bu kolay bir yol.


1

İşte ad veya bağlantı noktasına göre birden çok işlemi öldürmek için yardımcı bash işlevi

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
}

Kullanımı:

$ fkill [process name] [process port]

Misal:

$ fkill someapp :8080 node :3333 :9000


0

Kod ücretsiz bir şekilde istiyorsanız - açık aktivite yöneticisi ve öldürme düğümünü zorla :)



-1

1. Adım: Çalışan sunucuyu bulun: ps aux | grep puma 2. Adım: Bu sunucuyu öldürün -9'u [sunucu numarası] öldürün


-1

Mac OS'de

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


1
Bu, 5 yıl önce bir yorum olarak gönderildi ve simüler cevaplar birkaç kez gönderildi.
Gilles Gouaillardet
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.