web-dev-qa-db-ja.com

PIDではなくTCPポート番号を指定してkillを使用するOnelinerコマンド?

私はよくやる.

Sudo netstat -lpn |grep :8088

出力を表示する

tcp6       0      0 :::8088                 :::*                    LISTEN      11189/Java

その後

Sudo kill -kill 11189

TCPポート番号を変数として使用し、必要な処理を行うパイプラインのエイリアスとして作成できるkillatport 8088のような、より便利なコマンドが欲しいのですが、どうすればPIDを取得できますか出力からそれをkillコマンドにパイプしますか? netstatの出力からPIDを取得するためにawkを使用できるかもしれませんが、入力80が8080と一致しないように、どのように保護し、正確にポートを一致させることができますか?代わりにCプログラムにする必要がありますか?または、このような小さなユーティリティはすでにありますか?

8

fuser はそれを行うことができます:

Sudo fuser -KILL -k -n tcp 8088
10
Florian Diesch

コマンドは次のように定式化できます。

netstat -lpn | grep ":1234\b" | awk '{sub(/\/.*/, "", $NF); print $NF}' | xargs -i kill -kill {}

説明:

  1. netstat -ltpn

    • これは、ポート番号を名前(l)に解決せずに、TCP(t)上のリッスンポート(p)とそのプログラム(n)をリストします。 。
  2. grep ":1234\b"

    • これは:1234に続いて境界(\b)を検索し、Word(またはこの場合は数字)の終わりを示します。これにより、たとえば:12345をキャッチしないようにします。
  3. awk '{sub(/\/.*/, "", $NF); print $NF}'

    • この

      • sub(/regex/,"replacewith", #fieldnumber)を置き換えます
      • この正規表現\/.*
      • 何もない""
      • フィールド$NFでは、最後のフィールド(つまり、PID/programを含むフィールド)を意味します
      • その後、print $NFを出力します。

      正規表現\/.*はリテラル/およびその後のすべてと一致します。その後、それを何も置き換えず、本質的に削除するため、そのフィールドにはPID番号のみが残ります。

  4. xargs -i kill -kill {}

    • xargs -iは、前のコマンドの出力を別のコマンドへの入力として機能させることができるプログラムです。コマンドはkill -kill {}です。{}は、「パイプラインの前のコマンドからの出力」を示します。これはPID番号です。

注:このコマンド全体は、危険なものを誤って削除してしまう可能性があるため、少し危険です。それはもう少し消毒で使用できます。使用するときに正しいポート番号を取得するようにしてください。

これを関数にしたい場合、以下を~/.bashrcに追加できます:

killatport(){
    netstat -lpn | grep ":$1\b" | awk '{sub(/\/.*/, "", $NF); print $NF}' | xargs -i kill -kill {}
}

source ~/.bashrcを使用して、変更を保存して適用します。これで、次のような関数を使用できます。

killatport 8088
2
Alaa Ali