Server Rails mengatakan port sudah digunakan, bagaimana cara mematikan proses itu?


275

Saya menggunakan mac, melakukan:

rails server

Saya mendapat:

2010-12-17 12:35:15] INFO  WEBrick 1.3.1
[2010-12-17 12:35:15] INFO  ruby 1.8.7 (2010-08-16) [i686-darwin10.4.0]
[2010-12-17 12:35:15] WARN  TCPServer Error: Address already in use - bind(2)
Exiting

Saya tahu saya bisa memulainya di port baru, tetapi saya ingin menghentikan proses ini.

Jawaban:


694

Dengan asumsi Anda ingin membunuh apa pun yang ada di port 3000 (yang biasa digunakan webrick), ketikkan ini di terminal Anda untuk mengetahui PID proses:

$ lsof -wni tcp:3000

Kemudian, gunakan nomor di kolom PID untuk mematikan proses:

$ kill -9 PID

4
bisa tolong jelaskan --wni
user993563

53
Hanya untuk mengklarifikasi bagi pemula: pada baris kode kedua, Anda harus mengganti PIDdengan angka aktual yang ditampilkan di konsol Anda setelah memasukkan baris kode yang pertama (misalnya, 12345).
CodeBiker

5
Anda juga dapat menemukan PID dengan menavigasi direktori rel Anda ke file berikut tmp / pids / server.pid
tandy

Ini dapat terjadi jika Anda menjalankan debugger di RubyMine dan crash atau sesuatu ... Server berhenti tetapi debugger berlanjut ... Lagi pula, ini adalah solusi yang saya gunakan dan berfungsi dengan baik :)
J Smith

@tandy ini adalah cara yang baik untuk mendapatkan PID untuk proyek tertentu, namun, terkadang ketika proses tiba-tiba ditutup, file mungkin tidak ada tetapi server masih bisa berjalan. Melakukan lsof -wni tcp:3000akan selalu menunjukkan semua proses mendengarkan pada protokol itu: kombinasi port. (di mana 3000 harus diganti dengan port server lokal Anda. misalnya dalam Rails ini adalah 3000 secara default).
SidOfc

125

kill -9 $(lsof -i tcp:3000 -t)


3
segala sesuatu di antara tanda kurung akan mengembalikan proses id yang menggunakan port 3000. Dan -tberarti specifies that lsof should produce terse output with process identifiers only and no header - e.g., so that the output may be piped to kill(1).daripada saya kira Anda tahu apa yang killakan dilakukan
Papouche Guinslyzinho

Ini harus menjadi jawaban yang diterima karena ini merupakan baris 'semua dalam satu'. Masukkan ini sebagai alias dan Anda siap melakukannya.
Nubtacular

Jika sebuah penjelasan dimasukkan, ini pasti akan menjadi nilai positif.
mwfearnley

2
Ini akan mematikan semua proses termasuk semua sesi browser yang dibuka. Jadi, Anda ingin berhati-hati saat mencobanya.
theterminalguy

1
Silakan lihat komentar saya pada jawaban yang diterima tentang penggunaan kill -9dengan menghafal / terbiasa.
lindes

29

Anda perlu mendapatkan id proses dari program menggunakan tcp port 3000. Untuk mendapatkan id proses

lsof -i tcp:3000 -t

Dan kemudian menggunakan id proses itu, cukup bunuh proses menggunakan perintah kill ubuntu.

kill -9 pid

Atau jalankan saja perintah gabungan yang disebutkan di bawah ini. Pertama-tama akan mengambil pid dan kemudian membunuh proses itu.

kill -9 $(lsof -i tcp:3000 -t)

Silakan lihat komentar saya pada jawaban yang diterima tentang penggunaan kill -9dengan menghafal / terbiasa.
lindes

17

Bagi siapa pun yang tersandung pada pertanyaan ini yang tidak ada di Mac: dengan asumsi Anda tahu bahwa server Anda berjalan pada port 3000, Anda dapat melakukan ini dalam satu kesempatan dengan menjalankan yang berikut:

fuser -k 3000/tcp

Tetapi seperti yang disebutkan Toby, implementasi fuser di Mac OS agak primitif dan perintah ini tidak akan berfungsi pada mac.


1
Ini tidak akan berfungsi pada mac (Mac ditentukan dalam pertanyaan) karena fuser hanya menerima c, f, dan u sebagai opsi.
Toby

Saya telah memperbarui jawabannya dan membahas bagaimana menggunakannya untuk pengguna mac juga. Tidak ada alasan untuk memilih terutama mengingat orang lain, termasuk saya menemukan pertanyaan ini di masa lalu meskipun tidak di mac.
saneshark

