38 ポイント 投稿者 GN⁺ 2025-12-27 | 1件のコメント | WhatsAppで共有
  • Witr (why-is-this-running) は、Linuxシステムで特定の プロセス、サービス、またはポートがなぜ実行中なのか を明確に示すツール
  • 既存の pstoplsof などが単に「何が実行中か」だけを示すのに対し、「なぜ実行中なのか」という因果関係 を1画面で表示
  • PIDベースの分析 により、プロセスの起源、実行経路、維持されている理由、所属コンテキストを追跡
  • systemd、docker、pm2、cron、shell などさまざまなソースと連携して実行理由を説明し、読み取り専用・非破壊的 に動作
  • デバッグや障害対応時に 理解に要する時間を短縮 し、複雑なシステムの実行構造をひと目で把握できるツール

目的とコンセプト

  • Witr の中心となる問いは「なぜこれが実行中なのか? (why-is-this-running)」
    • プロセス、サービス、ポートなど実行中のあらゆる項目の 起源と原因 を追跡
    • 複数の層(supervisor、container、service、shell など)にまたがる 間接的な実行原因 を明示的に示す
  • 既存ツールが状態やメタデータだけを提供するのに対し、Witrは因果関係を明確に表現
  • 結果として「何が、どのように、なぜ、どのような文脈で実行中なのか」を 人が読みやすい形で出力

主な目標

  • プロセスが存在する理由 を説明し、単なる実行有無以上の情報を提供
  • デバッグおよび障害対応時間の短縮
  • 設定不要ですぐに利用可能読み取り専用で安全性を確保
  • 完全性より明確さ を優先
  • モニタリング、性能分析、自動復旧機能は含まない

動作原理

  • すべての対象を プロセス (PID) を中心に解釈
    • ポート、サービス、コンテナ、コマンドはすべてPIDに接続
    • PIDを基準に 実行の因果チェーン (causal chain) を構成
  • 核となる4つの問い
    1. 何が実行中か
    2. どのように開始されたか
    3. 何がそれを維持しているか
    4. どのコンテキストに属しているか

対応対象

  • プロセス/サービス名PIDポート番号 を入力対象としてサポート
    • 名前を入力した際に複数プロセスが一致した場合はPIDの選択を求める
    • --pid--port オプションで特定プロセスまたはポートベースの分析が可能

出力構造

  • Target: ユーザーが指定した対象
  • Process: 実行ファイル、PID、ユーザー、コマンド、開始時刻、再起動回数
  • Why It Exists: プロセスの 因果的系譜 (ancestry chain)
  • Source: 実行を担った主要システム(例: systemd、docker、pm2、cron、shell のいずれか)
  • Context: 作業ディレクトリ、Gitリポジトリ、Dockerコンテナ、バインド情報など
  • Warnings: root権限での実行、公開インターフェースでのリスニング、長時間実行、メモリ過剰使用などの非ブロッキング警告

コマンドラインオプション

  • --pid--port: 特定のPIDまたはポートを分析
  • --short: 1行要約
  • --tree: 完全なプロセスツリーを表示
  • --json: JSON形式で出力
  • --warnings: 警告のみ表示
  • --no-color: 色を無効化
  • --env: 環境変数のみ表示
  • --help: ヘルプを表示

インストールと削除

  • 単一の静的Linuxバイナリ 形式で配布
  • スクリプトによるインストール(推奨)
  • 手動インストール
    • amd64arm64 向けバイナリを直接ダウンロードし、チェックサムを検証
    • 実行権限を付与した後、PATH上に移動
  • 検証と削除
    • witr --versionman witr で確認
    • sudo rm -f /usr/local/bin/witr で削除可能
  • Nix Flake対応: nix run github:pranshuparmar/witr -- --port 5000 で実行可能

プラットフォームと権限

  • Linux専用
  • /proc へのアクセスを通じて情報を収集
    • 一部プロセス情報の確認には sudo権限が必要

