やりたいこと
ポートフォワーディングなどをバックグラウンドで実行した際に、開放したポートを閉じる。
通常だと、「ポート開放で使っているプロセス番号を調べる」→「該当プロセスをkillする」の手順を踏むと思われるが、実行コマンドが複数だったり、プロセス番号を一時的に覚えておく必要があったりして不便なので、諸々の処理をパイプラインで結合したワンライナーのコマンドとして実現したい
コマンド
環境: mac OSX 12, zsh
lsof -i:閉じたいポート番号 | tail -n +2 | sed -E "s/[ ]+/\t/g" | cut -f2 | uniq | xargs kill -9
個別のコマンド解説
| コマンド | 役割 |
|---|---|
| lsof -i:port | 対象ポートの情報(PIDを含む)を取得する |
| tail -n +2 | lsof -i のヘッダを消す |
| sed -E "s/[ ]+/\t/g" | 連続空白をcutしやすい区切り文字(TAB)にする |
| cut -f2 | PIDの列のみ取得する |
| uniq | PIDの重複をなくす |
| xargs kill -9 | ↑までで取得したPIDのプロセスを停止する |
追記
コメントでよりシンプルな方法を教えていただきました。行ごとに処理をするawkを使って、PIDの抽出を行っています
lsof -i:閉じたいポート番号 | awk 'NR>1{print $2}' | uniq | xargs kill -9