Control Your Dev Processes with Overmind
Published Last updated loading views
If you’re wondering how to run multiple processes in your project, look no further. You came to the perfect place where you’ll learn how to quickly and effectively run all the services your project needs.
Forget about opening multiple tabs in your terminal and typing out several commands. Today, you’ll harness the power of running everything with a single command.
The Procfile
Welcome to the Procfile
file - a place where all your project’s services are defined. The Procfile
is a place where you define one or more processes to be run in order for your app to function. In short, this is how a Procfile
I use looks:
web: bin/rails server -p 3000
css: bin/rails tailwindcss:watch
worker: bundle exec sidekiq
There, we have three processes defined:
web
- the Rails web server. This can be any command that runs your project main logic.css
- the Tailwind development server.worker
- the Sidekiq process that handles scheduled jobs.
You can name these however you want, there are no rules to this. Use what makes sense to you and your team/coworkers.
The Procfile
is usually stored in the root of the project, and sometimes, you can have multiple of these. But, for the sake of simplicity, we’ll use just one for now and explain later how to use multiple files.
So, what now? How do you run processes after you’ve defined them in the Procfile
? Glad you asked, this is where Overmind steps in.
Overmind - The Process Runner
Most folks would reach out to the Foreman tool to run their processes via Procfile
. Today, we’ll show a better way to do it with a tool called Overmind.
Overmind is a tool written by DarthSim and you can view its code at this GitHub repo. It is highly inspired by Foreman we mentioned before, but it solves a couple of problems Foreman (and other tools) have. The problem with most of other tools is that processes you want to manage start to think they are logging their output into a file, and that can lead to all sorts of problems: severe lagging and losing or breaking colored output. Tools can also add vanity information (unneeded timestamps in logs).
Overmind uses tmux
under the hood to bring out some useful features, so we need to install that first with:
# on macOS (with homebrew)
$ brew install tmux
# on Ubuntu
$ apt-get install tmux
🤫 Psst, do you want to learn tmux the easy way? Here’s a Gentle Guide to Get Started With tmux I wrote to help you do that.
Great, now let’s install Overmind:
# on macOS (with homebrew)
brew install overmind
# or by using Go
go install github.com/DarthSim/overmind/v2
Awesome, now that we have Overmind install, we can move to the root of our project and start all those process with a single command:
overmind start
For me, this is how the output looks:
Right there, you can see all the output nicely rendered, with the famous Sidekiq ASCII art printed out.
If we quickly compare that to an output foreman
does with foreman start
, we’ll see a different output:
The output is not as nice as with Overmind.
But that’s not all. We did manage to start processes defined in Procfile
successfully and see the output, let’s now see the real deal of Overmind, let’s bring in more power with it!
Mo Powa Babeh
What makes Overmind great for me is that you can easily connect to any of the processes that you’re running. Yeah, you could have a similar thing if you opened a couple of tabs and ran every command on its own, but we’re not here for that, duh…
Overmind uses tmux
- a terminal multiplexer under the hood. Do not worry, you won’t have to learn another tool (except maybe two or three commands). By having tmux under the hood, we can easily run overmind connect
and it will shoot us straight into a tmux session with our processes.
Try out:
overmind connect
Here’s what I got:
I got launched into the first process defined in Procfile
- the web
process. The connect feature is very powerful because it allows you to see the logs of all processes split into tabs in tmux. You can easily switch tabs with Ctrl + b
and the number of a tab. For example:
Ctrl + b
and then 1, switches you to theweb
process,Ctrl + b
and then 2, switches you to thecss
process,- and you get the idea.
While inside the tmux session with Overmind, you can also control debug process if you run a debugger in any of the processes. For example, I put a debugger statement in my Rails controller like so:
class PublicController < ApplicationController
def index
debugger
end
end
And when I visit the home page, my web
process stops until I interact with the debugger. To make the web
process move forward, I quickly type overmind connect web
and continue the debugger.
And now, to gently exit the session without killing processes, use the Ctrl + b
and then d
. Congrats, you just learned how to switch windows in tmux and how to exit a tmux session 👏.
But what if you’re a tmux user already and all you do in the terminal is inside tmux? What if you do overmind connect
inside a tmux session? Let’s find out
Overmind in tmux
Let’s say you’re already using tmux for your day-to-day endeavors and you ran overmind connect
- what now? How do you exit without killing everything Overmind is running? First, here’s how that looks:
At the top, you can see I have the overmind
window open in tmux. Then, below it, you see three windows with web
, css
, and worker
open. The trick here is to do the double Ctrl + b
and then d
. So do Ctrl + b
Ctrl + b
and then d
. This will tell the second instance of tmux (the one ran by Overmind) to detach from the session. Now, you should be back to the tmux window you were before running overmind connect
like so:
OK, but what else can I do in Overmind? Glad you asked - I’ll show you a couple of more features.
More Overmind features
You can restart processes easily. Let’s say you made some changes to the web server that requires you to restart it. Here’s how to do it:
overmind restart web
You can stop something with:
overmind stop worker
And if all goes wrong, just kill the whole thing with:
overmind kill
One more thing I promised at the beginning - the multiple Procfile
situation. In some teams and projects, there are more than one Procfile
. Usually, they are called Procfile
and Procfile.dev
. One serves for production, other for development. Or whatever other combination you can think of. To be able to run Overmind with a file like Procfile.dev
, you need to do it like so:
overmind start --procfile Procfile.dev
# or a shorter version
overmind s -f Procfile.dev
Also, there are more options and features to explore over at the official docs in Overmind’s GitHub repo. There is an alternative to Overmind, especially if you don’t need all those features. It is called Hivemind.
Hivemind - Overmind’s little sister
If you don’t want all those features and want something to run all the processes, consider Hivemind from the same author.
You can get it with:
# on macOS with homebrew
brew install hivemind
# Or from source with Go 11
GO111MODULE=on go get -u -f github.com/DarthSim/hivemind
After that, you can run hivemind
and that’s it. Of course, that’s all you get, there are no extra features like in Overmind. Here’s how the output looks:
Wrapping Up
Thanks for reading this far, you’ve just got introduced to a couple of concepts:
Procfile
- a file to define processes needed to run your projectforeman
- a tool to run those processes quickly- Overmind - a tool that better prints out logs and has advanced features to help you easily manage processes
- Hivemind - a smaller sibling of Overmind
- tmux - a terminal multiplexer that can increase your productivity locally and/or remote servers
So I hope you had a good time reading. And remember, these are tools made to make you feel and be more productive. Try them out, or don’t, but I know, if you’re a true terminal junkie, you’re always on the lookout to saw a keystroke or two.
Until the next one, cheers!
Join the newsletter!
Subscribe to get latest content by email and to become a fellow pineapple 🍍