lsof -iで見つかったpidを-9で殺すためにshscriptを書く方法


29

私はTomcatを使用していますが、停止するように指示すると、プロセスが適切に終了しないことがあります。

これを回避する方法もあります:

lsof -i tcp:8080

どの出力:

COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    888 root   35u  IPv6 780659      0t0  TCP *:http-alt (LISTEN)
java    888 root   39r  IPv6 790103      0t0  TCP localhost:58916->localhost:http-alt (CLOSE_WAIT)
java    888 root   40r  IPv6 792585      0t0  TCP localhost:58936->localhost:http-alt (CLOSE_WAIT)
java    888 root   75r  IPv6 785553      0t0  TCP localhost:58701->localhost:http-alt (CLOSE_WAIT)
java    888 root   77r  IPv6 787642      0t0  TCP localhost:58814->localhost:http-alt (CLOSE_WAIT)
java    888 root  130u  IPv6 783894      0t0  TCP localhost:58686->localhost:http-alt (CLOSE_WAIT)
java    888 root  353u  IPv6 780929      0t0  TCP localhost:58632->localhost:http-alt (CLOSE_WAIT)

それから私は走る

kill -9 pid

すべてのPID番号を取得して殺す方法が必要です。事は私がその分野を隔離する方法を知らないことです。


1
あなたはあなたが一つだけ持っている場合はtomcat、プロセスのオープンを、あなたは使用することができますkillall -9 tomcat
ジョセフ・R.

回答:


57

には-t(簡潔な)オプションがあります。これは、lsofまさにあなたが探しているものを行うようです。

$ sudo lsof -ti tcp:80
1387
4538
4539

見る man lsof

-t       specifies  that  lsof should produce terse output with process
         identifiers only and no header - e.g., so that the output  may
         be piped to kill(1).  -t selects the -w option.

必要なアクセス許可があると仮定するとkill、コマンド置換を使用してPIDのリストとして結果を渡すことができます。

kill -9 $(lsof -ti tcp:80)

あなたは今、私が尋ねた両方の質問に答えました
;

3

kill--no-run-if-emptyオプションを忘れないでください:)

lsof -ti :8080 | xargs --no-run-if-empty kill -9

そのように、killはプロセスがリッスンしているときにのみ実行され、自分でチェックする必要はありません。


'--no-run-if-empty'はBSD(mac)ではサポートされていません
dinesh ygv

1

lsof -i tcp:8080出力を生成し| egrep -v "COMMAND PID USER"、ヘッダー行を削除し| awk '{print $2}'、2番目のフィールドを出力| sort -n| uniq、の番号を準備します。これにより、一意の各PIDが1回だけ出力されます。すべてをまとめると次のようになります。

 lsof -i tcp:8080 | egrep -v "COMMAND PID USER" | awk '{print $2}' | sort -n | uniq  

しかし、pkill -KILL tomcatまたはkillall -KILL tomcat簡単です。


Tomcatプロセスは、問題の「tomcat」という名前ではありません。これは単なる通常のJavaプロセスです。他のJavaプロセスが同時に実行されている場合は、正しいプロセスを識別するために余分な作業を行う必要があります。
テリー王

@TerryWang Yup、それも私が抱えていた問題です。Steeldriversの答えは素晴らしいです。
user2757729

0

@waltinatorの1つのライナーは素晴らしいです。

さらにフレーバーを追加します。

lsof -i tcp:8080 | egrep -v "COMMAND PID USER" | awk '{print $2}' | sort -n | uniq | xargs kill -9

または

kill -9 $(lsof -i tcp:8080 | egrep -v "COMMAND PID USER" | awk '{print $2}' | sort -n | uniq)

注:これはまだ非常に基本的なものです。実際の環境でより堅牢にするために、塩と胡pepperを追加する必要がある場合があります。


0

これは、少しエラーチェックを行ったスクリプトです。

#!/bin/bash

PORT=$1

if ! [[ "$PORT" =~ ^[0-9]+$ ]] ;
then
  printf "error: '$PORT' is not a number.\n\nUsage killport <port number>\n"
  exit 1
fi

PID=$(lsof -ti:$PORT)

if ! [[ "$PID" =~ ^[0-9]+$ ]] ;
then
  printf "no proccess found, nothing to kill.\n"
  exit 0
fi

printf "killing process $PID running on $PORT\n"
kill -9 $PID

0

これは単純な魚の殻の関数です

function kill-port
  set pids (lsof -ti tcp:$argv)
  if test $pids
    kill -9 $pids
  else
    echo "No proccesses on that port to kill to see for your self -- lsof -i tcp:$argv"
  end
end

この場所にあるファイルにこの吸盤を刺すだけで、準備完了~/.config/fish/functions/kill-port.fishです。次のように呼び出すことができますkill-port 8000

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.