Rails sunucusu bağlantı noktasının zaten kullanıldığını, bu işlemi nasıl öldüreceğini söylüyor?


275

Bir mac'tayım, yapıyorum:

rails server

Alırım:

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

Yeni bir limanda bir tane başlatabileceğimi biliyorum, ama bu süreci öldürmek istiyorum.

Yanıtlar:


694

3000 numaralı bağlantı noktasında (webrick'in normalde kullandığı şey) öldürmek istediğinizi varsayarsak, işlemin PID'sini bulmak için bunu terminalinize yazın:

$ lsof -wni tcp:3000

Ardından, işlemi öldürmek için PID sütunundaki sayıyı kullanın:

$ kill -9 PID


53
Yeni başlayanlar için açıklığa kavuşturmak için: ikinci kod PIDsatırında, ilk kod satırını (ör 12345.) Girdikten sonra konsolunuzda gösterilen gerçek sayı ile değiştirmeniz gerekir .
CodeBiker

5
PID'yi raylar dizininizde şu dosyaya giderek de bulabilirsiniz: tmp / pids /
server.pid

RubyMine'de hata ayıklayıcı çalıştırıyorsanız ve çöküyorsa ya da böyle bir şey olabilir ... Sunucu durur, ancak hata ayıklayıcı devam eder ... Her neyse, bu kullandığım çözüm ve mükemmel çalışıyor :)
J Smith

@tandy bu belirli bir proje için PID almanın iyi bir yoludur, ancak bazen bir işlem aniden kapandığında dosya olmayabilir, ancak sunucu hala çalışıyor olabilir. Bir yapmak lsof -wni tcp:3000olacak hep gösterecek tüm liman kombinasyonu: o protokol dinleyen süreçleri. (burada 3000 yerel sunucu bağlantı noktanızla değiştirilecektir. örneğin Rails'te bu varsayılan olarak 3000'dir).
SidOfc

125

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


3
Parantez arasındaki herşey portu 3000. Ve kullanarak o bir süreç kimliği döner -taraçları 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).size ne biliyorsundur daha killyapacak
Papouche Guinslyzinho

Bu, 'hepsi bir arada' satır olduğu için kabul edilen cevap olmalıdır. Bunu bir takma ada koyun ve gitmeye hazırsınız.
Nubtacular

Bir açıklama dahil olsaydı, bu kesinlikle bir oylamaya değer olurdu.
mwfearnley

2
Bu, açılan tüm tarayıcı oturumu da dahil olmak üzere tüm işlemleri öldürür. Bu yüzden denediğinizde dikkatli olmak istiyorsunuz.
theterminalguy

1
Lütfen kill -9rote / alışkanlık olarak kullanmakla ilgili kabul edilen cevap hakkındaki yorumuma bakın.
17'de

29

Tcp port 3000'i kullanarak programın işlem kimliğini almanız gerekir. İşlem kimliğini almak için

lsof -i tcp:3000 -t

Ve sonra bu işlem kimliğini kullanarak, sadece ubuntu kill komutunu kullanarak işlemi öldürün.

kill -9 pid

Veya aşağıda belirtilen birleştirme komutunu çalıştırın. Önce pid getirecek ve sonra bu işlemi öldürecek.

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

Lütfen kill -9rote / alışkanlık olarak kullanmakla ilgili kabul edilen cevap hakkındaki yorumuma bakın.
17'de

17

Mac'te olmayan bu soruya rastlayan herkes için: sunucunuzun 3000 numaralı bağlantı noktasında çalıştığını bildiğinizi varsayarsak, aşağıdakileri gerçekleştirerek bunu tek seferde yapabilirsiniz:

fuser -k 3000/tcp

Ancak Toby'nin belirttiği gibi, kaynaştırıcının Mac OS'de uygulanması oldukça ilkeldir ve bu komut mac üzerinde çalışmaz.


1
Kaynaştırıcı yalnızca seçenek olarak c, f ve u kabul ettiğinden, bu mac üzerinde çalışmaz (Mac soruda belirtilmiştir).
Toby

Cevabı güncelledim ve mac kullanıcıları için nasıl kullanılacağını da ele aldım. Özellikle başkaları göz önünde bulundurarak oy kullanmak için bir neden yok, ben de dahil olmak üzere geçmişte bu soruyu bir mac'ta olmamasına rağmen tökezledi.
saneshark

