web-dev-qa-db-ja.com

特定のポートでリッスンしているプロセスpidを決定する

タイトルにあるように、私は複数のゲームサーバーを実行しています。それらはすべて同じnameを持っていますが、異なるPIDport番号を持っています。特定のポートでリッスンしているサーバーのPIDと一致させたいので、このプロセスを強制終了したいと思います。 bashスクリプトを完了するために必要です。

それも可能ですか?まだウェブ上で解決策を見つけられなかったからです。

91
Cyclone

netstat-pフラグは、プロセスのPIDを提供します。

netstat -l -p

編集: FreeBSDでソケットユーザーのPIDを取得するために必要なコマンドはsockstatです。 @Cycloneとの議論の中で解決したように、仕事をする行は次のとおりです。

sockstat -4 -l | grep :80 | awk '{print $3}' | head -1
117
stanwise

Killコマンドに渡すことができる短いバージョン:

lsof -i:80 -t
133
Laurynas

netstat -p -l | grep $PORTおよびlsof -i :$PORTソリューションは良いですが、パイプと同様に、POSIX(coreutilsで機能する)よりもfuser $PORT/tcp拡張構文を好む:

pid=`fuser $PORT/tcp`

sedマジックをドロップできるように、純粋なpidを出力します。

fuserを私の恋人のツールにしていることの1つは、そのプロセスに直接シグナルを送信できることです(この構文はPOSIXの拡張でもあります)。

$ fuser -k $port/tcp       # with SIGKILL
$ fuser -k -15 $port/tcp   # with SIGTERM
$ fuser -k -TERM $port/tcp # with SIGTERM

また、-kはFreeBSDでサポートされています: http://www.freebsd.org/cgi/man.cgi?query=fuser

14
gavenkoa

netstat -nlpは、どのポートでリッスンしているかのPIDを通知する必要があります。

9
user1276209

プログラムで-Bashのみを使用して-特定のポートでリッスンしているプロセスを強制終了しました。

ポートが8089であるとします。次に、私がどのようにそれをしたかを示します。

badPid=$(netstat --listening --program --numeric --tcp | grep "::8089" | awk '{print $7}' | awk -F/ '{print $1}' | head -1)
kill -9 $badPid

これが他の誰かに役立つことを願っています!私のチームの助けになることはわかっています。

3
Glavin001

Sockstatは私のマシンにネイティブにインストールされていなかったので、代わりにnetstatを使用するというスタンワイズの答えをハックしました。

netstat -nlp | grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:2000" | awk '{print $7}' | sed -e "s/\/.*//g""
2
dafky2000

windowsでは、pidを取得するためのnetstatオプションは-oであり、-pはプロトコルフィルターを選択します。例:netstat -a -p tcp -o

1
Jan Wilmans

構文:

kill -9 $(lsof -t -i:portnumber)

例:ポート4200で実行中のプロセスを強制終了するには、次のコマンドを実行します

kill -9 $(lsof -t -i:4200)

Ubuntuでテスト済み。

0
Debashish Sen