Temukan (dan bunuh) proses mengunci port 3000 di Mac

1813

Bagaimana cara menemukan (dan membunuh) proses yang mendengarkan / menggunakan port tcp saya? Saya menggunakan mac os x.

Kadang-kadang, setelah crash atau beberapa bug, aplikasi rel saya mengunci port 3000. Saya tidak dapat menemukannya menggunakan ...

Ketika melakukan

rails server

saya mendapat

Alamat sudah digunakan - bind (2) (Errno :: EADDRINUSE)

Pembaruan 2014:

Untuk melengkapi beberapa jawaban di bawah ini: Setelah menjalankan perintah kill, menghapus file pid mungkin diperlukan rm ~/mypath/myrailsapp/tmp/pids/server.pid

oma
sumber
25
Solusi yang sangat rapi untuk mematikan proses pada port APAPUN yang ditentukan pengguna dapat ditemukan di jawaban @Kevin Suttle di bawah ini. function killport() { lsof -i TCP:$1 | grep LISTEN | awk '{print $2}' | xargs kill -9 }
Diproduksi ulang di
4
Port 3000 bukan 'sangat khusus untuk pengembangan rel' - Meteor secara native berjalan di 3000 juga, dan saya yakin ada yang lain.
gregorvand
@ user456584 komentar di atas harus menjadi jawaban yang diterima ^^^ Fungsi itu bekerja untuk membunuh banyak proses yang saya jalankan di pelabuhan
Aneuway

Jawaban:

3029
  1. Anda dapat mencoba netstat

    netstat -vanp tcp | grep 3000
    
  2. Untuk macOS El Capitan dan yang lebih baru (atau jika netstat Anda tidak mendukung -p), gunakanlsof

    sudo lsof -i tcp:3000 
    
  3. Untuk penggunaan Centos 7

    netstat -vanp --tcp | grep 3000
    
ghostdog74
sumber
22
Terima kasih! Jawaban Anda melahirkan skrip "death_to 'port'" saya. (#! / usr / bin / ruby lsof -t -i tcp:#{ARGV.first} | xargs kill)
Sv1
192
Bendera "singkat" ke lsof menghasilkan keluaran yang cocok untuk pemipaan ke pembunuhan berikutnya:lsof -t -i tcp:1234 | xargs kill
Manav
6
Saya telah memasukkan ini ke dalam saya ~/.bash_profile: findandkill() { port=$(lsof -n -i4TCP:$1 | grep LISTEN | awk '{ print $2 }') kill -9 $port } alias killport=findandkillJadi sekarang saya hanya perlu mengetik killport 8080dan menghemat beberapa detik
Alfonso Pérez
3
Kiat lain: Pastikan untuk mencoba sudosebelum lsof jika Anda tidak melihat hasil apa pun
Abe Petrillo
4
Tip lain adalah untuk menambahkan -Pke lsofperintah sehingga port mentah terlihat dalam output:lsof -P -i:3000
Jason Axelson
1876

Temukan:

sudo lsof -i :3000

Membunuh:

kill -9 <PID>
Filip Spiridonov
sumber
61
Terkadang lsof -i: port tidak menunjukkan apa-apa. coba sudo lsof -i: port .
kilik52
31
Sarankan mencoba kill -15 <PID>sebelum menggunakan -9untuk keselamatan.
Jamon Holmgren
7
@Jamon Holmgren kenapa? apa yang keduanya lakukan? dan mengapa itu kill <PID>tidak cukup / berbahaya / tidak lengkap?
Michael Trouw
13
@MichaelTrouw hampir setahun kemudian, tapi inilah jawaban Anda. :-) unix.stackexchange.com/a/8918 TL; DR kill -15memberikan proses kesempatan untuk membersihkan sendiri.
Jamon Holmgren
9
Saya pikir jawaban ini harus mengatakan apa -9artinya.
Joseph Fraley
207

Tidak ada yang berhasil bagi saya di atas. Orang lain dengan pengalaman saya dapat mencoba yang berikut (bekerja untuk saya):

Lari:

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

kemudian periksa status PID yang dilaporkan:

ps ax | grep <PID>

akhirnya, "pergilah dengan itu":

