--- title: Serviceman homepage: https://git.rootprojects.org/root/serviceman tagline: | Serviceman: cross-platform service management for Linux, Mac, and Windows. --- To update or switch versions, run `webi serviceman@stable` ## Cheat Sheet > Serviceman is a hassle-free wrapper around your system launcher. It works with > the default system launcher to make it easy to start _user_- and > _system_-level services, such as webservers, backup scripts, network and > system tools, etc. Supports - `launchctl` (macOS) - `systemctl` (Linux) - The Registry (Windows) Serviceman can run an app in just about any programming language very simply. If you'd like to learn what `serviceman` does without actually making changes, add the `--dryrun` option. ### Example: Bash ```bash sudo env PATH="$PATH" serviceman add bash ./backup.sh /mnt/data ``` ### Example: Node.js **Development Server** ```bash pushd ./my-node-app/ sudo env PATH="$PATH" \ serviceman add --system --cap-net-bind \ npx nodemon ./server.js ``` **Production Server** ```bash pushd ./my-node-app/ sudo env PATH="$PATH" \ serviceman add --system --cap-net-bind \ npm start ``` ### Example: Golang ```bash pushd ./my-go-package/ sudo env PATH="$PATH" \ serviceman add --system \ go run -mod=vendor cmd/my-service/*.go --port 3000 ``` ```bash pushd ./my-go-package/ go build -mod=vendor cmd/my-service sudo env PATH="$PATH" \ serviceman add --cap-net-bind --system \ ./my-service --port 80 ``` ### How to see all services ```bash serviceman list --system serviceman list --user ``` ```txt serviceman-managed services: example-service ``` ### How to restart a service You can either `add` the service again (which will update any changed options), or you can `stop` and then `start` any service by its name: ```bash sudo env PATH="$PATH" serviceman stop example-service sudo env PATH="$PATH" serviceman start example-service ``` ## What a typical systemd .service file looks like ```txt [Unit] Description=example-service After=network-online.target Wants=network-online.target systemd-networkd-wait-online.service [Service] Restart=always StartLimitInterval=10 StartLimitBurst=3 User=root Group=root WorkingDirectory=/srv/example-service ExecStart=/srv/example-service/bin/example-command start ExecReload=/bin/kill -USR1 $MAINPID # Allow the program to bind on privileged ports, such as 80 and 443 CapabilityBoundingSet=CAP_NET_BIND_SERVICE AmbientCapabilities=CAP_NET_BIND_SERVICE NoNewPrivileges=true [Install] WantedBy=multi-user.target ``` ## What a typical launchd .plist file looks like ```txt Label example-service ProgramArguments /Users/me/example-service/bin/example-command start RunAtLoad KeepAlive WorkingDirectory /Users/me/example-service StandardErrorPath /Users/me/.local/share/example-service/var/log/example-service.log StandardOutPath /Users/me/.local/share/example-service/var/log/example-service.log ``` ### Use `--dryrun` to see the generated launcher config: ```bash sudo env PATH="$PATH" \ serviceman add --system --dryrun \ bash ./backup.sh /mnt/data ``` ### See the (sub)command help The main help, showing all subcommands: ```bash serviceman --help ``` Sub-command specific help: ```bash serviceman add --help ```