時にはプロセスを終了する必要があります(理由はそれほど重要ではありません)。私は以下を使用してプロセスを見つけることができることを知っています。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)}'
しかし、私は正しいプロセスを終了することが常に最後のプロセスであるというあなたの声明に問題があります。lsof
PIDを増やしてプロセスを表示することは意味がありません。プロセス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値が含まれますlsof
。pid
2 番目の 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部分のみを保持)印刷します。