RetainProcess のアイコン(ルーン文字 ᚱᛈ) macOS Menu Bar Utility

開発のコマンド群を、
メニューバーから。

ollama serve、npm run dev、docker compose up—— 毎朝ターミナルのタブで立ち上げているものを構成として登録し、ワンクリックで起動・停止。 CPU・メモリとログはその場で確認でき、ログは自動で保存・退避されます。

macOS 13 以降 · Apple Silicon / Intel · Developer ID 署名・Apple の公証済み

Why

「あれ、まだ動いてたっけ?」をなくす

コンセプトは「アクティビティモニタ」+「IntelliJ の Run Configuration」。常駐するコマンドの面倒を、メニューバーの 1 か所で見ます。

ターミナルのタブが増え続ける

サーバー、ワーカー、トンネル、ローカル LLM。どのタブで何が動いているか、閉じてよいのか分からなくなる。

止めたつもりが残っている

Ctrl-C で親だけ終わり、子プロセスがポートを握ったまま。次の起動で「address already in use」。

ログが流れて消える

エラーはスクロールの彼方。ファイルに残しても、ローテーションと退避まで面倒を見るのは手間。

Features

起動・停止・監視・ログを、ひとつのポップアップで

メニューバーのアイコンをクリックすると、構成の一覧と選んだものの状態が開きます。ウィンドウの外をクリックすれば閉じます。

▶

ワンクリックで Run / Stop

実行ファイル・引数・作業ディレクトリ・環境変数・.env を構成として保存。PATH はログインシェルの環境で解決するので、ターミナルと同じように動きます。

■

子プロセスまでまとめて止める

停止はプロセスグループ単位。SIGTERM を送り、猶予を過ぎても残れば SIGKILL。孫プロセスの取り残しを防ぎます。

%

CPU・メモリのグラフ

グループ全体の合算を 1 / 10 / 60 分の窓で。内訳の表でどのプロセスが重いかも分かります。

≡

ログの表示・検索・保存

stdout / stderr を色付きで表示し、正規表現で絞り込み。ファイルはサイズで世代交代し、あふれた分は Google Drive などの同期フォルダへ自動で退避。ファイル全体はターミナルの less で(使い方)。

↺

アプリを終了しても動き続ける

子の出力は小さな中継プロセスが受けるので、RetainProcess を終了・再起動しても止まりません。次の起動でつなぎ直し、ログも続きから。

:80

待ち受けポートを表示

そのプロセスが開いているポートを自動で表示し、クリックでブラウザを開きます。どのポートで動いているかを探す手間がありません。

!

落ちたら知らせる・起動し直す

異常終了はメニューバーのバッジと通知で。構成ごとに「失敗時だけ」「常に」の自動再起動も選べます(間隔は指数的に延びます)。

⌘

既に動いているものを引き取る

構成と一致するプロセスが別の経路で動いていれば、そのまま引き取って監視・停止の対象にします。

◐

ワークスペースで切り替え

案件ごとに構成をまとめて表示を絞り込み。構成は JSON で書き出し・取り込みでき、チームで共有できます。

Stacks & CLI

compose の書き方で、ローカルのサービス群を

Docker を使わないローカルのプロセスにも、依存の順序とヘルスチェックを。

retainprocess.yml でスタックを定義

docker compose の部分集合をそのまま読みます。retain-process up で、依存の順に起動します。

  • depends_on の service_healthy は、ポートの待ち受けや HTTP の 2xx を待ってから次へ
  • down は依存の逆順に停止
  • restart: on-failure で落ちたサービスを起動し直す
  • ファイルが正。リポジトリにコミットしてチームで共有できます
name: shop
services:
  db:
    command: postgres -D ./data
    healthcheck:
      port: 5432
  api:
    command: npm run dev
    working_dir: ./api
    depends_on:
      db:
        condition: service_healthy
    restart: on-failure
  web:
    command: npx vite --port 5173
    working_dir: ./web
    depends_on: [api]

ターミナルや Raycast からも操作

同梱の retain-process コマンドで、起動中のアプリを操作します。スクリプトや Raycast の Script Command から呼べます。

  • list / status / run / stop / restart
  • logs <構成> -n 200、path で tail -F と組み合わせ
  • --json で機械可読な出力