kill -QUIT <PID>
Austin
sumber
18
Ini sebenarnya tampaknya jawaban yang lebih baik daripada yang diberikan jauh-jauh hari oleh Filip Spiridonov, yang memiliki 277 upvotes terhadap 9. Anda Anda 6 bulan sebelumnya, dan memiliki informasi yang sama dengan sedikit penjelasan lebih lanjut. Tidak ada keadilan ...
Floris
Coba kill -TERM(atau hanya kill) sebelumnya kill -QUIT. Tidak setiap proses akan melakukan penonaktifan tertib pada SIGQUIT.
craig65535
160

Satu baris untuk mengekstrak PID dari proses menggunakan port 3000 dan membunuhnya.

lsof -ti:3000 | xargs kill

Bendera -t menghapus semuanya kecuali PID dari output lsof, membuatnya mudah untuk membunuhnya.

Zlemini
sumber
13
Anda dapat memfilter port "mendengarkan" dengan:lsof -ti:3000 -sTCP:LISTEN
Zlemini
1
Metode ini paling cocok untuk saya. Satu liner sederhana yang membersihkan port yang sibuk. Terima kasih!
Ryan Trainor
139

Solusi termudah :

Untuk port tunggal:

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

Bunuh banyak port dengan perintah baris tunggal:

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

lsof -ti: 3000

82500 (ID Proses / PID)

lsof -ti: 3001

82499

lsof -ti: 3001,3000

82499 82500

kill $ (lsof -ti: 3001,3000)

Menghentikan proses 82499 dan 82500 dalam satu perintah.

Untuk menggunakan ini dalam package.jsonskrip:

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

Abhijith Sasikumar
sumber
2
Ini bekerja untuk saya Terima kasih :)
DILEEP THOMAS
2
Senang itu membantu.
Abhijith Sasikumar
113

Baris perintah tunggal ini mudah diingat:

npx kill-port 3000

Untuk alat yang lebih kuat dengan pencarian:

npx fkill-cli


PS: Mereka menggunakan paket javascript pihak ketiga. npxhadir dengan Node.js.

Sumber: tweet | github

Bruno Lemos
sumber
Bisakah Anda berbagi detail tentang cara menginstal npx menggunakan minuman? Saya mencoba menginstalnya di Mac High Sierra saya, 10.13.3 dan tidak akan berfungsi.
realPK
@ realPK npxhadir dengan paket npmyang disertakan node.js, jadi ini bukan paket yang terpisah. Tingkatkan versi node.js dan npm Anda.
Bruno Lemos
Saya kebanyakan menggunakan Java, belum membuka diri saya ke Node. Saya menemukan cara yang berbeda untuk membunuh layanan yang berjalan di pelabuhan. TY untuk merespons.
realPK
5
Kebutuhan untuk NodeJS dan JavaScript, untuk membunuh sesuatu yang berjalan pada port 3000 mungkin rel ... sepertinya terlalu banyak overhead untuk saya. menambahkan garis sederhana ke .bashrc atau .zshrc Anda dengan alias akan menyelesaikannya tanpa perlu internet. alias kill3000 = 'lsof -ti: 3000 | xargs kill 'maka Anda bisa melakukannya: kill3000
Khalil Gharbaoui
Solusi terbaik untuk masalah ini .. terima kasih
Raja Rayhan
107

Anda bisa menggunakannya lsof -i:3000.

Itu adalah "Daftar Buka File". Ini memberi Anda daftar proses dan file serta port mana yang mereka gunakan.

DerMike
sumber
Saya menggunakan 10,5 lepard (diperbarui Q). Saya tidak tahu apakah itu penting di sini, tetapi lsof tidak menampilkan port. lsof -h (lsof 4,78) terlalu samar juga untukku ...
oma
1
Hmm. Tidak tahu pasti tentang Leopard, tetapi coba ( sebagai root - itu penting, saya pikir) lsof -i:3000.
Matt Gibson
59

Di Anda .bash_profile, buat pintasan untuk terminateproses 3000:

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

Kemudian, hubungi $terminatejika diblokir.

alexzg
sumber
12
Anda dapat membuat ini cukup fleksibel untuk port apa pun: github.com/kevinSuttle/dotfiles/commit/…
Kevin Suttle
Dan nama deskriptif seperti itu = p
Michael Peterson
Saya memiliki sesuatu yang mirip dengan ini tetapi saya lulus di pelabuhan. Saya menamai fungsi saya KP untuk port kill.
Joseph Chambers
58

Untuk mematikan proses seperti itu, gunakan perintah berikut

