Iori's Blog

Rustの勉強として作っていた使用ポートの確認、解放プログラムがここにきて活きてきた

Published on: Wed Apr 22 2026 00:00:00 GMT+0000 (Coordinated Universal Time)

はじめに

授業でHashiCorpのBoundaryというサービスを使い、外部のサーバにSSHで接続するという課題が出ました。

授業スライドではBoundaryのGUI版(Desktop版)を使う前提で説明されていたけども、CUI版も用意されているならそちらを使いたい。 理由はシンプルで、ターミナルで完結するほうがかっこいいから!

というわけでCUI版を選んだのだけども、ここで1つ問題が発生した。

BoundaryのCUI版で困ったこと

BoundaryをCUIで起動すると、接続中はそのターミナルがセッションに占有されるタイプ。 そして、接続を切断する正しい方法がよく分からない。

仕方なくCtrl+Zでプロセスをサスペンドして抜けているのだけど、これだとプロセス自体は裏で生き残ったままになってしまい、 結果としてポートが解放されず、次に接続しようとしたときに「ポートが使用中です」とエラーになってしまう。

毎回lsofでポートを使っているプロセスを探して、killで手動終了する……という手順を踏めば解決はできるが、 いちいちコマンドを打つのは面倒だし、PIDを間違えて別のプロセスを落としてしまうリスクもある。

ちなみに、調べてみるとBoundary側にも接続中セッションの一覧を表示するコマンドがありそうだった。 そこからセッションを切断するのが正攻法だと思う。 ただ、今回はポートの解放という汎用的な問題として捉えて、別のアプローチを取ることにした。

自作ツール「pwatch」の出番

実は少し前に、Rustの勉強を兼ねて使用中のポートをTUIで一覧表示し、選択したプロセスをそのまま終了できるターミナルアプリを作っていた。 ちなみにこれをこのブログで紹介したくて記事を書いたけど、なんかまとまらなくてめんどくさくなって3月は全く記事を更新しなかった。

それがこのpwatch

tomatotamada/pwatch
0

pwatchを使うと、以下のような作業をTUI上で直感的に行える。

つまり、lsof -i :ポート番号でプロセスを調べて、kill PIDで終了するという一連の手順を、pwatchひとつで完結させることができる。

今回のBoundaryのケースでは、Ctrl+Zで抜けた後にpwatchを開いて、Boundaryが掴んでいるポートのプロセスを選択して終了するだけで済んだ。

終わりに

pwatchはRustで書かれているので、Rustのコンパイラ(cargo)さえあればビルドできる。Windows・Linux・macOSのいずれでも動作する。

ポート管理で困った経験がある方は、ぜひ試してみてほしい。

あとこれは完全に余談なんだけど、授業スライドではBoundaryでVPNに接続みたいに書かれてたけどどうやらゼロトラストの接続方式でVPNとは違うらしい。 知らんけど。

ではまた!

Tags:

programming

Rust