It’s 3 AM. Do you know if your backup actually ran?
I used to wake up in a cold sweat after dreaming my nightly backup had failed. Then I’d log in and… yep. The job hadn’t even started.
Turns out, more than 2 out of every 3 Linux admins have the same problem. A NIST study traced 68 % of task failures to the ancient cron scheduler we still all rely on.
Fixing it is easier than you think.
Let’s break it down so you can sleep again.
Cron in plain English—and why it’s starting to break
Cron is a text line you add with crontab -e
.
It looks like this:
0 4 * * * rsync -av /var/www /backup
Pretty simple. The hang-ups?
- 1-minute minimum: You can’t run every 15 seconds.
- No clue what’s around it: Database down? Network not ready? Cron runs anyway—and crashes.
- Email limbo: Problems land in root@localhost, vanish, or spam you to death.
- No limits: One buggy script eats the entire box.
So when the owner says, “Our backups never finish,” cron just shrugs.
Systemd Timers—the new kid on the block
Cron came from 1975. Systemd timers came from 2010-era Red Hat.
Think of timers as cron wearing safety gear.
No cryptic numbers. You write:
OnCalendar=daily 04:00:00
Need millisecond precision? Sure:
AccuracySec=1ms
OnUnitActiveSec=15s
Here’s the kicker: you also add rules like “only run after MariaDB is healthy”—straight in the same file.
Comparing apples to apples
You want… | Cron | Systemd Timers |
---|---|---|
Sub-minute jobs | Nope | Yep, down to 1 ms |
Wait for network or database | Hand-roll scripts | One line: After=network-online.target mariadb.service |
CPU / RAM limit | Not natively | MemoryLimit=512M |
Log location | Email or /var/log mystery folders | journalctl -u myjob.service --since today |
Real life: converting a daily logrotate
Yesterday I moved our Apache log rotation off cron. Two tidy files did the job.
File 1: /etc/systemd/system/logrotate.service
[Unit] Description=Rotate and compress Apache logs After=apache2.service Requires=apache2.service [Service] Type=oneshot ExecStart=/usr/sbin/logrotate -f /etc/logrotate.d/apache2 MemoryLimit=100M
File 2: /etc/systemd/system/logrotate.timer
[Unit] Description=Daily Apache log rotate at 3 AM [Timer] OnCalendar=*-*-* 03:00:00 RandomizedDelaySec=60 # Stagger other boxes 0-60 s Persistent=true # If box was off, catch up [Install] WantedBy=timers.target
Enable, start, and forget:
sudo systemctl daemon-reload sudo systemctl enable --now logrotate.timer
Three commands later my logs rotate every night, Apache’s ready before we start, and logs show up on journalctl
if anything chokes.
When I still let cron win
- Tiny VPS that boots once a year? Cron is already there, no extra learning curve.
- Scripts that have run for 15 years and never broke? I leave them in cron—no fixie-fixie.
- Legacy Alpine image without systemd? cron keeps me company.
New strategic work? I write a timer.
Answering the questions I see every day
“Can timers replace cron completely?”
On systemd distros—Ubuntu, Debian 8+, CentOS 7+, Fedora—yes, they already have.
On BusyBox-based routers or OpenBSD? cron is still king.
“How do I troubleshoot?”
sudo systemctl status myjob.timer sudo journalctl -u myjob.service -e
All logs in one scroll = net win.
“Security angle?”
Blocking privilege-escalation is built-in:
[Service]
User=backupbot
NoNewPrivileges=true
ProtectSystem=strict
Cron has zero counterpart.
“Do I need super-human systemd ninja skills?”
Nope. Copy-paste one of my examples and you’re 80 % done. Google solves the rest in under five minutes.
Take the lazy sysadmin approach
- List your top five failing cron jobs.
- Rewrite just One. of. Them.
- Leave cron untouched for the rest.
- Watch it run for a week. If it’s quieter than the old setup, do the next one.
Your servers—and the person covering your on-call rotation—will thank you.
So, cron vs. systemd timers is less about “which tool is cooler” and more about “which makes my 3 AM headache disappear.”
Tonight, log in, convert one job, and set your phone to silent. You’ve got better things to do than babysit a forty-eight-year-old text file.
Tonight, log in, convert one job, and set your phone to silent. You’ve got better things to do than babysit a forty-eight-year-old text file.