<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Procfile on recca0120 技術筆記</title><link>https://recca0120.github.io/tags/procfile/</link><description>Recent content in Procfile on recca0120 技術筆記</description><generator>Hugo -- gohugo.io</generator><language>zh-hant-tw</language><lastBuildDate>Thu, 16 Apr 2026 18:45:00 +0800</lastBuildDate><atom:link href="https://recca0120.github.io/tags/procfile/index.xml" rel="self" type="application/rss+xml"/><item><title>用 Overmind 管理本機多服務：比 foreman 好用在哪</title><link>https://recca0120.github.io/2026/04/16/overmind-procfile-process-manager/</link><pubDate>Thu, 16 Apr 2026 18:45:00 +0800</pubDate><guid>https://recca0120.github.io/2026/04/16/overmind-procfile-process-manager/</guid><description>&lt;img src="https://recca0120.github.io/" alt="Featured image of post 用 Overmind 管理本機多服務：比 foreman 好用在哪" /&gt;&lt;p&gt;本機開發跑 Rails 全端專案，至少要同時起四個服務：Rails server、Sidekiq、前端 build、CSS watch。以前的做法是開四個 terminal tab 分別跑，或是用 foreman 把它們包在一起。&lt;/p&gt;
&lt;p&gt;foreman 用了一段時間後，有幾個地方讓我很煩：log 顏色常常不見、輸出有時候會 delay 好幾秒才出現、有一個 process 掛掉就全部停。&lt;a class="link" href="https://github.com/DarthSim/overmind" target="_blank" rel="noopener"
 &gt;Overmind&lt;/a&gt; 解決了這些問題，而且多了幾個讓人上癮的功能。&lt;/p&gt;
