Cron to systemd Converter · Scheduling
Cron to systemd Converter: Move a crontab line to a systemd timer.
Paste a single crontab entry to generate asystemd.timer and.service pair with anOnCalendar= expression and migration notes — free, online, no signup required.
Runs in your browser — nothing you paste leaves this page. How we prove that
Cron to systemd Converter playground
Tip: press Esc to release focus.
—Paste a crontab line, then convert to see the equivalent systemd.timer and .serviceunits, plus any migration notes here.
The Gap
systemd is the new crontab.
Modern Linux distributions schedule jobs with systemd timers, and many no longer ship a per-user cron daemon at all. Timers give you journald logging, dependency ordering, resource limits, retries andPersistent=true for missed runs — things a bare crontab line can’t express.
But the syntax is unfamiliar, and rewriting a schedule by hand intoOnCalendar= across two unit files is fiddly and easy to get subtly wrong. This converter does the mechanical part for you — paste a crontab line to migrate it to systemd timer units in seconds — and calls out the handful of behaviours — environment, MAILTO, working directory — that do not translate one-to-one, so the migration is honest rather than silent.
Need to read the cron side first? Try theCron Expression Tester, then convert it here — or jump straight to thelive playground above.
The Pipeline
How it works.
Five deterministic steps turn one crontab line into an installable pair of units — all inside your browser tab, every time.
Parse the line.
Your crontab entry is split into the five time fields (or an @macro) and the command that follows.
Build OnCalendar.
The time fields are rewritten into a systemd OnCalendar= calendar expression, lists and steps included.
Emit the units.
A .timer carrying the schedule and a .service wrapping your command are generated as a matched pair.
Flag the gaps.
Anything cron does that systemd handles differently — env, MAILTO, working dir — surfaces as a note.
Copy & install.
Drop the two units in place, then enable and start the timer. The next runs show in list-timers.
The Mapping
How a crontab line maps to OnCalendar.
The converter reads a standard crontab entry — five time fields plus a command, or an @macro — and emits a systemd.timer paired with a.service.
The crontab line
The five fields are minute,hour,day-of-month,month andday-of-week, followed by the command. Lists (1,15), ranges (1-5), steps (*/10) and@macros are all understood.
# Run the nightly backup every day at 03:00
0 3 * * * /usr/local/bin/backup.shThe .timer unit
Carries the schedule as an OnCalendar=expression. Persistent=true means a run missed while the machine was off fires on the next boot — closer to how operators expect a backup job to behave.
[Unit]
Description=Run backup.sh (migrated from crontab)
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.targetThe .service unit
Wraps your command. Type=oneshot fits a run-to-completion job, and ExecStart=holds the command from the crontab line. AddEnvironment= orUser= here as needed.
[Unit]
Description=backup.sh (migrated from crontab)
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.shInstalling the Units
Install and enable the timer in three commands.
Copy both units, drop them in /etc/systemd/system/, reload the daemon, then enable and start the.timer — never the service directly. The timer is what schedules the run.
Once enabled, systemctl list-timersshows the next firing time, andjournalctl -u backup.service tails the output the old MAILTO would have emailed you.
# Drop the units in place, then enable the timer
$ sudo cp backup.timer backup.service /etc/systemd/system/
$ sudo systemctl daemon-reload
$ sudo systemctl enable --now backup.timer
# Confirm the next scheduled run
$ systemctl list-timers backup.timerBefore You Cut Over
What cron does that a systemd timer doesn’t.
A note on parity: the generated units cover the common case — schedule, command and missed-run handling. A few cron behaviours have no directOnCalendar= analogue and appear as migration notes instead: per-line environment assignments (move toEnvironment= /EnvironmentFile=),MAILTO email-on-output (use journald or an OnFailure= handler), and the implicit working directory (set WorkingDirectory=). Review the notes, then run the timer once withsystemctl start to confirm before you remove the original crontab line.
One difference is easy to miss: when a line restricts bothday-of-month andday-of-week,cron fires when either matches, whileOnCalendar= requiresboth. The converter flags that line in the notes — reproducing thecron behaviour takes two timers.
FAQ
Questions, answered.
Tap a question to expand the answer.
What does the Cron to systemd Converter do?
It takes a single crontab line — the five time fields plus the command — and generates an equivalent systemd setup: a .timer unit with an OnCalendar= expression that matches your schedule, and a .service unit that runs your command. It also lists migration notes that flag anything systemd handles differently, like the implicit working directory or environment. Everything is computed in your browser.
Does my crontab or command ever leave my browser?
No. The converter runs 100% client-side. Your cron line and command are parsed and translated in your browser tab — nothing is uploaded to a server, and there is no account or signup. It is safe to paste internal commands and paths.
How does a cron schedule map to OnCalendar=?
A crontab field set is rewritten into systemd's OnCalendar= calendar syntax — for example “0 3 * * *” becomes “*-*-* 03:00:00” (daily at 03:00). Lists, ranges and step values map to their OnCalendar equivalents, and common @macros like @daily and @hourly map to their canonical timer forms. After installing the timer you can confirm the next runs with “systemctl list-timers”.
Why move from cron to a systemd timer at all?
Timers give you structured logging through the journal (journalctl -u your.service), dependency ordering, resource limits, automatic retry and accurate-vs-monotonic scheduling, plus Persistent=true so a missed run can fire on next boot. They are the native scheduling primitive on modern systemd Linux distributions, where the per-user crond is often not even installed.
What can't be translated one-to-one?
A few cron behaviours have no direct OnCalendar= analogue and surface as migration notes instead — non-standard or vendor cron extensions, MAILTO email-on-output (use journald or an OnFailure= handler), and per-line environment assignments (move these to Environment= or an EnvironmentFile= in the .service). The converter flags these so nothing silently changes meaning.
Is this an official systemd or cron tool?
No. This is an independent, community utility and is not affiliated with or endorsed by the systemd project or any cron implementation. It models the standard crontab and systemd unit formats for familiarity and names them only to describe what it converts.
What is the systemd equivalent of @reboot, @daily and @hourly cron shortcuts?
@reboot has no OnCalendar= equivalent and maps to OnBootSec=1min in the [Timer] section, so the job fires once shortly after each boot. @hourly expands to OnCalendar=*-*-* *:00:00, @daily to OnCalendar=*-*-* 00:00:00, @weekly to OnCalendar=Sun *-*-* 00:00:00, @monthly to OnCalendar=*-*-01 00:00:00, and @yearly to OnCalendar=*-01-01 00:00:00. The converter handles all of these automatically and notes the @reboot special case.
How do I make a systemd timer run a missed job after the system was off, like anacron?
Add Persistent=true to the [Timer] section alongside your OnCalendar= line. systemd records the last trigger time on disk and, if the scheduled time passed while the machine was down, runs the job immediately on the next boot. The converter always includes Persistent=true in the generated .timer unit so this behaviour is on by default.
Where do the generated .timer and .service files go, and how do I enable them?
For system-wide jobs place both units in /etc/systemd/system/, then run sudo systemctl daemon-reload and sudo systemctl enable --now yourjob.timer. Enable the .timer unit — not the .service directly, since the timer is what controls the schedule. For per-user jobs place them in ~/.config/systemd/user/ and use systemctl --user enable --now yourjob.timer instead.
How do I check or test a systemd OnCalendar expression after converting from cron?
Run systemd-analyze calendar “<expression>” to validate the syntax and see when the expression will next elapse — for example systemd-analyze calendar “*-*-* 03:00:00”. Once the timer is installed, systemctl list-timers shows every active timer with its last and next run times, and journalctl -u yourjob.service streams the job output.
More free, private DevOps tools.
The Cron to systemd Converter is one tool inOpsCanopy — a growing canopy of browser-based validators, converters and testers that never touch a server.
More in Scheduling
39 free tools, every one offline-capable — opscanopy.com works with no signup and nothing uploaded.
Working with schedules? Pair this with theCron Expression Tester to read a cron line in plain English first, run the units this page produces through theSystemd Unit Validator to validate your hand-edits, or browse the fulltools directory.
Not affiliated with or endorsed by the systemd project or anycron implementation. Format names are used only to describe what this tool converts.