web-dev-qa-db-ja.com

ポート3000でリッスンしているプロセスを強制終了するシェルスクリプト

kill3000という名前のbashエイリアスを定義して、次のタスクを自動化します。

$ lsof -i:3000

COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
Ruby    13402 zero    4u  IPv4 2847851      0t0  TCP *:3000 (LISTEN)

$ kill -9 13402
73
Jonathan
alias kill3000="fuser -k -n tcp 3000"
106
SamB

これを試して:

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

-tフラグは、必要なものです。PIDのみを表示します。

更新

プロセスが見つからず、エラーメッセージを表示したくない場合:

    kill -9 $(lsof -i:3000 -t) 2> /dev/null

Bashを実行していると仮定します。

更新

Basileの提案は素晴らしいです。まずプロセスを終了しようとするのが普通ですkill -TERM、失敗したらkill -KILL(別名kill -9):

    pid=$(lsof -i:3000 -t); kill -TERM $pid || kill -KILL $pid

これをbash関数にしたい場合があります。

45
Hai Vu

元のlsofコマンドを使用する別のオプション:

lsof -n -i:3000 | grep LISTEN | awk '{ print $2 }' | uniq | xargs kill -9

これをシェルスクリプトで使用する場合は、-rxargsにフラグを立てて、プロセスがリッスンしていない場合を処理します。

... | xargs -r kill -9
10
Niklas B.

fuser -k 3000/tcpも動作するはずです

3
Dmitriusan
fuser -n tcp 3000

の出力を生成します

3000/tcp:     <$pid>

だからあなたができる:

fuser -n tcp 3000 | awk '{ print $2 }' | xargs -r kill
3

どう?

alias kill3000="lsof -i:3000 | grep LISTEN | awk '{print $2}' | xargs kill -9"
3
dgw