eos

Service Supervisor

v0.0.11-rc.3 · Apr 2025

Run and manage background services on your VPS without the overhead. Register services, start them, and keep them running as a single Go binary.

No Node.js runtime. No Python environment. Copy the binary, write a YAML config, and your services are managed.

Features

Single Binary

No runtime dependencies. Copy eos to your server and installation is done.

YAML Config

One service.yaml per service. Human-readable and version control friendly.

Exponential Backoff Restart

Failed services restart automatically, with increasing delays between attempts to avoid restart loops.

Memory Limits

Set memory_limit_mb in service.yaml. eos restarts services automatically when they approach the limit.

Structured Logs

Separate stdout and stderr log files per service, written to disk. Tail them live or review history.

JSON API

The eos api subcommand outputs JSON for every operation. Pipe to jq, use in scripts, or integrate with CI.

How does eos compare?

Same job. Different tradeoffs. Runtime requirements, memory cost, and operational surface area vary significantly.

Docker Go / OCI ~65 MB RAM Container platform

Bundles your app, runtime, and OS deps into a portable image. A daemon manages container lifecycles, networking, and volumes.

Good for: You need isolation, dev/prod parity, or Kubernetes.

Less ideal for: You're running known binaries on a VPS. Image layers add weight you don't need.

supervisord Python ~21 MB RAM Process supervisor

Battle-tested Unix process supervisor (since 2006). INI config, XML-RPC API, Python runtime required.

Good for: Python is already in your stack and you want something mature.

Less ideal for: You don't need Python. No JSON output, INI config doesn't version well.

PM2 Node.js ~55 MB RAM Application process manager

Built for Node.js, extended to any runtime. Adds cluster mode, zero-downtime reloads, and optional cloud monitoring.

Good for: Your stack is Node.js-heavy and you want cluster mode or zero-downtime reloads.

Less ideal for: Your services aren't Node.js. You pull in the Node runtime for work that doesn't need it.

eos Go ~16 MB RAM Service supervisor

Keeps processes alive, surfaces what went wrong, and exposes machine-readable endpoints. One binary, one YAML file per service.

Good for: Resource-constrained VPS. Mixed runtimes. Process management without a runtime tax.

Less ideal for: You need filesystem isolation, a plugin ecosystem, or container orchestration.

Memory measured as VmRSS via /proc on Debian GNU/Linux 12 (bookworm), aarch64. One dummy service running. Docker 20.10.24, supervisord 4.2.5, PM2 6.0.14, eos v0.0.10.

Install

curl

curl -sSL https://raw.githubusercontent.com/Elysium-Labs-EU/eos/main/install.sh -o install.sh
sudo bash install.sh

wget

wget https://raw.githubusercontent.com/Elysium-Labs-EU/eos/main/install.sh
sudo bash install.sh

service.yaml

Each service is described by a single service.yaml file, checked in alongside your code.

eos reads this file live on every status check, so config changes are reflected immediately without re-registering the service.

Set memory_limit_mb and eos will automatically restart the service as it approaches the limit, before the OS has to intervene.

name: "cms"
command: "/home/user/start.sh"
port: 1337
runtime:
  type: "nodejs"
  path: "/usr/bin"
memory_limit_mb: 200

Quick reference

# Register a service
eos add ./service.yaml

# Start it
eos run my-service

# Check status
eos status

# View logs
eos logs my-service

# JSON output for scripts
eos api run my-service | jq .pgid
eos api logs my-service | jq '.lines[-1]'