タイトルにあるように、私は複数のゲームサーバーを実行しています。それらはすべて同じname
を持っていますが、異なるPID
とport
番号を持っています。特定のポートでリッスンしているサーバーのPID
と一致させたいので、このプロセスを強制終了したいと思います。 bashスクリプトを完了するために必要です。
それも可能ですか?まだウェブ上で解決策を見つけられなかったからです。
netstat
の-p
フラグは、プロセスのPIDを提供します。
netstat -l -p
編集: FreeBSDでソケットユーザーのPIDを取得するために必要なコマンドはsockstat
です。 @Cycloneとの議論の中で解決したように、仕事をする行は次のとおりです。
sockstat -4 -l | grep :80 | awk '{print $3}' | head -1
Killコマンドに渡すことができる短いバージョン:
lsof -i:80 -t
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
netstat -nlp
は、どのポートでリッスンしているかのPIDを通知する必要があります。
プログラムで-Bashのみを使用して-特定のポートでリッスンしているプロセスを強制終了しました。
ポートが8089であるとします。次に、私がどのようにそれをしたかを示します。
badPid=$(netstat --listening --program --numeric --tcp | grep "::8089" | awk '{print $7}' | awk -F/ '{print $1}' | head -1)
kill -9 $badPid
これが他の誰かに役立つことを願っています!私のチームの助けになることはわかっています。
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""
windowsでは、pidを取得するためのnetstatオプションは-oであり、-pはプロトコルフィルターを選択します。例:netstat -a -p tcp -o
構文:
kill -9 $(lsof -t -i:portnumber)
例:ポート4200で実行中のプロセスを強制終了するには、次のコマンドを実行します
kill -9 $(lsof -t -i:4200)
Ubuntuでテスト済み。