Services & systemd

Service stops before its executable starts

A service exits with 203/EXEC although a similar shell command works. Check the exact executable, interpreter, mount flags and unit context.

On this page
  1. Symptoms & scope
  2. Possible causes
  3. Diagnose safely
  4. Evidence-guided next steps
  5. References & review
  6. Related problems

Symptoms & scope

  • The process reports status=203/EXEC.
  • The normal application startup message never appears.

Relevant environment

systemd system services; interpreter and executable paths depend on the distribution.

Recognizable messages (synthetic examples)
systemd[1]: example.service: Main process exited, code=exited, status=203/EXEC

Inspect execve prerequisites before debugging the application itself.

Possible causes

These are possible explanations, not a confirmed diagnosis. Several independent faults can coexist.

  • A stale ExecStart path, missing interpreter or incompatible binary can prevent execve.
  • File access, noexec mounts or the service root may differ from the interactive shell.

Diagnose safely

Run one command at a time in the relevant session. Read the explanation first. Uppercase placeholders need your own values; tools and privileges vary by distribution. These commands are displayed here and never executed by the website.

Check 1

Replace example.service with the failing unit; normally readable without elevation.

systemctl show example.service -p ExecStart -p RootDirectory -p User

Interpret the result: Read the actual executable, not a shell alias. RootDirectory changes which paths exist for the child.

Check 2

Replace the path with the executable from ExecStart; this only lists path metadata.

namei -l /opt/example/bin/server

Interpret the result: Every parent directory needs traversal permission. An existing executable still needs its ELF loader or shebang interpreter.

Check 3

Use the same unit; system journal visibility may require administrative read permission.

journalctl -b -u example.service --no-pager -n 60

Interpret the result: The error before 203/EXEC distinguishes absent files, denied access and executable format failures; 203 alone does not.

Evidence-guided next steps

Correct the executable or interpreter

If the logged path is absent, point ExecStart to the installed executable. Fix a script shebang to an interpreter available inside the service root. On NixOS, reference the package path declaratively.

Precautions: Keep the prior unit and arguments. ExecStart is not implicitly run through a shell.

Recovery / rollback: Restore the prior unit, reload the manager and restart only this service at a suitable time.

Did this solution help you?

Share this solution#

Restore the necessary execution access

If traversal permissions or a noexec mount explain the error, grant the service identity specific path access or deploy the executable to a suitable filesystem. Investigate mandatory access-control denials separately.

Precautions: Record ownership and modes first. Do not broadly open application data or remount unrelated filesystems.

Recovery / rollback: Restore the recorded permissions or original deployment path and unit definition.

Did this solution help you?

Share this solution#

References & review

This guide was prepared from primary project or distribution sources and reviewed on the date shown. This is an editorial source check, not evidence that a fix was reproduced on your hardware. Diagnostic log examples are synthetic fixtures. Version-dependent details must be checked against your installed release.