Railsサーバーは、ポートはすでに使用されていると言っていますが、そのプロセスを終了するにはどうすればよいですか?


275

私はMacを使っています:

rails server

私は得る:

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

新しいポートで開始できることはわかっていますが、このプロセスを強制終了したいと思います。

回答:


694

ポート3000にあるもの(webrickが通常使用するもの)を強制終了する場合は、ターミナルに次のように入力して、プロセスのPIDを確認します。

$ lsof -wni tcp:3000

次に、PID列の番号を使用してプロセスを強制終了します。

$ kill -9 PID

4
あなたは説明してください可能性があり-wni
user993563

53
初心者のために明確にするために:コードの2行目では、コードPIDの最初の行を入力するとコンソールに表示される実際の番号(など12345)に置き換えます。
CodeBiker 2013

5
また、railsディレクトリから次のファイルtmp / pids / server.pidに移動してPIDを見つけることもできます
tandy

これは、RubyMineでデバッガーを実行しているときにクラッシュするか、サーバーが停止してもデバッガーが続行する場合に発生する可能性があります...とにかく、これは私が使用したソリューションであり、完全に機能します:)
J Smith

@tandyこれは、特定のプロジェクトのPIDを取得するための良い方法ですが、プロセスが突然閉じたときに、ファイルが存在しない場合でも、サーバーが実行されている場合があります。aを実行lsof -wni tcp:3000すると、常にそのプロトコルとポートの組み合わせをリッスンしているすべてのプロセス表示されます。(3000はローカルサーバーポートに置き換えられます。たとえば、Railsでは、これはデフォルトで3000です)。
SidOfc 2017年

125

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


3
括弧内のすべてのものが、ポート3000を使用するプロセスIDを返します。そして、私が-tspecifies 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).kill
想像

これは「オールインワン」の行であるため、受け入れられる答えになるはずです。これをエイリアスに入れれば、問題ありません。
Nubtacular 2016年

説明が含まれている場合、これは間違いなく賛成の価値があります。
mwfearnley

2
これにより、開いているすべてのブラウザセッションを含むすべてのプロセスが強制終了されます。だからあなたはそれを試してみるときに注意したいです。
theterminalguy 2016年

1
kill -9rote /習慣的に使用することについて受け入れられた答えについての私のコメントを参照してください。
lindes

29

tcpポート3000を使用してプログラムのプロセスIDを取得する必要があります。プロセスIDを取得するには

lsof -i tcp:3000 -t

そして、そのプロセスIDを使用して、ubuntu killコマンドを使用してプロセスを強制終了します。

kill -9 pid

または、下記の結合コマンドを実行します。最初にpidをフェッチしてから、そのプロセスを強制終了します。

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

kill -9rote /習慣的に使用することについて受け入れられた答えについての私のコメントを参照してください。
lindes

17

Mac以外でこの問題に遭遇した場合、サーバーがポート3000で実行されていることがわかっている場合、次のコマンドを実行すると、これを一度に実行できます。

fuser -k 3000/tcp

しかし、Tobyが述べたように、Mac OSでのフューザーの実装はかなり原始的であり、このコマンドはMacでは機能しません。


1
フューザーはオプションとしてc、f、uのみを受け入れるため、これはMacでは機能しません(Macは質問で規定されています)。
Toby

私は答えを更新しました、そしてそれは同様にMacユーザーのためにそれを使う方法を扱います。Macを使用していなくても、過去にこの質問に遭遇した私を含め、特に他のユーザーを考慮して反対票を投じる理由はありません。
saneshark 2013年

-vフラグを追加すると、どのプロセスが強制終了されたかについての少量の情報も表示されます。ですからfuser -kv 3000/tcp。残念ながら、MacOSのフューザーにはこの機能がありません。kill $(lsof -ti tcp:3000)ただし、かなり近いものです。
lindes

14

Railsサーバーが適切に閉じられない可能性があります。レールが使用するプロセスを見つけることができます

ps aux | grepレール

出力は次のようになります

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

ここで、process_id 12609はRailsサーバーによって使用されます。

コマンドで簡単に殺せます

キル-9 12609


これは私にとって「ps aux | grep ruby​​」になりました。多分ウェブリックからプーマへの切り替えから
rigyt

kill -9rote /習慣的に使用することについて受け入れられた答えについての私のコメントを参照してください。
lindes

適切なプロセスを見つけるためにこれを行わなければなりませんでしたps aux | grep puma
サミバーンバウム

11

上記のすべての答えは本当に良いですが、ターミナルでできるだけ少なく入力する方法が必要だったので、そのための宝石を作成しました。Gemをインストールできるのは1回だけで、Railsプロセスを(現在のフォルダーにいる間)強制終了するたびに 'shutup'コマンドを実行できます。

gem install shutup

次に、railsプロジェクトの現在のフォルダーに移動して実行します

shutup #これにより、現在実行中のRailsプロセスが強制終了されます

いつでもコマンド「shutup」を使用できます

DICLAIMER:私はこの宝石の作成者です

注:rvmを使用している場合は、gemをグローバルにインストールします

rvm @global do gem install shutup

これはきちんとしている。ソースを見ると、gemはpidファイルを探しますが、それが存在するとは限りません。lsofアプローチは、より信頼性のあります。
max pleaner 16

@maxpleaner:true、また、(おそらく偶然に)行われた場合に、そのポートでリッスンしている可能性がある他のプロセスを強制終了する可能性が高くなります。
lindes

ここで動作します。2019年にこれを読んでいる場合は、このgemをインストールしてください。これは実際に機能し、非常に簡単です。フォルダでgem install shutupを実行するだけで、「shutup」と入力するだけでkillする必要があります
Guilherme Nunes

私はこの宝石をインストールして実行し、シナトラを殺しました。ただし、これ以降、デフォルトのポート4567は応答せず、「set:port XXXX」コマンドで設定された他のポートも応答しなくなります。どうすればこれを処理できますか?
NevD

2

ps aux | grep railsはこのコマンドを使用して、サーバーを強制終了できます


1

デフォルトでは、railsサーバーはポート3000を使用し
ます。そのため、railsサーバーを実行するには2つのオプションがあります。
1.次のコマンドを使用してカスタムポートを定義することにより、他のポートでサーバを実行するか
rails s -p 3001
2.それとも、次のコマンドを実行して、実行中のすべてのルビープロセスを殺すことができ
killall -9 ruby
、次に実行しますrails server



-4

入力:

man lsof

次に、-w、-n、および-iを探します。

-i:インターネット関連-n:高速化-w:警告をトグル

マンページにWAYの詳細があります


-6

Windowsマシンを使用している場合は、次の手順に従ってください。

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

そこで、server.pidというファイルがあります。

消して。

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

それでおしまい。

編集: これを参照してください


3
これはサーバーを停止しません。
Nafaa Boutefer 2015年

このコードは問題を解決するのに役立つ可能性がありますが、なぜまたはどのように質問に答えるに関する追加のコンテキストを提供します(特に、Windowsマシンの提案が、MacOSにあることを示す質問に役立つと思う理由)長期的な価値が大幅に向上します。回答を編集して、説明を追加してください。
Toby Speight 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.