-vBayrak eklemek , hangi işlemin öldürüldüğü hakkında da az miktarda bilgi gösterir. Yani fuser -kv 3000/tcp. Ne yazık ki MacOS'un kaynaştırıcısında bu yetenek yok. kill $(lsof -ti tcp:3000)yine de oldukça yakın bir eşdeğerdir.
17'de

14

Bazı zamanlarda raylar sunucusunun düzgün kapanma şansı vardır. Rayların kullandığı işlemleri bulabilirsiniz

ps aux | grep rayları

Çıktı şöyle olacak

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

Burada process_id 12609, raylar sunucunuz tarafından kullanılır.

Komuta ile kolayca öldürebilirsiniz

öldür -9 12609


Bu benim için "ps aux | grep ruby" oldu. Belki
webrick'ten puma'ya

Lütfen kill -9rote / alışkanlık olarak kullanmakla ilgili kabul edilen cevap hakkındaki yorumuma bakın.
Lindes

Doğru işlemi bulmak için bunu yapmak zorunda kaldımps aux | grep puma
Sami Birnbaum

11

Yukarıdaki tüm cevaplar gerçekten iyi ama bunun için bir mücevher oluşturdu bu yüzden terminalde mümkün olduğunca az yazmak için bir yol gerekli. Gem'i yalnızca bir kez yükleyebilir ve Rails işlemini her öldürmek istediğinizde (geçerli klasördeyken) 'shutup' komutunu çalıştırabilirsiniz.

gem install shutup

sonra raylar projenizin geçerli klasörüne gidin ve çalıştırın

shutup # Bu işlem şu anda çalışan Rails işlemini öldürecek

Her zaman 'kapat' komutunu kullanabilirsiniz

DICLAIMER: Ben bu mücevherin yaratıcısıyım

NOT: rvm kullanıyorsanız gem'i global olarak yükleyin

rvm @global do gem install shutup

bu temiz. Kaynağa baktığınızda, geminiz pid dosyasını arar, ancak bunun var olduğu garanti edilmez. lsofyaklaşım daha güvenilir.
max pleaner

@maxpleaner: doğru ve aynı zamanda (belki de kazayla) yapılması durumunda, o portu dinleyebilecek başka bir işlemi öldürme olasılığı daha yüksektir.
17'de

Burada çalışıyor. Eğer 2019'da okuyorsanız, lütfen bu gem'i yükleyin, gerçekten işe yarıyor, çok daha kolay .. sadece geminize yükleme yüklemesini klasörünüzde çalıştırın ve öldürmeniz gereken her zaman sadece "shutup" yazın
Guilherme Nunes

Bu mücevheri yükledim ve koştum ve Sinatra'yı öldürdü. Ancak, bundan sonra varsayılan bağlantı noktası 4567 yanıt vermez veya 'set: port XXXX' komutu tarafından ayarlanan başka bir bağlantı noktası yanıt vermez. Bunu nasıl halledebilirim?
NevD

2

ps aux | grep rayları bu komutu kullanarak sunucuyu öldürebilirsiniz


1

Varsayılan olarak, rails sunucusu 3000 numaralı bağlantı noktasını kullanır.
Bu nedenle, rails sunucusunu çalıştırmak için 2 seçeneğiniz vardır.
1. Ya aşağıdaki komutu kullanarak özel bağlantı noktası tanımlayarak sunucuyu diğer bağlantı noktasında çalıştırabilirsiniz
rails s -p 3001
2. Ya da aşağıdaki komutu çalıştırarak çalışan tüm yakut işlemini öldürebilir ve
killall -9 ruby
sonra çalıştırabilirsiniz.rails server


0

Tek hat çözümü:

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

-4

Yazın:

man lsof

Sonra -w, -n ve -i'yi arayın

-i: internet işleri -n: daha hızlı yapar -w: uyarıları değiştirir

Kılavuz sayfalarında WAY daha fazla ayrıntı var


-6

Windows makinesindeyseniz şu adımları izleyin.

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

Burada server.pid adlı bir dosya olacak

silin.

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

Bu kadar.

EDIT: Lütfen buna bakın


3
Bu sunucuyu durdurmaz.
Nafaa Boutefer

Bu kod, sorunu çözmek için yardımcı olabilir ve soruyu neden ve / veya nasıl cevapladığına dair ek bağlam sağlar (özellikle, bir Windows makinesi için bir önerinin neden MacOS'ta olduğunu belirten bir soru için yararlı olabileceğini düşünüyorsunuz) uzun vadeli değerini önemli ölçüde artıracaktır. Lütfen biraz açıklama eklemek için cevabınızı düzenleyin .
Toby Speight
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.