プロセスが実行されている因果関係を調べるwitrを使ってみる

はじめに

システム上で実行されているプロセスやサービスが「なぜ動いているのか」を調べたいことがある。
pstoplsofなどのコマンドで「何が」動いているかは分かるが、「なぜ」動いているのかという因果関係を把握するのは難しい。

witr(Why is this running?)は、プロセスがどのように起動されたのか、何が起動させているのかを可視化してくれるツールである。
https://github.com/pranshuparmar/witr

今回はこれを使ってみたので、インストールと実際の使い方を備忘録としてまとめておく。

環境

Windows 11 Professional
WSL2 Ubuntu 24.04 LTS

インストール

スクリプトインストールを使う。

curl -fsSL https://raw.githubusercontent.com/pranshuparmar/witr/main/install.sh | bash
ログ
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 4412k  100 4412k    0     0  8935k      0 --:--:-- --:--:-- --:--:-- 81.7M
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100  1764  100  1764    0     0   4075      0 --:--:-- --:--:-- --:--:--  4075
witr installed successfully to /usr/local/bin/witr (version: v0.2.6, os: linux, arch: amd64)
Man page installed to /usr/local/share/man/man1/witr.1

witrを使う

基本的な使い方

プロセス名を指定して実行する。

witr nginx

次のような情報が表示される。

  • プロセスの詳細(PID、ユーザー、コマンド、起動時刻)
  • プロセスの起動経路(親プロセスのツリー)
  • プロセスの起動元(systemd、docker、pm2など)
  • 作業ディレクトリやGitリポジトリ情報
  • リスニングポート情報

PIDを指定して調べる

witr --pid 1234

特定のPIDのプロセスについて詳細を表示する。

ポート番号から調べる

witr --port 8080

指定したポートでリスニングしているプロセスを調べる。

ツリー形式で表示

witr --pid 1234 --tree

プロセスの親子関係をツリー形式で表示する。

systemd (pid 1)
  └─ init-systemd(Ub (pid 2)
    └─ SessionLeader (pid 12345)
      └─ bash (pid 12346)
        └─ node (pid 1234)
          ├─ node (pid 1235)
          └─ node (pid 1236)

オプション

オプション説明
-p, –pid指定したPIDのプロセスを調べる
-o, –port指定したポートでリスニングしているプロセスを調べる
-s, –shortプロセスの起動経路のみを表示
-t, –treeプロセスツリー形式で表示
–env環境変数を表示
–exact完全一致検索を使用
–jsonJSON形式で出力
–no-colorカラー出力を無効化
–verbose詳細情報(メモリ、I/O、ファイルディスクリプタ)表示
–warnings警告のみ表示

witrが出力する情報

  1. 何が実行されているのか?
  2. どのように起動されたのか?
  3. 何がプロセスを維持しているのか?
  4. プロセスはどのコンテキストに属しているのか?

検出できる起動元

  • systemd (Linux)
  • launchd (macOS)
  • Dockerコンテナ
  • Kubernetes
  • PM2
  • cron
  • 対話型シェル

参考

おわりに

witrは、プロセスの起動要因等を調べるための便利なツールと感じた。

基本的に複数のコマンド(pspstreesystemctldocker psなど)を組み合わせて手動で調べる必要があったが、witrは一発で因果関係を可視化してくれる。

特にトラブルシューティングやデバッグ時に、予期しないプロセスが実行されている理由を把握できる点でよさそうだと思った。
サーバ作業ではいろいろな事情でインストールできないかもしれないが、ローカル環境での調査には役立ちそうだ。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。