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

🚀 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
内容の過不足や、さらに強調したい機能があれば、いつでもお知らせください。