前のコマンドで指定された特定のPIDを終了するコマンド

前のコマンドで指定された特定のPIDを終了するコマンド

時にはプロセスを終了する必要があります(理由はそれほど重要ではありません)。私は以下を使用してプロセスを見つけることができることを知っています。lsof -i :8080私の候補者になります。最後のステップ出力テーブルから。

たとえば、このコマンドを実行すると、次の出力が表示されます。

COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
java    15112 dani   70u  IPv4 3178183      0t0  TCP localhost:39998->localhost:http-alt (CLOSE_WAIT)
java    15112 dani  137u  IPv4 3181607      0t0  TCP localhost:39999->localhost:http-alt (CLOSE_WAIT)
java    15112 dani  138u  IPv4 3181608      0t0  TCP localhost:40000->localhost:http-alt (CLOSE_WAIT)
java    15112 dani  139u  IPv4 3181609      0t0  TCP localhost:40001->localhost:http-alt (CLOSE_WAIT)
java    15112 dani  140u  IPv4 3181610      0t0  TCP localhost:40002->localhost:http-alt (CLOSE_WAIT)
java    19509 dani   50u  IPv6 4617361      0t0  TCP *:http-alt (LISTEN)
java    19509 dani   52u  IPv6 6642445      0t0  TCP localhost:http-alt->localhost:42996 (CLOSE_WAIT)

だから私の目標はPID 19509。パイプを使用して最後の行のPIDをどのように選択しますか?

私はこのようなコマンドを取得したいlsof -i :8080 | something here to get the PID | kill -9

私はLinux Mint KDE x64を実行しています。

答え1

あなたの質問に文字通り答えると、最後に表示されたPIDを一覧表示する1つの方法がありますlsof

lsof … | awk 'END {print $2}'

アッ入力を読み込み、1行ずつ処理するテキスト処理言語です。コードでは、END {…}入力全体が処理された後、中括弧内のコードが実行され、最後の行で有効な操作が実行されます。$2行内のスペースで区切られた2番目のフィールド。

これを終了するいくつかの方法は次のとおりです(各行は独立して機能します)。

kill $(lsof … | awk 'END {print $2}')
lsof … | awk 'END {print $2}' | xargs kill
lsof … | awk 'END {system("kill " $2)}'

しかし、私は正しいプロセスを終了することが常に最後のプロセスであるというあなたの声明に問題があります。lsofPIDを増やしてプロセスを表示することは意味がありません。プロセスIDが順番に割り当てられているシステム(すべてのUnixバリアントではなく、すべてのLinuxインストールではない)でも、最大値(通常32767)に達するとラップされます。したがって、PIDを比較してプロセスを決定することは意味がありません。

どのプロセスを終了するかを決定するには、いくつかの追加情報が必要です。必要な情報の種類と出力に「奇妙な」文字(ファイル名やプログラム名のスペースなど)が含まれているかどうかに応じて、awkなどのツールを使用して出力を処理したり、次に生成される出力をlsof使用したりできます。この-Fオプションは、lsof単純な場合に解析するのが少し難しいですが、(ほとんど)あいまいさが少なく、強力に解析する方が簡単です。たとえば、ポート8080でリッスンしているプロセスを終了するには、次のようにします。

lsof -n -i :8080 -F | awk '
    sub(/^p/,"") {pid = $0}
    $0 == "n*:http-alt" {print pid}
' | xargs kill

この関数を呼び出すと、行subの先頭が空の文字列に置き換えられます。pこの置換が実行されると、{pid = $0}コードブロックが実行され、表示さpidれた最後のPID値が含まれますlsofpid2 番目の awk 行は、その行が発生した場合に変数値を出力します。"n*:http-alt"これは、lsofがすべてのインターフェイスのポート8080でリッスンしているソケットを報告する方法です。

この特定の標準は実際には構文解析を必要としません(上記では例としてのみ示されています)。lsof指定されたポートでリッスンしているプロセスのみを表示させることができます。

lsof -n -a -iTCP:8080 -sTCP:LISTEN -Fp | sed 's/^p//' | xargs kill

または、これには次のものを使用できます。netstat代わりに。

netstat -lnpt | awk '$4 ~ /:8080$/ {sub(/\/.*/, "", $7); print $7}'

awkコード説明:列4が終わると、:8080列7の最初の列の後のすべての内容を置き換えて/(プロセス名部分を削除し、PID部分のみを保持)印刷します。

関連情報