Python×Textualで作る究極のTUIシステムモニター「systop」を公開しました

システムリソースをリアルタイムかつ詳細に監視できるTUI(ターミナルユーザーインターフェース)ツール「systop」を公開しました。PythonのTextualとpsutilを活用し、CPUのコア別使用率やメモリの内訳、I/O速度などを美しく可視化。重い処理を非同期で行うため、UIの描画がブロックされず常に滑らかに動作するのが特徴です。Nix環境ならコマンド一発で起動可能。ターミナルを彩る究極の監視ツールをぜひお試しください!

普段の開発やサーバー運用で、システムリソースの監視に何を使っていますか? tophtop、あるいは btop など優れたツールはたくさんありますが、「Pythonで自分好みにハックできて、かつ極限まで詳細な情報を表示できるモニターが欲しい」と思い、新しく「systop」というTUI(ターミナルユーザーインターフェース)ツールを開発・公開しました。

この記事では、systopの具体的な機能と、PythonでリッチなTUIアプリを作る裏側の技術について紹介します。

systop

🚀 systopとは?何ができるのか?

systopは、PythonのTUIフレームワークである「Textual」と、システム情報取得ライブラリの「psutil」を組み合わせて作ったシステムモニターです。

最大のテーマは「UIの美しさを保ちながら、システムメトリクスの解像度を極限まで高めること」です。具体的に以下の3つのペインで構成されています。

1. CPUの詳細な挙動を丸裸にする「CPUペイン」

単に全体のCPU使用率を出すだけでなく、以下の情報をリアルタイムに描画します。

  • 全体のトレンド: 最大50件の履歴を保持するSparkline(波形グラフ)。
  • コアごとの使用率: 論理コアすべての使用率をコンパクトなテキストバー(例: [||| ] 30%)で一覧表示。
  • 周波数と負荷: 現在のクロック周波数(MHz)と、最小・最大周波数。
  • OSレベルの指標: ロードアベレージ(1分, 5分, 15分)に加え、コンテキストスイッチ数やソフト割り込み回数まで取得。

2. メモリの内訳とI/O速度を追う「Memory & I/Oペイン」

システムが遅いとき、原因がメモリなのかディスクなのかネットワークなのかを即座に切り分けられます。

  • メモリとスワップの詳細: 単なる「使用量」ではなく、Available, Buffers, Cached, Active, Inactiveといった内訳まで可視化。スワップイン・アウトの累積量も表示します。
  • リアルタイムI/Oモニター: 前回取得時からの差分を計算し、ディスクのRead/Write速度(バイト/秒)ネットワークの送受信速度(Tx/Rx)をリアルタイムで算出・表示します。

3. 動的にソート可能な「プロセスペイン」

システムを重くしている原因を特定するための強力なテーブル機能です。

  • 豊富なカラム: PID, ユーザー名, CPU%, メモリ%, スレッド数, Nice値, ステータス(Run/Sleep等), 起動時間, コマンドライン(引数含む)を一覧表示。
  • インタラクティブなソート: キーボードの s キーを押すだけで、CPU使用率 → メモリ使用率 → スレッド数 → PID の順番でリアルタイムにソート順を切り替えることができます。

🛠️ 技術的なハイライト:絶対にフリーズしないアーキテクチャ

これだけ大量のデータ(とくに process_iter による全プロセスの走査やI/Oの差分計算)を毎秒更新すると、通常のPythonスクリプトではUIの描画スレッドがブロックされ、画面がカクついたり操作を受け付けなくなったりします。

systopでは、Textualの @work(thread=True) デコレータを採用しています。 重いシステムコールの実行とデータ計算をすべてバックグラウンドのワーカースレッドに逃がし、計算が終わったデータだけをメインスレッドに渡してUIを更新(call_from_thread)する設計にしました。これにより、どれだけ負荷がかかってもターミナル上の操作感は常に滑らか(60FPS)に保たれます。また、OSの権限エラー(AccessDeniedなど)も徹底的にハンドリングし、突然クラッシュしない堅牢性を持たせています。

💻 試し方

Nix環境をお持ちであれば、リポジトリに含まれる shell.nix を使って一瞬で環境を構築できます。

Bash

git clone https://github.com/yourusername/systop.git
cd systop
nix-shell
python systop.py

もちろん、標準のPython環境(3.8以上)でも pip install textual psutil だけで動きます。Vimライクなキーバインド(qで終了、dでダーク/ライトモード切替)にも対応しています。

おわりに

Pythonでここまできれいで実用的なTUIが作れる時代になりました。システム管理の新しいお供として、あるいはTextualを使った非同期アプリの参考コードとして、ぜひGitHubリポジトリを覗いてみてください!

GitHubリポジトリ : https://github.com/forestnote/systop

内容の過不足や、さらに強調したい機能があれば、いつでもお知らせください。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です