ollama serve、npm run dev、docker compose up——
毎朝ターミナルのタブで立ち上げているものを構成として登録し、ワンクリックで起動・停止。
CPU・メモリとログはその場で確認でき、ログは自動で保存・退避されます。
macOS 13 以降 · Apple Silicon / Intel · Developer ID 署名・Apple の公証済み
コンセプトは「アクティビティモニタ」+「IntelliJ の Run Configuration」。常駐するコマンドの面倒を、メニューバーの 1 か所で見ます。
サーバー、ワーカー、トンネル、ローカル LLM。どのタブで何が動いているか、閉じてよいのか分からなくなる。
Ctrl-C で親だけ終わり、子プロセスがポートを握ったまま。次の起動で「address already in use」。
エラーはスクロールの彼方。ファイルに残しても、ローテーションと退避まで面倒を見るのは手間。
メニューバーのアイコンをクリックすると、構成の一覧と選んだものの状態が開きます。ウィンドウの外をクリックすれば閉じます。
実行ファイル・引数・作業ディレクトリ・環境変数・.env を構成として保存。PATH はログインシェルの環境で解決するので、ターミナルと同じように動きます。
停止はプロセスグループ単位。SIGTERM を送り、猶予を過ぎても残れば SIGKILL。孫プロセスの取り残しを防ぎます。
グループ全体の合算を 1 / 10 / 60 分の窓で。内訳の表でどのプロセスが重いかも分かります。
stdout / stderr を色付きで表示し、正規表現で絞り込み。ファイルはサイズで世代交代し、あふれた分は Google Drive などの同期フォルダへ自動で退避。ファイル全体はターミナルの less で(使い方)。
子の出力は小さな中継プロセスが受けるので、RetainProcess を終了・再起動しても止まりません。次の起動でつなぎ直し、ログも続きから。
そのプロセスが開いているポートを自動で表示し、クリックでブラウザを開きます。どのポートで動いているかを探す手間がありません。
異常終了はメニューバーのバッジと通知で。構成ごとに「失敗時だけ」「常に」の自動再起動も選べます(間隔は指数的に延びます)。
構成と一致するプロセスが別の経路で動いていれば、そのまま引き取って監視・停止の対象にします。
案件ごとに構成をまとめて表示を絞り込み。構成は JSON で書き出し・取り込みでき、チームで共有できます。
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]
同梱の retain-process コマンドで、起動中のアプリを操作します。スクリプトや Raycast の Script Command から呼べます。
list / status / run / stop / restartlogs <構成> -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)"
Rust 製。ポップアップを閉じている間は描画を止め、必要な監視だけが動きます。
Apple Silicon の Mac での開発時の計測値(60 秒平均。メモリは phys footprint)。環境によって異なります。
更新確認・テレメトリ・クラッシュ送信を含め、RetainProcess 自身は一切通信しません。CLI の操作もローカルのソケットだけです。
管理者権限は不要。動かすコマンドはあなたのユーザー権限で動きます。設定とログは 0600 で保存します。
トークンを標準出力に出すツールは珍しくありません。退避先を同期フォルダにする場合は、その点を踏まえて選んでください。
任意のコマンドの起動やプロセスグループの制御は App Sandbox の中ではできないため、Developer ID 署名と Apple の公証を受けて直接配布しています。
最新版は 1.0.1(2026-10-13)。Homebrew か DMG のどちらかで入れてください。
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 が無く、この行は不要です。
対応: macOS 13 Ventura 以降 · Apple Silicon / Intel(ユニバーサル) · 無料 · 1.0.1 のリリースノート(英語)
インストールから、最初のコマンドを動かすまで。
「アプリケーション」フォルダから開きます(Homebrew なら open -a RetainProcess でも)。Dock には出ず、メニューバーに丸いアイコンが出ます(輪は停止中、塗りつぶしは実行中、中に点があれば異常終了したものがあります)。Apple の公証を受けているので、そのまま開けます。
初回だけポップアップが自動で開き、「Launch RetainProcess at login?」と尋ねます。あとからでも、アイコンの右クリックメニューの Launch at Login で切り替えられます。
例として Ollama(ollama serve)の構成が 1 件入っています。自分のコマンドは左上の + で追加し、Configuration タブで次を入れます。入力は自動で保存されます。
npm。PATH はログインシェルの環境で探します)run dev。シェルは通しません。パイプなどが要るなら Executable を /bin/zsh、Arguments を -lc '…' に)KEY=VALUE▶ Run で起動します。CPU・メモリは Monitor タブ、出力は Logs タブで(ファイル全体は Open in Terminal で less に。ターミナルでログを読む)。止めるときは ■ Stop(子プロセスまでまとめて止まります)。右クリックメニューからも Run / Stop できます。
右クリックメニューの Log Archive Home… で、Google Drive などの同期フォルダを選ぶと、世代からあふれたログがそこへ移ります。選ばなければあふれた分は削除されます。ログは ~/Library/Logs/RetainProcess/ に保存されます。
ChatGPT や Claude などに渡すためのガイドを用意しました。動かしたいコマンドを伝えれば、取り込み用の JSON や retainprocess.yml を書いてもらえます。IntelliJ・VS Code・Cursor などのプロジェクトのフォルダを指定すれば、そこにある起動構成から構成を作ってもらうこともできます。
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 | 使い方 |
<スタック>/<サービス>(例 shop/api)retainprocess.yml のパス(またはそのディレクトリ)--json を付けると機械可読な JSON で出力します0 成功 / 1 エラー / 2 アプリが起動していない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 で「アプリケーション」フォルダのものを置き換えます。
RetainProcess を終了しても、動かしていたコマンドは止まりません。消す前に止めておいてください。
ポップアップで構成ごとに ■ Stop、スタックは Down。CLI なら次のとおりです。
$ retain-process list # 動いているものを確認 $ retain-process stop "Web Backend" $ retain-process down shop
「Launch at Login」をオンにしていたら、右クリックメニューで外します(システム設定 › 一般 › ログイン項目 からも外せます)。
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 もそのまま残ります。