Macでポート3000をロックしているプロセスを検索(および強制終了)


1811

tcpポートをリッスン/使用するプロセスをどのようにして見つけ(そして殺し)ますか?Mac OS Xを使用しています。

時々、クラッシュやバグが発生した後、私のRailsアプリがポート3000をロックしています。ps-efを使ってそれを見つけることができません...

するとき

rails server

私は得る

アドレスは既に使用中-bind(2)(Errno :: EADDRINUSE)

2014年の更新:

以下の回答のいくつかを完了するには:killコマンドを実行した後、pidファイルの削除が必要になる場合があります rm ~/mypath/myrailsapp/tmp/pids/server.pid


25
ユーザーが指定した任意のポートでプロセスを強制終了するための非常にきちんとした解決策は、以下の@Kevin Suttleの回答にあります。後世のためにここに複製:function killport() { lsof -i TCP:$1 | grep LISTEN | awk '{print $2}' | xargs kill -9 }
user456584 2014年

4
ポート3000は「高度なレール開発固有」ではありません。Meteorはネイティブで3000でも動作します。他にもあると思います。
gregorvand

上記の@ user456584のコメントは、受け入れられる答えになるはずです^^^この機能は、ポートで実行していた多くのプロセスを
強制終了し

回答:


3026
  1. あなたが試すことができます netstat

    netstat -vanp tcp | grep 3000
    
  2. 以下のためのMacOSエルキャピタン以降(またはあなたのnetstatコマンドがサポートされていない場合-p)、使用lsof

    sudo lsof -i tcp:3000 
    
  3. 以下のためのCentOSに7使用

    netstat -vanp --tcp | grep 3000
    

22
ありがとうございました!あなたの答えが私の「death_to 'port'」スクリプトを生み出しました。(#!/ usr / bin / ruby lsof -t -i tcp:#{ARGV.first} | xargs kill
Sv1

192
lsofのは「簡潔」フラグは、後続のキルへの配管に適した出力を生成しますlsof -t -i tcp:1234 | xargs kill
Manav

6
私はこれを私の中に入れました~/.bash_profilefindandkill() { port=$(lsof -n -i4TCP:$1 | grep LISTEN | awk '{ print $2 }') kill -9 $port } alias killport=findandkillだから今タイプするだけでkillport 8080数秒節約できます
AlfonsoPérez15年

3
別のヒント:sudo出力が表示されない場合は、lsofの前に試すようにしてください
Abe Petrillo 2016

4
もう一つのヒントは、追加することです-Plsof、生のポートが出力に表示されるようにコマンド:lsof -P -i:3000
ジェイソンAxelson

1875

検索:

sudo lsof -i :3000

殺します:

kill -9 <PID>

61
たまに-iのlsof:ポートは何も表示されません。sudo lsof -i:portを試してください。
kilik52 14年

31
安全のためkill -15 <PID>に頼る前に試すことをお勧めし-9ます。
Jamon Holmgren 2015

7
@Jamon Holmgrenなんで?両方は何をしますか?そして、なぜkill <PID>不十分/危険/不完全なのですか?
Michael Trouw 2015年

13
@MichaelTrouwはほぼ1年後ですが、これがあなたの答えです。:-) unix.stackexchange.com/a/8918 TL; DR kill -15は、プロセスにそれ自体をクリーンアップする機会を与えます。
Jamon Holmgren

9
この答えは何をすべきかを言うべきだと思います-9
ジョセフフレーリー2017年

207

上記の何も私のために働いていません。私の経験を持つ他の誰でも次のことを試すことができます(私のために働きました):

実行:

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

次に、報告されたPIDのステータスを確認します。

ps ax | grep <PID>

最後に、「それを始める」:

kill -QUIT <PID>

18
これは実際には、9に対して277の賛成票を投じるフィリップスピリドノフによって後で与えられるものよりも良い答えのようです。正義はありません...
フローリス

