Serviceman: cross-platform service management for Linux, Mac, and Windows.

Updating serviceman

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.


  • 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

sudo env PATH="$PATH" serviceman add bash ./ /mnt/data

Example: Node.js

Development Server

pushd ./my-node-app/

sudo env PATH="$PATH" \
    serviceman add --system --cap-net-bind \
    npx nodemon ./server.js

Production Server

pushd ./my-node-app/

sudo env PATH="$PATH" \
    serviceman add --system --cap-net-bind \
    npm start

Example: Golang

pushd ./my-go-package/

sudo env PATH="$PATH" \
    serviceman add --system \
    go run -mod=vendor cmd/my-service/*.go --port 3000
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

serviceman list --system
serviceman list --user
serviceman-managed services:


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:

sudo env PATH="$PATH" serviceman stop example-service
sudo env PATH="$PATH" serviceman start example-service

What a typical systemd .service file looks like

Description=example-service systemd-networkd-wait-online.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


What a typical launchd .plist file looks like

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated for serviceman. Edit as you wish, but leave this line. -->
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "">
<plist version="1.0">




Use --dryrun to see the generated launcher config:

sudo env PATH="$PATH" \
    serviceman add --system --dryrun \
    bash ./ /mnt/data

See the (sub)command help

The main help, showing all subcommands:

serviceman --help

Sub-command specific help:

serviceman add --help


Report an Issue Submit Installer