lsof -n -i4TCP:3000 

Di mana 3000 adalah nomor port proses sedang berjalan

ini mengembalikan id proses (PID) dan dijalankan

kill -9 "PID"

Ganti PID dengan nomor yang Anda dapatkan setelah menjalankan perintah pertama

Sebagai contoh, jika saya ingin membunuh proses yang berjalan pada port 8080

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

Ini akan memberi Anda hanya pid, diuji pada MacOS.

Keris
sumber
10
pada MAC bunuh semua pids pada port 3000: lsof -P | grep ': 3000' | awk '{print $ 2}' | xargs kill -9
mike clagg
1
dapatkah lebih dari satu proses mendengarkan port yang sama?
Kris
Aplikasi rel kami memunculkan pekerja yang merupakan proses anak-anak, dan saya harus menggunakan ini untuk membunuh pekerja yatim
mike clagg
2
ini juga membunuh penjelajah web yang terhubung ke port
fjsj
5
Ini yang berhasil:lsof -n -iTCP:3407 -sTCP:LISTEN -n -l -P | grep 'LISTEN' | awk '{print $2}' | xargs kill -9
bob
29

Jalankan perintah di OS-X El Captain:

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

Opsi terse dari lsof hanya mengembalikan PID.

JE42
sumber
28

Salah satu cara untuk membunuh proses pada port adalah dengan menggunakan pustaka python: freeport ( https://pypi.python.org/pypi/freeport/0.1.9 ). Setelah diinstal, cukup:

# install freeport
pip install freeport

# Once freeport is installed, use it as follows
$ freeport 3000
Port 3000 is free. Process 16130 killed successfully
YBathia
sumber
7
Sejauh ini, BUKAN cara paling sederhana. Balasan yang di-upgrade tidak mengharuskan Anda mengunduh dan menginstal apa pun.
Greg Pasquariello
4
Ketika prasyarat terpenuhi ini sangat sederhana dan mudah diingat. Kami memiliki definisi berbeda dari "paling sederhana" dan jawaban ini sangat valid dan tepat. Mungkin itu hanya melewatkan instruksi untuk menginstal freeport dengan pip.
Cyril Duchon-Doris
di bawah tenda, freeport hanyalah pembungkus yang memanggil lsof -t -i:3000.. sepertinya tidak perlu.
Corey Goldberg
Solusi ini bukan yang termudah, tetapi memenuhi 100% dengan apa yang diminta OP ... Jadi, dalam akta ini valid AF
danielrvt
26

Untuk melihat proses memblokir port:

netstat -vanp tcp | grep 3000

Untuk Membunuh proses yang memblokir port:

kill $(lsof -t -i :3000)

Henry
sumber
Ini tidak akan bekerja pada mesin Mac, mengembalikan yang berikut: kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]Akan, bagaimanapun, bekerja di sebagian besar distro linux
Milan Velebit
1
@MilanVelebit Sebenarnya berfungsi dengan baik di mesin Mac saya (Sierra). Ini berfungsi dengan baik jika port Anda 3000ditempati. Namun jika tidak ada proses yang memblokir port, maka Anda akan mendapatkan kill: not enough argumentskesalahan.
Henry
Itu aneh, saya punya dua Mac (keduanya High Sierra tho), saya ingat menjalankan perintah itu pada keduanya (kebiasaan lama) dan saya tahu pasti bahwa mereka tidak berjalan. Saya baru saja mencobanya lagi di mesin saya, mengetahui bahwa port ditempati, kesalahan yang sama. : /
Milan Velebit
Apakah Anda mendapatkan PID yang valid saat menjalankan netstat -vanp tcp | grep 3000, untuk port Anda yang sibuk?
Henry
1
Saya mencoba keduanya bashdan zshshell. Bekerja dengan baik untuk saya. Tidak yakin mengapa itu tidak berhasil untuk Anda. Mungkin ada sesuatu dengan High Sierra? Saya tidak tahu: /
Henry
24

Temukan koneksi yang terbuka

lsof -i -P | grep -i "dengarkan"

Bunuh dengan ID proses

bunuh -9 'PID'

Sourabh Bhagat
sumber
20

Temukan dan bunuh:

Baris perintah tunggal ini mudah dan berfungsi dengan benar.

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

Kemungkinan cara untuk mencapai ini:

teratas