前に試すkill -TERM(または単にkillkill -QUIT。すべてのプロセスがSIGQUITで正常にシャットダウンするわけではありません。
craig65535

160

ポート3000を使用してプロセスのPIDを抽出し、強制終了するワンライナー。

lsof -ti:3000 | xargs kill

-tフラグを指定すると、lsof出力からPID以外のすべてが削除され、簡単に削除できます。


13
あなたが「リスニング」のポートをフィルタリングすることができますlsof -ti:3000 -sTCP:LISTEN
Zlemini

1
この方法は私にとって最も効果的です。ビジーポートをクリアするシンプルなワンライナー。ありがとう!
ライアントレーナー

139

最も簡単な解決策

単一ポートの場合:

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

1行のコマンドで複数のポートを強制終了します。

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

lsof -ti:3000

82500(プロセスID / PID)

lsof -ti:3001

82499

lsof -ti:3001,3000

82499 82500

$(lsof -ti:3001,3000)を殺す

82499プロセスと82500プロセスの両方を1つのコマンドで終了します。

package.jsonスクリプトでこれを使用する場合:

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


2
これは私のおかげで
うまくいきました

2
それが助けてうれしい。
Abhijith Sasikumar

113

この単一のコマンドラインは覚えやすいです:

npx kill-port 3000

検索を備えたより強力なツールの場合:

npx fkill-cli


PS:彼らはサードパーティのjavascriptパッケージを使用しています。npxNode.jsに組み込まれています。

ソース: ツイート | github


brewを使用したnpxのインストールの詳細を共有できますか?Mac High Sierra 10.13.3にインストールしようとしましたが、動作しません。
realPK 2018年

@realPKにnpxはが付属しnpmているnode.jsため、個別のパッケージではありません。node.jsとnpmバージョンをアップグレードするだけです。
Bruno Lemos 2018年

私はほとんどJavaを使用していますが、まだNodeに触れていません。ポートで実行されているサービスを強制終了する別の方法を見つけました。応答用のTY。
realPK 2018年

5
ポート3000で実行されている何かを殺すためのNodeJSとJavaScriptの必要性はおそらくレールです...私にはオーバーヘッドが多すぎるようです。エイリアスを使用して.bashrcまたは.zshrcに単純な行を追加すると、インターネットを必要とせずに解決されます。エイリアスkill3000 = 'lsof -ti:3000 | xargs kill 'では、次のことができます。kill3000
Khalil Gharbaoui

この問題の最善の解決策..感謝
レイハン王

107

使用できます lsof -i:3000

それが「開いているファイルのリスト」です。これにより、プロセスとプロセスが使用するファイルとポートのリストが表示されます。


私は10.5 lepard(更新されたQ)にいます。ここでそれが重要かどうかはわかりませんが、lsofはポートを表示しません。lsof -h(lsof 4.78)はあまりにも不可解すぎる...
oma

1
うーん。Leopardで確実にわからないが、(rootとして -これは重要だと思う)試してみてくださいlsof -i:3000
マットギブソン

59

あなたには.bash_profile、ショートカットの作成terminate3000のプロセスを:

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

次に、$terminateそれがブロックされている場合は呼び出します。



そして、そのような説明的な名前= p
Michael Peterson

私はこれに似たものを持っていますが、ポートを渡します。私は自分の関数にKPという名前を付けました。
ジョセフチェンバーズ

58

そのようなプロセスを強制的に強制終了するには、次のコマンドを使用します

lsof -n -i4TCP:3000 

3000はプロセスが実行されているポート番号です。

これはプロセスid(PID)を返し、実行します

kill -9 "PID"

PIDを、最初のコマンドの実行後に取得した番号に置き換えます

インスタンスの場合、ポート8080で実行されているプロセスを強制終了したい場合


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

これにより、MacOSでテストされたpidのみが表示されます。


10
MACでポート3000のすべてのPIDを強制終了します。lsof-P | grep ':3000' | awk '{print $ 2}' | xargs kill -9
マイククラッグ2013年

1
複数のプロセスが同じポートをリッスンできますか?
クリス2013年

私たちのRailsアプリは子プロセスであるワーカーを生成します。私はこれを使用して孤立したワーカーを殺す必要があります
マイククラッグ

2
これは、ポートに接続するwebbrowsers殺す
fjsj

5
これが機能しています:lsof -n -iTCP:3407 -sTCP:LISTEN -n -l -P | grep 'LISTEN' | awk '{print $2}' | xargs kill -9
bob

29

OS-X El Captainのコマンドラインで実行:

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

lsofのTerseオプションはPIDのみを返します。


28

ポート上のプロセスを強制終了する方法の1つは、pythonライブラリを使用することです:freeport(https://pypi.python.org/pypi/freeport/0.1.9)。インストールしたら、単に:

# install freeport
pip install freeport

# Once freeport is installed, use it as follows
$ freeport 3000
Port 3000 is free. Process 16130 killed successfully

7
これは、はるかに簡単な方法ではありません。賛成投票では、何もダウンロードしてインストールする必要はありません。
Greg Pasquariello、2016年

4
前提条件が満たされている場合、これは非常にシンプルで覚えやすいです。「最も単純」の定義は異なりますが、この答えは完全に有効で適切です。たぶん、pipでfreeportをインストールするための指示が欠けているだけかもしれません。
Cyril Duchon-Doris

内部的には、freeportはlsof -t -i:3000.. を呼び出すラッパーにすぎません。
Corey Goldberg

このソリューションは最も簡単ではありませんが、OPが求めたものに100%準拠しています...だから、それは
確かに

26

ポートをブロックしているプロセスを表示するには:

netstat -vanp tcp | grep 3000

ポートをブロックしているプロセスを強制終了するには:

kill $(lsof -t -i :3000)


これはMacマシンでは機能せず、次を返します。kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]ただし、ほとんどのLinuxディストリビューションでは機能します
Milan Velebit

1
@MilanVelebit実際には、私のMacマシン(Sierra)で完全に動作します。ポート3000が使用されている場合は問題なく動作します。ただし、ポートをブロックしているプロセスがない場合は、kill: not enough argumentsエラーが発生します。
Henry

それは奇妙なことですが、私は2台のMac(両方ともHigh Sierra tho)を持っています。これらのコマンドを両方(古い習慣)で実行したことを覚えており、実行されないことは確かです。私は自分のマシンでもう一度試してみましたが、ポートが占有されていることがわかり、同じエラーが発生しました。:/
ミラノヴェレビット2018

使用中のnetstat -vanp tcp | grep 3000ポートについて、running で有効なPIDを取得しましたか?
Henry

1
bashzshシェルの両方で試してみました。私にとってはうまくいきます。なぜうまくいかないのかわからない。ハイシエラとは何か関係があるのでしょうか?
Henry



14

これを達成するための可能な方法:

topコマンドは、システムのリソース使用状況を表示し、システムリソースを最も多く使用しているプロセスを表示する従来の方法です。Topはプロセスのリストを表示します。CPUを最も使用しているプロセスが一番上に表示されます。

PS

psコマンドは、実行中のプロセスをリストします。次のコマンドは、システムで実行されているすべてのプロセスを一覧表示します。

ps -A

また、grepを介して出力をパイプ処理し、他のコマンドを使用せずに特定のプロセスを検索することもできます。次のコマンドは、Firefoxプロセスを検索します。

ps -A | grep firefox

プログラムにシグナルを渡す最も一般的な方法は、killコマンドを使用することです。

kill PID_of_target_process

lsof

開いているすべてのファイルとそれらを開いたプロセスのリスト。

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

または

 lsof -i tcp:3000 

10

lsof -i tcp:port_number -そのポートで実行されているプロセスを一覧表示します

kill -9 PID -プロセスを強制終了します

あなたの場合、それは

lsof -i tcp:3000 端末からプロセスのPIDを見つけます

kill -9 PID



5

追加~/.bash_profile

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

その後source ~/.bash_profile、実行します

killTcpListen 8080



4

TL; DR:

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

ポートを使用しているクライアントとサーバーの両方がある状況にいる場合、例えば:

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

その場合、おそらく両方を殺したくないでしょう。

この状況では、を使用-sTCP:LISTENして、リッスンしているプロセスのPIDのみを表示できます。これを-t簡潔な形式と組み合わせると、プロセスを自動的に強制終了できます。

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

4

私はあなたのrcファイルに追加し、このために少し機能を作った(.bashrc.zshrcまたは何でも)

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
}

