Unit files are short, and that is exactly why they are hard
A systemd unit is a handful of lines in three sections, which makes it look like something you should be able to write from memory. In practice almost nobody does, because the difficulty is not the length, it is that every field name is precise, most of them have a small closed set of legal values, and getting one wrong produces a service that either refuses to start or starts in a way you did not intend.
The classic failures are all small. An ExecStart that is relative rather than absolute. A restart policy chosen from vague memory. A dependency declared with the wrong keyword, so the unit starts before the thing it needs. A timer schedule written in cron because cron is what everyone knows.
This generator puts every one of those choices in front of you as a labelled field with real values, and writes the file as you type.
Building a unit
- Fill in a Description and the unitβs name. The name is sanitised into something systemd will accept.
- Enter ExecStart, the command to run. Check the note under the field before moving on.
- Set the service type, an optional user, group and working directory, and a restart policy.
- Add environment variables and dependencies as rows, one at a time.
- Choose the install target that decides when the unit is enabled at boot.
- Enable a timer if the job should run on a schedule rather than continuously.
- Copy or download each generated file, and follow the install instructions shown underneath.
The ExecStart rule, stated correctly
Almost every guide says the command must be an absolute path. That is good advice and it is not quite the rule.
The real requirement is that the first argument is either an absolute path or a plain file name with no slashes in it. A bare name is legal because systemd resolves it against a fixed, compiled in search path. So a unit whose ExecStart is just a program name will usually work, which is why the tool flags it as a suggestion rather than an error while pointing out that a full path is more reliable, since that search path is not your shellβs and does not follow your environment.
What actually fails is the middle case, a relative path with a slash in it. That is neither of the two accepted forms and systemd will not resolve it against anything. That one is reported as an error under the field, though it still does not stop the file being generated, because refusing to show output while you are halfway through typing a path is obnoxious.
Timers instead of cron
The timer half of this tool writes a second unit that triggers the first one. Two scheduling modes are offered.
Calendar mode fires at wall clock times and takes either a shortcut keyword or your own expression. Boot relative mode fires a set duration after boot and then repeatedly at an interval, which is the right shape for a job that should run every hour regardless of what time it starts. Durations there are validated against systemdβs own time span vocabulary, so an unrecognised unit is caught in the field rather than at load time.
The persistent option is the one worth understanding. With it enabled, a scheduled run that was missed because the machine was off is executed once the machine comes back, which is the behaviour people usually assume a cron job has and which cron does not provide.
The reason to prefer a timer over a crontab at all is the logging. A timer triggered service writes to the journal like any other unit, with its own status, exit code and output, so a failed run is visible in the same place as everything else instead of vanishing into a mail spool nobody reads.
Related configuration tools
For the container equivalent of this problem, Dockerfile Generator builds an image definition, and a service that ships as a container often needs both. Config Generator covers other server configuration files.
If you are working on a machine that genuinely uses cron rather than systemd, Cron Generator writes the five field expression correctly, and it is the tool to use rather than pasting cron syntax into the timer field here. The rest are on the dev tools hub.