&lt;h2 id="procfile-是什麼"&gt;&lt;a href="#procfile-%e6%98%af%e4%bb%80%e9%ba%bc" class="header-anchor"&gt;&lt;/a&gt;Procfile 是什麼
&lt;/h2&gt;&lt;p&gt;Overmind 讀的是 &lt;code&gt;Procfile&lt;/code&gt;，這個格式從 Heroku 時代就在用，定義應用程式有哪些服務、每個服務要跑什麼指令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;web: bin/rails server
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;worker: bundle exec sidekiq
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;assets: yarn build --watch
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;css: yarn tailwind --watch
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;一行一個服務，格式是 &lt;code&gt;名稱: 指令&lt;/code&gt;。這個檔案同時也是 Heroku、Render、Railway 這些平台的部署設定，本機跟線上用同一份，減少環境差異。&lt;/p&gt;
&lt;h2 id="安裝"&gt;&lt;a href="#%e5%ae%89%e8%a3%9d" class="header-anchor"&gt;&lt;/a&gt;安裝
&lt;/h2&gt;&lt;p&gt;macOS 先裝 tmux（Overmind 的核心依賴）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install tmux
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install overmind
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Linux：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt-get install tmux
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 下載最新 release binary 或&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go install github.com/DarthSim/overmind/v2@latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="基本用法"&gt;&lt;a href="#%e5%9f%ba%e6%9c%ac%e7%94%a8%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;基本用法
&lt;/h2&gt;&lt;p&gt;在有 &lt;code&gt;Procfile&lt;/code&gt; 的目錄跑：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;overmind start
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 或縮寫&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;overmind s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;所有服務就起來了，log 會集中在同一個輸出，每個 process 用不同顏色區分名稱。&lt;/p&gt;
&lt;h2 id="讓-foreman-用戶馬上看到差異的功能"&gt;&lt;a href="#%e8%ae%93-foreman-%e7%94%a8%e6%88%b6%e9%a6%ac%e4%b8%8a%e7%9c%8b%e5%88%b0%e5%b7%ae%e7%95%b0%e7%9a%84%e5%8a%9f%e8%83%bd" class="header-anchor"&gt;&lt;/a&gt;讓 foreman 用戶馬上看到差異的功能
&lt;/h2&gt;&lt;h3 id="單獨重啟某個服務"&gt;&lt;a href="#%e5%96%ae%e7%8d%a8%e9%87%8d%e5%95%9f%e6%9f%90%e5%80%8b%e6%9c%8d%e5%8b%99" class="header-anchor"&gt;&lt;/a&gt;單獨重啟某個服務
&lt;/h3&gt;&lt;p&gt;這個功能我每天都在用。改了 Sidekiq worker，不用整個停掉重跑，直接：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;overmind restart worker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;只有 worker 重啟，web 和前端 build 繼續跑，不中斷。&lt;/p&gt;
&lt;h3 id="連進去操作"&gt;&lt;a href="#%e9%80%a3%e9%80%b2%e5%8e%bb%e6%93%8d%e4%bd%9c" class="header-anchor"&gt;&lt;/a&gt;連進去操作
&lt;/h3&gt;&lt;p&gt;某個服務需要輸入（比如跑 Rails console 在同一個 process 裡）或想直接看它的輸出：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;overmind connect web
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這會開一個 tmux window 連進去，可以打指令、看完整 log。離開用 &lt;code&gt;Ctrl+b d&lt;/code&gt; 回到主畫面，不會把 process 停掉。&lt;/p&gt;
&lt;h3 id="允許某個服務死掉不影響其他人"&gt;&lt;a href="#%e5%85%81%e8%a8%b1%e6%9f%90%e5%80%8b%e6%9c%8d%e5%8b%99%e6%ad%bb%e6%8e%89%e4%b8%8d%e5%bd%b1%e9%9f%bf%e5%85%b6%e4%bb%96%e4%ba%ba" class="header-anchor"&gt;&lt;/a&gt;允許某個服務死掉不影響其他人
&lt;/h3&gt;&lt;p&gt;前端 build 跑完就結束了，不應該讓它把整個 stack 拉倒：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;overmind start -c assets,npm_install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 或用環境變數&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;OVERMIND_CAN_DIE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;assets,npm_install overmind start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="自動重啟"&gt;&lt;a href="#%e8%87%aa%e5%8b%95%e9%87%8d%e5%95%9f" class="header-anchor"&gt;&lt;/a&gt;自動重啟
&lt;/h3&gt;&lt;p&gt;某些 process 偶爾會掛掉，設定讓它自動重來：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;overmind start -r worker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;OVERMIND_AUTO_RESTART&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;worker overmind start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;加 &lt;code&gt;all&lt;/code&gt; 就全部服務都自動重啟：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;overmind start -r all
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="為什麼-log-顏色不會掉"&gt;&lt;a href="#%e7%82%ba%e4%bb%80%e9%ba%bc-log-%e9%a1%8f%e8%89%b2%e4%b8%8d%e6%9c%83%e6%8e%89" class="header-anchor"&gt;&lt;/a&gt;為什麼 log 顏色不會掉
&lt;/h2&gt;&lt;p&gt;foreman 的 log 問題來自 process 的輸出方式。大部分程式偵測到 stdout 不是 terminal 時，會切換成 buffered 模式輸出，結果就是顏色 escape code 被丟掉、log 延遲到 buffer 滿了才一次噴出來。&lt;/p&gt;
&lt;p&gt;Overmind 用 tmux 的 &lt;strong&gt;control mode&lt;/strong&gt; 來捕捉輸出，每個 process 都跑在真實的 tmux window 裡，對 process 來說它是在對著 terminal 說話，所以顏色、即時輸出全部正常。&lt;/p&gt;
&lt;h2 id="環境變數設定"&gt;&lt;a href="#%e7%92%b0%e5%a2%83%e8%ae%8a%e6%95%b8%e8%a8%ad%e5%ae%9a" class="header-anchor"&gt;&lt;/a&gt;環境變數設定
&lt;/h2&gt;&lt;p&gt;不想每次都打那麼長的指令，可以在專案目錄建 &lt;code&gt;.overmind.env&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;OVERMIND_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;OVERMIND_AUTO_RESTART&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;worker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;OVERMIND_CAN_DIE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;assets
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Overmind 啟動時自動讀這個檔，等於把常用設定存下來。&lt;/p&gt;
&lt;p&gt;也可以放在 &lt;code&gt;~/.overmind.env&lt;/code&gt;（home 目錄）做全域設定。&lt;/p&gt;
&lt;h2 id="port-分配"&gt;&lt;a href="#port-%e5%88%86%e9%85%8d" class="header-anchor"&gt;&lt;/a&gt;Port 分配
&lt;/h2&gt;&lt;p&gt;Overmind 會自動設定 &lt;code&gt;PORT&lt;/code&gt; 環境變數給每個 process：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一個 process：&lt;code&gt;PORT=5000&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;第二個：&lt;code&gt;PORT=5100&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;以此類推（step 預設 100）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Procfile 可以直接用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;web: bin/rails server -p $PORT
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;改 base port：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;overmind start -p &lt;span class="m"&gt;3000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;不同 process 之間也可以互相引用 port：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;web: bin/rails server -p $PORT
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;proxy: ngrok http $OVERMIND_PROCESS_web_PORT
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="只跑部分服務"&gt;&lt;a href="#%e5%8f%aa%e8%b7%91%e9%83%a8%e5%88%86%e6%9c%8d%e5%8b%99" class="header-anchor"&gt;&lt;/a&gt;只跑部分服務
&lt;/h2&gt;&lt;p&gt;有時候只需要跑 web 和 worker，不需要前端 build：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 只跑指定服務&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;overmind start -l web,worker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 排除指定服務&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;overmind start -x assets,css
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="服務-scaling"&gt;&lt;a href="#%e6%9c%8d%e5%8b%99-scaling" class="header-anchor"&gt;&lt;/a&gt;服務 Scaling
&lt;/h2&gt;&lt;p&gt;需要跑多個 worker instance：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;overmind start -m &lt;span class="nv"&gt;web&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1,worker&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;worker 會起三個 instance，port 依序分配。&lt;/p&gt;
&lt;h2 id="跟-foreman-的比較"&gt;&lt;a href="#%e8%b7%9f-foreman-%e7%9a%84%e6%af%94%e8%bc%83" class="header-anchor"&gt;&lt;/a&gt;跟 foreman 的比較
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;功能&lt;/th&gt;
 &lt;th&gt;foreman&lt;/th&gt;
 &lt;th&gt;Overmind&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;基本 Procfile 支援&lt;/td&gt;
 &lt;td&gt;✓&lt;/td&gt;
 &lt;td&gt;✓&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Log 顏色保留&lt;/td&gt;
 &lt;td&gt;常掉&lt;/td&gt;
 &lt;td&gt;正常&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Log 即時輸出&lt;/td&gt;
 &lt;td&gt;有延遲&lt;/td&gt;
 &lt;td&gt;即時&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;單獨重啟&lt;/td&gt;
 &lt;td&gt;✗&lt;/td&gt;
 &lt;td&gt;✓&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;連進 process 操作&lt;/td&gt;
 &lt;td&gt;✗&lt;/td&gt;
 &lt;td&gt;✓&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Can-die 設定&lt;/td&gt;
 &lt;td&gt;✗&lt;/td&gt;
 &lt;td&gt;✓&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Auto-restart&lt;/td&gt;
 &lt;td&gt;✗&lt;/td&gt;
 &lt;td&gt;✓&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;依賴&lt;/td&gt;
 &lt;td&gt;無&lt;/td&gt;
 &lt;td&gt;tmux&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;主要代價是多了 tmux 依賴。如果你的環境不能裝 tmux，或是只需要最基本的 Procfile 管理，Overmind 的作者也做了一個輕量版 &lt;a class="link" href="https://github.com/DarthSim/hivemind" target="_blank" rel="noopener"
 &gt;Hivemind&lt;/a&gt;，沒有 tmux 整合，但沒有 log 問題。&lt;/p&gt;
