Crontab handling
Preview what rippler sync will change, understand its safeguards and restore a backup.
rippler sync edits your crontab. This page shows exactly what changes and how to
reverse them.
Run it with --dry-run first to print the plan without changing anything.
What it changes
Each job without a monitor gets one, and the line is wrapped:
- 0 3 * * * /usr/local/bin/backup.sh --full
+ 0 3 * * * rippler exec 0kDRYQz -- /usr/local/bin/backup.sh --fullYour schedule, your command and your indentation are unchanged.
What it leaves alone
- Comments and blank lines
- Variable assignments like
MAILTO=orPATH= - Lines it has already wrapped, so running
synctwice does nothing @rebootjobs, which have no schedule to expect pings against. They are reported and skipped.- Everything outside your own crontab. See Where it looks.
Where it looks
Cron reads jobs from more than one place, and sync reports all of them. Only
your own crontab is edited:
| Where | Found | Edited |
|---|---|---|
Your crontab (crontab -e) | yes | yes |
/etc/crontab | yes | no |
/etc/cron.d/* | yes | no |
| Other users' crontabs | only when run as root | no |
/etc/cron.hourly, .daily, .weekly, .monthly | listed | no |
/etc/crontab and /etc/cron.d/ need root and are usually owned by a package,
so sync does not rewrite them. An apt upgrade would undo the edit, and a bad
rewrite disables every job in the file. Run rippler sync --adopt-system to
create the monitors for those jobs and print the finished lines to paste in
yourself:
Paste these into /etc/cron.d/backup (they keep the user column — a system file needs it)
# line 4, was: 0 3 * * * backups /usr/local/bin/backup.sh --full
0 3 * * * backups rippler exec 0kDRYQz -- /usr/local/bin/backup.sh --fullThose monitors stay Waiting until the lines are in place. A monitor that has never been pinged is never marked late, so nothing alerts in the meantime.
/etc/crontab and /etc/cron.d/ take a user column between the schedule and the command.
sync reads it and puts it back. If you write one of these lines by hand, keep the column.
Without it cron reads the command as a username and discards the whole file.
Files in /etc/cron.d/ whose names contain a dot, such as backup.bak or
foo.dpkg-old, are skipped, because cron ignores them.
The run-parts directories
Scripts in /etc/cron.daily and its siblings have no crontab line to wrap. The
schedule belongs to the directory. sync lists what is in them and stops there.
To monitor one, either move it to a crontab line or add the ping to the script
itself.
For the same reason the stock /etc/crontab lines that invoke run-parts are
reported and skipped. Wrapping one would monitor run-parts itself, which
reports success even when every script inside fails.
Schedules
Five-field expressions are used as they are. Shorthands are expanded:
| Shorthand | Becomes |
|---|---|
@yearly, @annually | 0 0 1 1 * |
@monthly | 0 0 1 * * |
@weekly | 0 0 * * 0 |
@daily, @midnight | 0 0 * * * |
@hourly | 0 * * * * |
@reboot | skipped |
Schedules are registered as UTC. If your machine's cron runs in another timezone, change the monitor's timezone in the app afterwards — otherwise expected ping times will be off by your offset and you may get false alerts.
Naming
Monitors are named after the program in the job, so
/usr/local/bin/backup.sh --full becomes backup.sh. Wrappers and options are
skipped:
| Job | Named |
|---|---|
/usr/local/bin/backup.sh --full | backup.sh |
test -x /usr/bin/certbot && certbot -q renew | certbot |
cd /srv/app && ./manage.py cleanup | manage.py |
python3 /srv/app/manage.py cleanup | manage.py |
flock -n /var/lock/backup.lock /usr/local/bin/backup | backup |
sudo -u www-data /usr/bin/php /var/www/artisan schedule:run | artisan |
/opt/cleanup.sh >> /var/log/cleanup.log 2>&1 | cleanup.sh |
Guards (test, [, cd), wrappers (sudo, flock, timeout, nice),
interpreters (python3, php, node), options, redirections and environment
assignments are all skipped. When it recognises nothing it uses the first word.
You can rename them in the app. sync matches on the monitor id in the wrapper,
not the name, so it does not rename them back.
Undoing it
sync saves your crontab before it changes anything and prints the path. To go
back:
crontab ~/.rippler/crontab-backup-2026-08-29T03-08-11-803Z.txtRestoring the crontab does not delete the monitors that were created. Remove those in the app if you do not want them.
Fix a stale monitor reference
! line 6 points at monitor jGDc_zz, which is not in this accountThat line is wrapped for a monitor that has since been deleted. sync reports it
and does not create a replacement.
To fix it, remove the rippler exec <id> -- part from that line and run sync
again.