$ cd ~/src/shop && retain-process up
starting shop (see: retain-process ps shop)
$ retain-process ps shop
shop (/Users/you/src/shop/retainprocess.yml)
db               Running · healthy · PID 48190 · ports 5432
api              Running · healthy · PID 48213 · ports 8080
web              Running · PID 48240 · ports 5173
$ retain-process logs shop/api -n 200
$ tail -F "$(retain-process path Ollama)"
Lightweight

常駐しても、Mac に負荷をかけない

Rust 製。ポップアップを閉じている間は描画を止め、必要な監視だけが動きます。

0.0%非表示・構成 0 件の CPU
0.3%非表示・3 件実行中の CPU
40 MB非表示時のメモリ
0.2 秒起動からメニューバーに出るまで
アクティビティモニタのメモリのタブ。RetainProcess のメモリは 39.7 MB
アクティビティモニタでの RetainProcess(メニューバーに常駐中)

Apple Silicon の Mac での開発時の計測値(60 秒平均。メモリは phys footprint)。環境によって異なります。

Privacy

手元で完結する

ネットワーク通信をしない

更新確認・テレメトリ・クラッシュ送信を含め、RetainProcess 自身は一切通信しません。CLI の操作もローカルのソケットだけです。

特権を求めない

管理者権限は不要。動かすコマンドはあなたのユーザー権限で動きます。設定とログは 0600 で保存します。

ログには秘密が混ざりうる

トークンを標準出力に出すツールは珍しくありません。退避先を同期フォルダにする場合は、その点を踏まえて選んでください。

App Store では配布していません

任意のコマンドの起動やプロセスグループの制御は App Sandbox の中ではできないため、Developer ID 署名と Apple の公証を受けて直接配布しています。

Download

無料でダウンロード

最新版は 1.0.1(2026-10-13)。Homebrew か DMG のどちらかで入れてください。

Homebrew(おすすめ)

foo-tec の tap を追加し、その Cask を信頼してから入れます。アプリと retain-process コマンドがまとめて入り、更新も brew で行えます。

$ brew tap foo-tec/tap
$ brew trust --cask foo-tec/tap/retain-process
$ brew install --cask retain-process

brew trust は Homebrew 7 から必要です。公式以外の tap の Cask は、信頼するまで読み込まれません(「Refusing to load cask … from untrusted tap」と出て止まります)。信頼は ~/.homebrew/trust.json に残るので、1 回で済みます。Homebrew 7 より前の版には brew trust が無く、この行は不要です。

DMG

ダウンロードして開き、RetainProcess を「アプリケーション」フォルダへドラッグします。

RetainProcess 1.0.1 (.dmg)

対応: macOS 13 Ventura 以降 · Apple Silicon / Intel(ユニバーサル) · 無料 · 1.0.1 のリリースノート(英語)

Getting Started

はじめかた

インストールから、最初のコマンドを動かすまで。

  1. RetainProcess を起動する

    「アプリケーション」フォルダから開きます(Homebrew なら open -a RetainProcess でも)。Dock には出ず、メニューバーに丸いアイコンが出ます(輪は停止中、塗りつぶしは実行中、中に点があれば異常終了したものがあります)。Apple の公証を受けているので、そのまま開けます。

  2. ログイン時に起動するか選ぶ

    初回だけポップアップが自動で開き、「Launch RetainProcess at login?」と尋ねます。あとからでも、アイコンの右クリックメニューの Launch at Login で切り替えられます。

  3. 構成を追加する

    例として Ollama(ollama serve)の構成が 1 件入っています。自分のコマンドは左上の + で追加し、Configuration タブで次を入れます。入力は自動で保存されます。

    • Executable — 実行ファイル(例 npm。PATH はログインシェルの環境で探します)
    • Arguments — 引数(例 run dev。シェルは通しません。パイプなどが要るなら Executable を /bin/zsh、Arguments を -lc '…' に)
    • Working Dir — 作業ディレクトリ(空ならホーム)
    • Environment — 環境変数を 1 行に 1 つ KEY=VALUE
  4. Run する

    ▶ Run で起動します。CPU・メモリは Monitor タブ、出力は Logs タブで(ファイル全体は Open in Terminal で less に。ターミナルでログを読む)。止めるときは ■ Stop(子プロセスまでまとめて止まります)。右クリックメニューからも Run / Stop できます。

  5. (任意)ログの退避先を決める

    右クリックメニューの Log Archive Home… で、Google Drive などの同期フォルダを選ぶと、世代からあふれたログがそこへ移ります。選ばなければあふれた分は削除されます。ログは ~/Library/Logs/RetainProcess/ に保存されます。

