Developer Tools
systemd Timer Generator
Build a systemd .timer and matching .service in your browser. OnCalendar builder with validation, Persistent, randomized delay, and install commands. No signup.
systemd timer generator
Quick presets
Start from a common schedule
Unit and command
What runs, and what it is called
Used for both files: backup.timer and backup.service. No extension.
Shown by systemctl status and in the journal.
System timers run as root or a chosen user and start at boot. User timers run as you and need lingering enabled to run while you are logged out.
Use an absolute path. systemd does not run commands through a shell, so pipes and variables need an explicit /bin/sh -c wrapper.
Leave blank to run as root.
Schedule
When it fires
Resolved OnCalendar
*-*-* 03:00:00
Runs every day at 3:00.
Behavior
How the timer handles the real world
Adds a random wait of up to this long before each run. Set it on a fleet of machines so they do not all hit a server at once. Zero disables it.
The window systemd may shift the run within so it can batch wakeups and save power. The default is 1 minute. Lower it only when you need tighter timing.
Output
Your unit files
Timer unit
backup.timer
[Unit] Description=Nightly backup [Timer] OnCalendar=*-*-* 03:00:00 Persistent=true [Install] WantedBy=timers.target
Service unit
backup.service
[Unit] Description=Nightly backup [Service] Type=oneshot ExecStart=/usr/local/bin/backup.sh
Install
Put it on the machine
# Save the unit files to /etc/systemd/system/ # /etc/systemd/system/backup.timer # /etc/systemd/system/backup.service # Reload systemd so it sees the new files sudo systemctl daemon-reload # Enable at boot and start now sudo systemctl enable --now backup.timer # Confirm the schedule and next run time sudo systemctl list-timers backup.timer systemd-analyze calendar '*-*-* 03:00:00'
Timer vs cron, in short
- A timer cannot run a command on its own. It starts a matching service unit, which is why this tool emits both files.
- Persistent=true runs a job that was missed while the machine was off, something a plain cron entry cannot do (anacron is the cron answer).
- Logs go to the journal. Use journalctl -u backup.service to see output, and list-timers to see the next run.
- RandomizedDelaySec spreads load across many machines, which is awkward to do with cron.
OnCalendar quick reference
- *-*-* 03:00:00 every day at 03:00
- Mon..Fri *-*-* 09:00 weekdays at 09:00
- *:0/15 every 15 minutes
- *-*-01 00:00:00 the first of every month
- Sun *-*-* 04:30:00 Sundays at 04:30
- Keywords like daily, weekly, and hourly also work and are expanded for you.
Verify any expression on the machine with systemd-analyze calendar '...', which prints the next elapses.
How to use
- Pick a preset like Nightly backup or Every 15 minutes to start, or fill in the unit base name, description, and the command to run (ExecStart).
- Choose a scope: System for a root or service-user job under /etc/systemd/system, or User for a job that runs as you under ~/.config/systemd/user.
- Set the schedule. Use Calendar for a clock-based time and pick a frequency, or switch to After boot (OnBootSec) or After last run (OnUnitActiveSec). Custom lets you write any OnCalendar expression.
- Read the resolved OnCalendar and its plain-English summary, and fix anything the validator flags. Turn on Persistent to catch up missed runs, and add a randomized delay if many machines share the schedule.
- Copy the .timer and .service files, save them to the path shown, then run the daemon-reload, enable, and list-timers commands. Everything runs in your browser.
About this tool
systemd Timer Generator produces the two files you actually need to schedule a job with systemd: a .timer unit and the .service unit it starts. This pairing is the whole point, and the part people miss. A timer cannot run a command by itself; it only activates another unit, so a timer on its own does nothing. The tool writes the service as Type=oneshot, which is what a scheduled task almost always is, and gives both files the same base name so the timer finds its service automatically. The centerpiece is an OnCalendar builder. systemd calendar syntax has the shape weekday year-month-day hour:minute:second, with wildcards, ranges written a..b, lists written a,b, and steps written /n, and it is powerful but unforgiving: a reversed range, a slash where a dash belongs, or an out-of-range value is only reported by systemd-analyze after you have already copied the file to a server. Here you pick a frequency such as daily, weekly, weekdays, monthly, or every fifteen minutes and fill in a time, or drop into a custom field and write any expression you like. Either way the tool validates every field against the documented grammar, flags the exact problem, normalizes the expression the way systemd would (filling in a default date of *-*-* and seconds of 00, expanding keywords like daily and hourly), and reads it back in plain English so you can confirm it fires when you expect. Beyond the schedule it covers the directives that make a timer behave well in production. Persistent runs a job that was missed while the machine was powered off, the thing a plain cron entry cannot do. RandomizedDelaySec adds a random wait before each run so a fleet of machines does not stampede a server at the same second. AccuracySec sets how far systemd may shift a run to batch wakeups and save power, defaulting to one minute and only written when you change it. OnBootSec schedules a job a set time after the machine boots, and OnUnitActiveSec repeats a job a set time after its previous run finished, both offered as plain value-and-unit fields. You choose system scope, where files live under /etc/systemd/system and the service can run as a named user, or user scope under ~/.config/systemd/user. When you point the timer at a unit that already exists rather than generating one, a Unit= line is added automatically if its name differs. The output includes copy-ready commands to save the files, run daemon-reload, enable the timer with enable --now so it survives reboots, and confirm the schedule with list-timers and systemd-analyze calendar. Everything is computed in your browser, so the unit name, command, paths, and schedule you enter are never uploaded, logged, or sent anywhere. It is the systemd counterpart to a cron expression generator, for people who have moved their scheduled jobs onto systemd and want the timer, the service, and the install steps in one place.
Free to use. Works in your browser. No signup, no login.
Related tools
You may also like
systemd Service Generator
Build a complete systemd .service unit file with presets, hardening, resource limits, and a companion timer.
Open tool
DeveloperCrontab Explainer
Translate any crontab to plain English with a field breakdown and next-run preview.
Open tool
DeveloperCron Expression Generator
Build and explain cron expressions with plain English and a next-run preview.
Open tool
DeveloperText to Cron Generator
Convert a plain-English schedule sentence into a standard cron expression.
Open tool
DeveloperKubernetes CronJob Generator
Build an apply-ready batch/v1 CronJob manifest from a schedule, image, and command.
Open tool
DeveloperQuartz Cron Expression Generator
Quartz cron builder with full L, W, #, ? support, explainer, and next runs.
Open tool