&lt;h2 id="實際-procfile-範例"&gt;&lt;a href="#%e5%af%a6%e9%9a%9b-procfile-%e7%af%84%e4%be%8b" class="header-anchor"&gt;&lt;/a&gt;實際 Procfile 範例
&lt;/h2&gt;&lt;p&gt;Rails + Sidekiq + Vite：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;web: bin/rails server -p $PORT
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;worker: bundle exec sidekiq -C config/sidekiq.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vite: bin/vite dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;搭配 &lt;code&gt;.overmind.env&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;OVERMIND_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;OVERMIND_AUTO_RESTART&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;worker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;OVERMIND_CAN_DIE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;vite
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;跑起來：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;overmind s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;三個服務各自在 tmux window 裡，log 顏色正常，worker 掛掉自動重啟，vite 結束不影響其他服務。&lt;/p&gt;
&lt;h2 id="參考資源"&gt;&lt;a href="#%e5%8f%83%e8%80%83%e8%b3%87%e6%ba%90" class="header-anchor"&gt;&lt;/a&gt;參考資源
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/DarthSim/overmind" target="_blank" rel="noopener"
 &gt;Overmind GitHub Repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/DarthSim/hivemind" target="_blank" rel="noopener"
 &gt;Hivemind — 輕量版（無 tmux）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://evilmartians.com/chronicles/introducing-overmind-and-hivemind" target="_blank" rel="noopener"
 &gt;Introducing Overmind and Hivemind — Evil Martians&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://devcenter.heroku.com/articles/procfile" target="_blank" rel="noopener"
 &gt;Heroku Procfile 格式說明&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>