AI に構成を書いてもらう

ChatGPT や Claude などに渡すためのガイドを用意しました。動かしたいコマンドを伝えれば、取り込み用の JSON や retainprocess.yml を書いてもらえます。IntelliJ・VS Code・Cursor などのプロジェクトのフォルダを指定すれば、そこにある起動構成から構成を作ってもらうこともできます。

AI 向けガイドを開く →

コマンド一覧

retain-process は起動中のアプリを操作します(アプリが動いていなければ終了コード 2 で「RetainProcess is not running」と返します)。retain-process help で同じ一覧が出ます。

コマンド内容
listすべての構成と状態
status <構成>状態・PID・経過時間、グループ全体の CPU / メモリ、待ち受けポート
run <構成>起動(Run ボタンと同じ条件)
stop <構成>停止(SIGTERM、猶予を過ぎたら SIGKILL)
restart <構成>停止してから起動
show [<構成>]ポップアップを開く(指定した構成を選ぶ)
logs <構成> [-n N]メモリにある直近のログ(既定 100 行、最大 1,000 行)。スタックを指定すると全サービスのログをまとめて
path <構成>ログファイル current.log のパス(tail -F / less / grep に)
up [<スタック>]スタックを依存の順に起動(ヘルスチェックを待つ)。省略すると今のディレクトリの retainprocess.yml を使い、未登録なら登録
down [<スタック>]スタックを依存の逆順に停止
ps [<スタック>]スタックのサービスの状態と準備完了
help使い方

DMG で入れた場合の CLI

Homebrew で入れた場合は設定不要です。DMG の場合は、アプリの中の実行ファイルにリンクを張ります。

$ sudo mkdir -p /usr/local/bin
$ sudo ln -sf /Applications/RetainProcess.app/Contents/MacOS/retain-process \
    /usr/local/bin/retain-process
$ retain-process help

更新する

自動更新はありません(アプリは通信をしないため)。

$ brew update
$ brew upgrade --cask retain-process

DMG の場合は、新しい DMG の RetainProcess で「アプリケーション」フォルダのものを置き換えます。

Uninstall

アンインストール

RetainProcess を終了しても、動かしていたコマンドは止まりません。消す前に止めておいてください。

  1. 動いているコマンドを止める

    ポップアップで構成ごとに ■ Stop、スタックは Down。CLI なら次のとおりです。

    $ retain-process list            # 動いているものを確認
    $ retain-process stop "Web Backend"
    $ retain-process down shop
  2. ログイン項目を外す

    「Launch at Login」をオンにしていたら、右クリックメニューで外します(システム設定 › 一般 › ログイン項目 からも外せます)。

  3. アプリを削除する

    Homebrew の場合 — アプリの終了、アプリとコマンドの削除まで行われます。

    $ brew uninstall --cask retain-process
    # 設定とログも消すなら(~/Library/Application Support/RetainProcess と ~/Library/Logs/RetainProcess)
    $ brew uninstall --zap --cask retain-process
    # 信頼も外す(Homebrew 7 以降)
    $ brew untrust --cask foo-tec/tap/retain-process
    # ほかに foo-tec/tap の Cask を使っていなければ tap も外す
    $ brew untap foo-tec/tap

    DMG の場合 — 右クリックメニューの Quit RetainProcess で終了し、「アプリケーション」フォルダの RetainProcess をゴミ箱へ。CLI のリンクと、設定・ログも消すなら次のとおりです。

    $ sudo rm -f /usr/local/bin/retain-process
    $ rm -rf ~/Library/Application\ Support/RetainProcess ~/Library/Logs/RetainProcess

退避先(Log Archive Home や構成ごとの Archive Dir)に移したログは削除されません。不要なら手で消してください。プロジェクトに置いた retainprocess.yml もそのまま残ります。