procman is a process manager for local development on macOS.
Install:
go install github.com/croaky/procman@latestDefine your process definitions in Procfile.dev. For example:
clock: bundle exec ruby cmd/clock.rb
esbuild: bun run buildwatch
queues: bundle exec ruby cmd/queues.rb
web: bundle exec ruby cmd/web.rbRun processes by naming them in a comma-delimited list:
procman esbuild,webYou must list at least one process. There are no options or flags.
The output from multiple processes will be combined. For example:
esbuild |
esbuild | > buildwatch
esbuild | > node build.mjs --watch
esbuild |
esbuild | watching...
web | [67296] Puma starting in cluster mode...
web | [67296] * Puma version: 6.4.2 (ruby 3.3.0-p0) ("The Eagle of Durango")
web | [67296] * Min threads: 12
web | [67296] * Max threads: 12
web | [67296] * Environment: development
web | [67296] * Master PID: 67296
web | [67296] * Workers: 2
web | [67296] * Restarts: (✔) hot (✖) phased
web | [67296] * Preloading application
web | [67296] * Listening on http://0.0.0.0:3000
web | [67296] Use Ctrl-C to stop
web | [67296] - Worker 1 (PID: 67331) booted in 0.9s, phase: 0
web | [67296] - Worker 0 (PID: 67330) booted in 0.9s, phase: 0procman will run its processes until it receives a SIGINT (Ctrl+C),
SIGTERM, or SIGHUP.
If one of the processes finishes, it will send a SIGINT to all remaining
running processes, wait 5s, and then send a SIGKILL to all remaining processes.
procman runs exactly one process per definition.
It runs the processes in Procfile.dev "as-is";
It does not load environment variables from .env before running.
Add # watch: PATTERNS to automatically restart a process when files change:
web: bundle exec ruby cmd/web.rb # watch: lib/**/*.rb,ui/**/*.haml
esbuild: bun run buildwatchPatterns are relative to the directory containing Procfile.dev.
Glob patterns support * (single directory) and ** (recursive).
Processes without a watch annotation run without file watching.
Changes are debounced (500ms) to avoid rapid restarts.
On change, procman sends SIGINT, waits for the process to exit, then restarts it.
procman is distributed via Go source code,
not via a Homebrew package.
procman depends on:
- creack/pty for PTY interface
- fsnotify/fsnotify for file watching
- bmatcuk/doublestar for glob patterns
# checks
goimports -local "$(go list -m)" -w .
go vet ./...
go test ./...
deadcode -test ./...
# commit
git add -A
git commit -m "proc: add new feature" # commit with prefix, imperative mood, hard-wrap 72 colsMIT