[service.my-worker]
command = "/usr/bin/php /home/user/public_html/artisan queue:work"
restart = "always"
max_memory = "512MB"
cpu_limit = "20%" [service.api-server]
command = "/home/user/bin/api-server --port 8080"
restart = "on-failure"
max_memory = "1GB"
cpu_limit = "50%"
working_dir = "/home/user/api"
env = { NODE_ENV = "production", PORT = "8080" } [service.python-bot]
command = "/usr/bin/python3 /home/user/bots/discord_bot.py"
restart = "always"
max_memory = "256MB"
cpu_limit = "10%"
[service.my-worker]
command = "/usr/bin/php /home/user/public_html/artisan queue:work"
restart = "always"
max_memory = "512MB"
cpu_limit = "20%" [service.api-server]
command = "/home/user/bin/api-server --port 8080"
restart = "on-failure"
max_memory = "1GB"
cpu_limit = "50%"
working_dir = "/home/user/api"
env = { NODE_ENV = "production", PORT = "8080" } [service.python-bot]
command = "/usr/bin/python3 /home/user/bots/discord_bot.py"
restart = "always"
max_memory = "256MB"
cpu_limit = "10%"
[service.my-worker]
command = "/usr/bin/php /home/user/public_html/artisan queue:work"
restart = "always"
max_memory = "512MB"
cpu_limit = "20%" [service.api-server]
command = "/home/user/bin/api-server --port 8080"
restart = "on-failure"
max_memory = "1GB"
cpu_limit = "50%"
working_dir = "/home/user/api"
env = { NODE_ENV = "production", PORT = "8080" } [service.python-bot]
command = "/usr/bin/python3 /home/user/bots/discord_bot.py"
restart = "always"
max_memory = "256MB"
cpu_limit = "10%"
curl -sSL https://raw.githubusercontent.com/pqpm/pqpm/main/install.sh | sudo bash
curl -sSL https://raw.githubusercontent.com/pqpm/pqpm/main/install.sh | sudo bash
curl -sSL https://raw.githubusercontent.com/pqpm/pqpm/main/install.sh | sudo bash
git clone https://github.com/pqpm/pqpm.git
cd pqpm
make build && sudo make install
git clone https://github.com/pqpm/pqpm.git
cd pqpm
make build && sudo make install
git clone https://github.com/pqpm/pqpm.git
cd pqpm
make build && sudo make install - Let non-root users manage their own processes (without calling me at 2 AM)
- Was language-agnostic β Go, PHP, Python, Rust, a bash script that plays elevator music β I don't judge
- Had real resource limits so one bad actor doesn't nuke the whole server
- Was dead simple to configure - The Daemon (pqpmd) β runs as root, listens on a Unix socket
- The Config (~/.pqpm.toml) β each user defines their services in a dead-simple TOML file
- The CLI (pqpm) β users run commands like pqpm start my-worker with zero sudo required
- The Magic β the daemon verifies the caller's identity using kernel-level socket credentials (SO_PEERCRED), then spawns the process under that user's UID/GID - Goroutines & channels for async, non-blocking process monitoring (each managed process gets its own goroutine β beautiful)
- Static binaries β pqpmd and pqpm are single-file executables. No runtime. No dependencies. Just curl, extract, and go
- First-class syscall support β spawning processes, dropping privileges with setuid/setgid, reading SO_PEERCRED from Unix sockets β Go's golang.org/x/sys package is a dream
- Cross-compilation β building for amd64 and arm64 in one make command - VPS admins running shared hosting environments (especially Virtualmin/Webmin setups)
- Small teams where multiple developers deploy services on the same box
- Anyone tired of PM2 who runs more than just Node.js
- The sysadmin who wants their users to stop asking for root access to run a queue worker
- Solo devs running a $5 VPS with a Go API, a PHP backend, and a Python cron job β all at once - π Web dashboard β because sometimes you want to click buttons instead of typing commands
- π Notifications β get pinged when a process dies (and auto-restarts)
- π Metrics export β Prometheus-compatible resource usage stats
- π³ Container-aware mode β playing nice with Docker environments
- π§ͺ More tests β always more tests