The systemctl command in Linux

systemctl is the interface to systemd, the init system of virtually all current distributions. Services (nginx, postgres, your own apps) are "units"; systemctl starts and stops them now, enables them at boot, and reports their status — including the last log lines, which makes systemctl status the first stop when anything misbehaves.

How systemctl works

systemctl is a client: the work happens in systemd (PID 1), reached over D-Bus. Units — services, timers, mounts, sockets — are declarative files describing what to run and what it depends on; systemd computes the dependency graph and orders operations, which is how enabling one service transparently pulls in what it needs.

systemd's superpower is cgroups: every process a service spawns, including forks of forks, lives in the service's control group. That is why "systemctl stop" is reliable where old init scripts leaked orphans — the whole group is terminated — and why status can list every process belonging to a service and account for its memory and CPU precisely.

Syntax

systemctl COMMAND [UNIT]

Common options

OptionWhat it does
status UNITState, PID, uptime, and recent log lines — the diagnostic starting point.
start / stop / restartControl the service now.
reloadRe-read configuration without a full restart (if the unit supports it).
enable / disableStart (or not) automatically at boot. enable --now also starts it immediately.
list-units --type=serviceEverything currently loaded.
daemon-reloadRe-read unit files after you edit them.

How to use systemctl: examples

$ systemctl status nginx

Is it running, since when, with what PID — and the last few log lines.

$ sudo systemctl restart myapp

The deploy-day classic.

$ sudo systemctl enable --now postgresql

Start now AND at every boot, in one command.

$ systemctl list-units --type=service --state=failed

Anything red on this machine?

$ sudo systemctl daemon-reload

After editing a unit file — systemd caches them.

Real-world use cases for systemctl

Shipping your own service

Any long-running script deserves a unit file: ten lines in /etc/systemd/system/myapp.service (ExecStart, Restart=on-failure, User=), then daemon-reload and enable --now. You gain supervised restarts, boot persistence and journald logging — retirement papers for nohup-in-a-screen deployments.

The morning-after audit

After patching night: systemctl list-units --state=failed on each host. Empty output is the all-clear; anything listed comes with systemctl status ready to show why. Two commands, complete confidence.

Pro tips and common mistakes

Frequently asked questions about systemctl

restart or reload?

restart stops and starts (brief downtime, drops connections). reload asks the service to re-read config gracefully — prefer it when the service supports it (nginx does).

enable vs start?

start affects now; enable affects boot. A started-but-disabled service dies at reboot — the classic "it worked until the maintenance window" story.

Where do my service logs go?

Into the journal: journalctl -u myservice. systemd captures stdout/stderr of units automatically.

Related commands

ps

See what is running, find a process ID, and combine with grep to hunt down a program.

kill

Terminate processes politely or forcibly — and understand what -9 really does.

journalctl

Query the system journal: by service, time window, priority — and follow live.

Want to build real fluency? The interactive course takes you through systemctl and every other essential command with guided, checked exercises.