1件のコメント

 
GN⁺ 2025-12-27
Hacker Newsのコメント
  • READMEのGIFループが速すぎて再開し、出力内容を読み切るのが難しいという指摘
    もう数秒ほど止まっていてほしい

    • 正直、GIFよりスクリーンショットのほうが良いと思う
      最後のフレームを見るだけで必要な情報はすべて伝わる
    • フィードバックありがとう! 最初は問題ないように見えたけれど、ユーザー目線で見るとかなり不便だった
      すでに静的画像に置き換えてあり、提案してくれた意見にはすべて感謝している
    • 私もGIFは特に必要ないと思う
      コマンドが速いことは示せるが、最後のフレームにすでに全部入っているし、帯域効率も悪い
    • 実際、最も簡単な解決策はアニメーションを完全になくすこと
      出力画面を100%のところで止めておけばよい。ターミナルで入力している様子はみんなすでに知っている
    • こうしたGIFを自動で作るには、charmbracelet/vhs のようなユーティリティがとても便利
  • このツールは既存の監視/観測ツールを置き換えることを目的にしているわけではない
    SSHで接続したときに「これはなぜ動いているんだ?」を素早く把握するためのもの
    フィードバックに応じて方向性を調整する意思はある

    • 本当に賢いアイデアだと思う
      あるプロセスが大量にリソースを使い始めたとき、その目的を突き止めるのはいつも難しかった
      最初はプロセスの機能まで説明してくれるのかと思ったが、そうではなかった
      それでも素晴らしいツールだ。将来的にはmanページ + プロセスDBを組み合わせて拡張可能にしてもよさそう
  • 便利そうだが、現状の出力はほとんどppidしか見せていないので、「誰が起動したか」は分かっても「なぜ起動されたか」は分かりにくい
    複数の出力形式をサポートしているのは良い。自動化環境を考えると、JSONやgrepしやすい形式をデフォルトにするとさらに良さそう

    • フィードバックありがとう! 「誰が」と「なぜ」をもっと明確に分けて見せる方向を検討中だ
      デフォルト出力は人間が読みやすいよう設計しているが、JSONフラグですでに自動化もサポートしている
      もっとgrepしやすい形についても考えてみる
  • 興味深いツールだが、curlバイナリをインストールするのは気が進まない
    後になって「これはどうやってインストールされたんだ?」「セキュリティパッチは最新か?」といった問題が出てくるかもしれない
    debパッケージやsnapがあるとよい

    • curlインストールが全員に合うわけではないことは理解している
      初回リリースなのでシンプルに始めたが、人気が出れば公式パッケージ配布を計画している
    • そのうち新しいユーティリティコマンドが出てきそうだ — wdtci: “what does this curl install?”
    • 参考までに、systemctl status $pid コマンドでも多くの情報を得られる
  • witrは信頼に基づいている」という文と、「AI/LLMの助けを借りて開発された」という説明が矛盾しているように感じる

    • 「たまに何をしているか分かっている人間が監督した」という文は冗談のようにも見えるが、真面目に読むと不安になる
      LLMの結果を確認し、コードレビューをきちんと行っているなら信頼できそうだ
      それでもLLMの使用を透明に開示している点は評価したい
    • その通り、その文はユーモアとして書いたもので、LLMは補助的な役割にすぎない
      実際の判断は人間が下した
    • 私としては、コードがきちんと動けばそれで十分だ
      結果重視で開発したなら問題ないと思う
    • ただし、マルウェアがプロセス関係を偽装するのは依然として簡単だ
    • 正直、LLMのほうが人間より状況をよく理解できる場合もあると思う
  • 本当に素晴らしくて役に立つツールだ
    ただ、本番環境では上で挙げられた理由からすぐに使うのは難しい
    DebianやRPMパッケージがあるとよい

    • ありがとう! 初回リリースなのでシンプルに始めたが、人気が出れば正式なパッケージを用意する予定だ
  • ソースから直接ビルドするには次のコマンドを使えばよい

    CGO_ENABLED=0 go build -ldflags "-X main.version=dev -X main.commit=$(git rev-parse --short HEAD) -X 'main.buildDate=$(date +%Y-%m-%d)'" -o witr ./cmd/witr
    

    個人的には、install.sh があるならローカルソース優先のインストールを期待する
    こうしたシンプルなツールこそ、ターミナルに居続けたくなる理由だ

    • ありがとう! @sestep のおかげで、すでにNixサポートが追加されており、バイナリの心配はない
    • あるいは単に Nix PR を使ってもよい
  • “Git repository name and branch” が何を意味するのか気になる
    実行中のプロセスがGitリポジトリ内で実行されたかを検出する機能なのか?

    • その通り、プロセスの作業ディレクトリから上へたどって**.gitディレクトリ**を探す方式だ
      関連コードへのリンク
  • アイデアが素晴らしい。以前私が作った**“whodis” alias**はポートを開いているPIDを探す用途だったが、これはずっと強力だ

    • ありがとう! PID情報のスイスアーミーナイフを目指している
  • 本当に驚くようなツールだ。共有してくれてありがとう
    もし私がAURパッケージを作っても大丈夫だろうか?

    • もちろん! AUR登録なんて素晴らしい。本当にありがとう
    • 私は作者ではないが、AUR版ができたら本当にうれしい
      Archの強みは、こういう面白いツールがものすごく速くAURに上がること