Perintah teratas adalah cara tradisional untuk melihat penggunaan sumber daya sistem Anda dan melihat proses yang menggunakan sebagian besar sumber daya sistem. Top menampilkan daftar proses, dengan yang menggunakan CPU terbanyak di atas.

ps

Perintah ps berisi daftar proses yang berjalan. Perintah berikut mencantumkan semua proses yang berjalan di sistem Anda:

ps -A

Anda juga dapat menyalurkan output melalui grep untuk mencari proses tertentu tanpa menggunakan perintah lain. Perintah berikut akan mencari proses Firefox:

ps -A | grep firefox

Cara paling umum menyampaikan sinyal ke suatu program adalah dengan perintah kill.

kill PID_of_target_process

lsof

Daftar semua file yang terbuka dan proses yang membukanya.

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

atau

 lsof -i tcp:3000 
halus
sumber
10

lsof -i tcp:port_number - akan mendaftar proses yang berjalan pada port itu

kill -9 PID - akan membunuh prosesnya

dalam kasus Anda, itu akan terjadi

lsof -i tcp:3000 dari terminal Anda temukan PID proses

kill -9 PID

Shan
sumber
10

Dua perintah ini akan membantu Anda menemukan dan membunuh proses server

  1. lsof -memiliki tcp: 3000
  2. bunuh -9 pid
Saif chaudhry
sumber
Dengan senang hati, Aashiah
Saif
5

Tambahkan ke ~/.bash_profile:

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

Lalu source ~/.bash_profile, lari

killTcpListen 8080

rofrol
sumber
5

Menggunakan sindresorhus Ini fkill alat, Anda dapat melakukan ini:

$ fkill :3000
Kodie Grantham
sumber
4

TL; DR:

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

Jika Anda berada dalam situasi di mana ada klien dan server menggunakan porta, mis:

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

maka Anda mungkin tidak ingin membunuh keduanya.

Dalam situasi ini Anda dapat menggunakan -sTCP:LISTENhanya untuk menunjukkan pid dari proses yang mendengarkan. Menggabungkan ini dengan -tformat singkat Anda dapat mematikan proses secara otomatis:

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

Saya membuat sedikit fungsi untuk ini, menambahkannya ke file rc Anda ( .bashrc, .zshrcatau apa pun)

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
}

maka Anda bisa mengetik kill-by-port 3000 untuk mematikan server rails Anda (mengganti 3000 untuk port apa pun yang sedang berjalan)

Jika gagal, Anda selalu bisa mengetik kill -9 $(cat tmp/pids/server.pid)dari direktori root rails

Caleb Keene
sumber
Saya harus backslash \$PORTuntuk mendapatkan pesan untuk ditampilkan dengan benar. Kalau tidak, bekerja dengan baik!
ashwood
4

Untuk membunuh banyak port.

$ npx kill-port 3000 8080 8081

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

Semoga bantuan ini!

Binh Ho
sumber
1

Anda harus mencoba ini, Teknik ini adalah OS Independen.

Di samping aplikasi Anda ada folder bernama tmp, di dalamnya ada folder lain yang disebut pids. File itu berisi file pid server. Hapus saja file itu. port secara otomatis membunuh dirinya sendiri.

Saya pikir ini adalah cara yang mudah.

Arun P
sumber
1

Berikut fungsi bash pembantu untuk membunuh beberapa proses dengan nama atau 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
}

Pemakaian:

$ fkill [process name] [process port]

Contoh:

$ fkill someapp :8080 node :3333 :9000
Miguel Mota
sumber
1

Anda bisa mencoba ini

netstat -vanp tcp | grep 3000
Foram Thakral
sumber
0

Jika Anda menginginkan cara bebas kode - buka pengelola aktivitas dan paksakan simpul simpul :)

HannahCarney
sumber
0

Saya menggunakan ini:

cat tmp/pids/server.pid | pbcopy

Kemudian kill -9 'paste'

Mihail menyembunyikan0 Kirilov
sumber
-1

Langkah 1: Temukan server yang sedang berjalan: ps aux | grep puma Langkah 2: Bunuh server tersebut Bunuh -9 [nomor server]

Thiện Nguyễn
sumber
-1

Di mac OS

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

Nol
sumber
1
Ini telah diposting sebagai komentar 5 tahun yang lalu, dan jawaban yang sama diposting beberapa kali.
Gilles Gouaillardet