自分のTCPポートをリッスン/使用しているプロセスをどのように見つけますか?私はMac OS Xを使っています。
クラッシュやバグの後で、私のRailsアプリケーションがポート3000をロックしてしまうことがあります。ps -efを使用しても見つけられません。
するとき
Rails server
私は
アドレスはすでに使用されています - bind(2)(Errno :: EADDRINUSE)
2014年の更新:
以下のいくつかの答えを完成させるには:killコマンドを実行した後、pidファイルを削除する必要があるかもしれませんrm ~/mypath/myrailsapp/tmp/pids/server.pid
netstat
を試すことができます
netstat -vanp tcp | grep 3000
macOS El Capitan 以降(またはあなたのnetstatが-p
をサポートしていない場合)にはlsof
を使用してください。
Sudo lsof -i tcp:3000
Centos 7 useの場合
netstat -vanp --tcp | grep 3000
見つける:
[Sudo] lsof -i :3000
殺します:
kill -9 <PID>
上記の何も私のために働いた。私の経験を持つ人なら誰でも次のことを試すことができます(私のために働いた)。
実行します。
lsof -i :3000 (where 3000 is your current port in use)
次に、報告されたPIDのステータスを確認します。
ps ax | grep <PID>
最後に、「それを始めて」:
kill -QUIT <PID>
ポート3000を使用してプロセスのPIDを抽出して強制終了するためのワンライナー。
lsof -ti:3000 | xargs kill
-tフラグを指定すると、lsofの出力からPID以外のすべてのものが削除され、簡単に削除できます。
lsof -i:3000
を使うことができます。
それが "オープンファイルのリスト"です。これはあなたにプロセスとそれらが使用するファイルとポートのリストを与えます。
.bash_profile
で、3000プロセスのterminate
へのショートカットを作成します。
terminate(){
lsof -P | grep ':3000' | awk '{print $2}' | xargs kill -9
}
その後、ブロックされている場合は$terminate
を呼び出します。
lsof -P | grep ':3000' | awk '{print $2}'
これはあなたにMacOSでテストされたpidだけを与えます。
ポート上のプロセスを強制終了する方法の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
OS-X El Capitanのコマンドラインで実行します。
kill -kill `lsof -t -i tcp:3000`
Lsofの簡潔なオプションは、PIDのみを返します。
ポートをブロックしているプロセスを表示するには
netstat -vanp tcp | grep 3000
ポートをブロックしているプロセスを強制終了するには:
kill $(lsof -t -i :3000)
開いている接続を見つけます
lsof -i -P | grep -i "聞く"
プロセスIDで強制終了
kill -9 'PID'
PIDを見つけてプロセスを終了します。
lsof -ti:3000 | xargs kill
これを達成するための可能な方法:
上
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
見つけて殺す:
この単一のコマンドラインは簡単で、正しく機能します。
kill -9 $(lsof -ti tcp:3000)
最も簡単な解決策 :1行のコマンドで複数のポートを終了.
kill $(lsof -t -i:3000,3001) // 3000 and 3001 are the ports to be freed
lsof -t -i:3000
82500
lsof -t -i:3001
82499
lsof -t -i:3001,3000
82499 82500
$を殺す(lsof -t -i:3001,3000)
1つのコマンドでプロセス82499と82500を終了します。
lsof -t -i:3000
lsof -t -i:3001
package.json
スクリプトでこれを使うことができます
"scripts": { "start": "kill $(lsof -t -i:3000,3001) && npm start" }
sindresorhus の fkill toolを使うと、これができます。
$ fkill :3000
~/.bash_profile
に追加してください:
function killTcpListen () {
kill -QUIT $(Sudo lsof -sTCP:LISTEN -i tcp:$1 -t)
}
それからsource ~/.bash_profile
そして実行
killTcpListen 8080
私はこれのために少し関数を作りました、それをあなたの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
}
それであなたはあなたのRailsサーバーを殺すためにkill-by-port 3000
をタイプすることができます(それが走っているどんなポートでも3000を代用します)
それに失敗しても、Railsのルートディレクトリからkill -9 $(cat tmp/pids/server.pid)
とタイプすればいいのです。
これら2つのコマンドは、サーバープロセスを見つけて強制終了するのに役立ちます。
- lsof -wni tcp:3000
- -9 pidを殺す
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)
それならあなたはおそらく両方を殺したくないでしょう。
この状況では、リスニングしているプロセスのpidのみを表示するために-sTCP:LISTEN
を使用できます。これを-t
の簡潔な形式と組み合わせると、自動的にプロセスを強制終了できます。
lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill
lsof -i tcp:port_number
- そのポートで走っているプロセスをリストします
kill -9 PID
- プロセスを強制終了します
あなたの場合は、
あなたの端末からのlsof -i tcp:3000
はプロセスのPIDを見つけます
kill -9 PID
これは名前やポートで複数のプロセスをkillするためのヘルパー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
あなたはこれを試すべきです、このテクニックはOSに依存しません。
アプリケーションの横にはtmpという名前のフォルダがあり、その中にはpidsという名前の別のフォルダがあります。 そのファイルにはサーバーのpidファイルが含まれています。単にそのファイルを削除してください。 portは自動的に自分自身を殺します。
これは簡単な方法だと思います。
あなたはこれを試すことができます
netstat -vanp tcp | grep 3000
あなたがコードフリーな方法が欲しいなら - 活動マネージャを開いて、強制的にノードを殺してください:)
次のコマンドを使用して、ポート3000のプロセスを強制終了します。kill $(lsof -t -i:3000)