Menambahkan -vbendera juga menunjukkan sejumlah kecil info tentang proses apa yang terbunuh. Jadi fuser -kv 3000/tcp. Sayangnya fuser MacOS tidak memiliki kemampuan ini. kill $(lsof -ti tcp:3000)adalah setara yang cukup dekat, meskipun.
lindes

14

Beberapa kali ada kemungkinan server rel tidak tertutup dengan benar. Anda dapat menemukan proses yang digunakan oleh rel

ps aux | rel grep

Output akan seperti

user     12609  9.8  0.5  66456 45480 pts/0    Sl+  21:06   0:02 /home/user/.rvm/rubies/ruby-2.2.0-preview1/bin/ruby bin/rails s

Di sini process_id 12609 digunakan oleh server rails Anda.

Anda dapat membunuhnya dengan mudah dengan perintah

bunuh -9 12609


Ini telah menjadi "ps aux | grep ruby" untuk saya. Mungkin dari peralihan dari webrick ke puma
rigyt

Silakan lihat komentar saya pada jawaban yang diterima tentang penggunaan kill -9dengan menghafal / terbiasa.
lindes

Saya harus melakukan ini untuk menemukan proses yang tepatps aux | grep puma
Sami Birnbaum

11

Semua jawaban di atas benar-benar bagus tetapi saya membutuhkan cara untuk mengetik sesedikit mungkin di terminal jadi saya membuat permata untuk itu. Anda dapat menginstal permata hanya sekali dan menjalankan perintah 'shutup' setiap kali Anda ingin membunuh proses Rails (saat berada di folder saat ini).

gem install shutup

kemudian masuk ke folder saat ini dari proyek rel Anda dan jalankan

shutup # ini akan mematikan proses Rails yang sedang berjalan

Anda dapat menggunakan perintah 'shutup' setiap kali Anda inginkan

DICLAIMER: Saya adalah pencipta permata ini

CATATAN: jika Anda menggunakan rvm, instal permata secara global

rvm @global do gem install shutup

ini rapi. Melihat sumbernya, permata Anda mencari file pid, tetapi itu tidak dijamin ada. yang lsofpendekatan yang lebih dapat diandalkan.
max pleaner

@maxpleaner: true, dan juga lebih mungkin untuk membunuh beberapa proses lain yang mungkin mendengarkan pada port itu, jika itu dilakukan (mungkin secara tidak sengaja).
lindes

Ini berfungsi di sini. Jika Anda membaca ini pada tahun 2019, silakan instal permata ini, itu benar-benar berfungsi, jadi lebih mudah .. jalankan saja permata instal shutup di folder Anda, dan setiap kali Anda perlu membunuh cukup ketik "shutup"
Guilherme Nunes

Saya memasang permata ini, dan menjalankannya dan itu membunuh Sinatra. Namun, mulai sekarang port default 4567 tidak merespons, juga port lain tidak diatur oleh perintah 'set: port XXXX'. Bagaimana saya bisa menangani ini?
NevD


1

Secara default, server rel menggunakan port 3000.
Jadi, Anda memiliki 2 opsi untuk menjalankan server rail.
1. Anda dapat menjalankan server pada port lain dengan menentukan port khusus menggunakan perintah berikut
rails s -p 3001
2. Atau Anda dapat membunuh semua proses ruby ​​yang sedang berjalan dengan menjalankan perintah berikut,
killall -9 ruby
kemudian jalankanrails server


0

Solusi satu baris:

kill -9 $(ps aux | grep 'rails s' | awk {'print$2'}); rails s

-4

Ketikkan:

man lsof

Kemudian cari -w, -n, dan -i

-i: barang-barang internet -n: membuatnya lebih cepat -w: mengaktifkan peringatan

Ada WAY rincian lebih lanjut di halaman manual


-6

Jika Anda menggunakan mesin windows, ikuti langkah-langkah ini.

c:/project/
cd tmp
c:/project/tmp
cd pids
c:/project/tmp/pids
dir

Di sana Anda akan file bernama server.pid

Hapus.

c:/project/tmp/pid> del *.pid

Itu dia.

EDIT: Silakan merujuk ini


3
Ini tidak akan menghentikan server.
Nafaa Boutefer

Meskipun kode ini dapat membantu menyelesaikan masalah, memberikan konteks tambahan tentang mengapa dan / atau bagaimana ia menjawab pertanyaan (khususnya, mengapa menurut Anda saran untuk mesin Windows mungkin berguna untuk pertanyaan yang menyatakan bahwa itu ada di MacOS) akan secara signifikan meningkatkan nilai jangka panjangnya. Harap edit jawaban Anda untuk menambahkan beberapa penjelasan.
Toby Speight
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.