次に、入力kill-by-port 3000してRailsサーバーを強制終了します(実行中のポートを3000に置き換えます)。

それが失敗した場合は、常にkill -9 $(cat tmp/pids/server.pid)Railsルートディレクトリから入力するだけで済みます


\$PORTメッセージを正しく表示するには、バックスラッシュを使用する必要がありました。そうでなければ、うまくいきます!
ashwood

4

マルチポートを強制終了します。

$ npx kill-port 3000 8080 8081

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

この助けを願っています!


1

これを試す必要があります。この手法はOSに依存しません。

アプリケーションの側には、tmpと呼ばれるフォルダーがあり、その中にpidsと呼ばれる別のフォルダーがあります。そのファイルには、サーバーのpidファイルが含まれています。そのファイルを削除するだけです。ポートは自動的に自分自身を殺します。

これは簡単な方法だと思います。


1

これは、名前またはポートで複数のプロセスを強制終了するヘルパーbash関数です

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
}

使用法:

$ fkill [process name] [process port]

例:

$ fkill someapp :8080 node :3333 :9000


0

コードなしの方法が必要な場合-アクティビティマネージャーを開き、ノードを強制終了します:)



-1

ステップ1:実行中のサーバーを見つける: ps aux | grep puma ステップ2:サーバーを強制終了するKill -9 [サーバー番号]


-1

Mac OSの場合

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


1
これは5年前にコメントとして投稿され、模擬回答が複数回投稿されました。
Gilles Gouaillardet
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.