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.

Blankman
sumber

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
idlefingers
sumber
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)

Bijan
sumber
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)
Shahzad Tariq
sumber
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.

saneshark
sumber
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

devudilip
sumber
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
Lorenzo Sinisi
sumber
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
2

ps aux | grep rails menggunakan perintah ini Anda dapat membunuh server

Kursi goyang
sumber
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

Sarwan Kumar
sumber
0

Solusi satu baris:

kill -9 $(ps aux | grep 'rails s' | awk {'print$2'}); rails s
Anmol Chawla
sumber
-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

InsanelyADHD
sumber
-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

Prabhakar Undurthi
sumber
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