systemd service will not start: a step-by-step check

Work out why a systemd service fails: read systemctl status, journalctl, validate configuration, check ports, permissions, SELinux and dependencies.

Linux & RHELL1TroubleshootingCovers: RHEL 7 / 8 / 9 (systemd)3 min read Updated by Vishal Sharma

▶ Watch the 60-second version on Instagram

Tip: you are in an in-app browser. Open this page in Chrome or Safari to keep your saved items.

Quick answer

Run systemctl status SERVICE -l --no-pager and journalctl -xeu SERVICE --no-pager. The exit status and the last log lines usually name the cause: bad configuration, a missing binary or user, a port already in use, permissions or SELinux, or an unmet dependency.

Step 1: read what systemd tells you

$ systemctl status httpd -l --no-pager
$ journalctl -xeu httpd --no-pager | tail -40
$ systemctl cat httpd                  # the unit as systemd sees it, including drop-ins
httpd.service - The Apache HTTP Server
   Active: failed (Result: exit-code) since Tue 2026-10-01 02:14:09 IST
  Process: 2210 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)
 Main PID: 2210 (code=exited, status=1/FAILURE)
httpd[2210]: AH00072: make_sock: could not bind to address [::]:80

Step 2: match the symptom

What you seeLikely causeCheck
status=1/FAILURE and an application error in the logConfiguration errorTest the config: httpd -t, nginx -t, sshd -t, named-checkconf
“could not bind”, “Address already in use”Port taken by another processss -ltnp | grep :80
status=203/EXECExecStart binary missing, wrong path or not executablels -l the path, check systemctl cat
status=217/USER or 216/GROUPUser or group in the unit does not existid USER
status=200/CHDIRWorkingDirectory missingCreate it or fix the unit
“Permission denied” but modes look rightSELinuxausearch -m avc -ts recent
Result: timeoutSlow start or Type mismatch (Type=notify vs simple)Raise TimeoutStartSec, check the unit type
Result: start-limit-hitRestarted too often too fastFix the cause, then systemctl reset-failed SERVICE
“Dependency failed”A required unit or mount is downsystemctl list-dependencies SERVICE

Step 3: fix and verify

# after editing a unit file or drop-in
$ sudo systemctl daemon-reload
$ sudo systemctl reset-failed SERVICE
$ sudo systemctl start SERVICE
$ systemctl is-active SERVICE; systemctl is-enabled SERVICE
# make it start at boot and now
$ sudo systemctl enable --now SERVICE

If the cause is an SELinux label, restore it instead of disabling SELinux:

$ ls -lZ /path/to/file
$ sudo restorecon -Rv /path/to/dir
$ sudo semanage port -l | grep http        # non-standard port? add it with semanage port -a
Diagnosis only

setenforce 0 switches SELinux to permissive until reboot. It is useful for a quick test to see whether SELinux is the cause, but do not leave it that way: fix the label or boolean and switch back with setenforce 1.

Starts by hand but not at boot

  • It is not enabled: systemctl enable SERVICE.
  • It starts before something it needs (network, a mount, a database). Add After= and Requires= or network-online.target.
  • A mount in /etc/fstab is slow or failing. Check systemctl --failed and findmnt --verify.

Common mistakes

  • Looking only at systemctl status and not at the journal.
  • Editing /usr/lib/systemd/system/*.service directly; use systemctl edit SERVICE (drop-ins survive updates).
  • Forgetting daemon-reload after changing a unit.
  • Disabling SELinux or the firewall to “make it work”.

Production considerations

Production

Validate configuration before restarting a live service (-t options), keep a copy of the working config, and test changes on one node of a load-balanced pool first. Record the root cause so the next on-call engineer does not repeat the search.

Interview questions

A service fails after reboot but starts manually. Why?

Typical causes: not enabled, ordering or dependency problems (network or mounts not ready), a failing fstab mount, or an environment difference between your shell and systemd. Check journalctl -b -u SERVICE and systemctl list-dependencies.

What does status=203/EXEC mean?

systemd could not execute the ExecStart command: wrong path, missing file, or no execute permission (or an SELinux denial).

More: Managing services and daemons · systemd chapter · Troubleshooting SELinux denials.