Cron utility in Linux has been helpful to schedule tasks to run at a scheduled time. A few of the disadvantages of cron are
- If Instance/server is not available/down at the cron schedule, cron doesn’t run those tasks until the next event is triggered
- If the cron task need to run other tasks after running the main task at the scheduled time, there are only hacks to create this dependency
- If the cron task needs to run within a given time interval to avoid running at the same time
- If a cron task needs to run after an event, such as 3 minutes after the system restarted. Cron doesn’t support this functionality
- To check the status of the last cron task to see if it ran/failed with logs
Most of the above issues require an alternative to cron. the above issues are fixed using system timer in Linux as follows:
Example Systemd Timer unit file
# test.timer
[Unit]
Description=Runs the test.service 5 minutes after boot-up & at/around 6 PM every weekday.
[Timer]
OnCalendar=Mon..Fri 18:00
## supports multiple time formats
Persistent=True
##If the machine is powered down and missed Oncalendar event, Persistent=true triggers if time has elapsed.
OnBootSec=5 m
## Event-Based, triggers the event 5 minutes after the machine is rebooted
RandomizedDelaySec=1800
## Randomly add up to 30 mins to the schedule. This is to ensure the task runs between 6 PM to 6.30 PM.
Unit=test.service
## service/task which needs to be run when the event/time occurs
[Install]
WantedBy=basic.target
Example Systemd service unit file # test.service [Unit] Description= test.service that needs to be run
[Service]
ExecStartPre=<some executable>
ExecStart=<some executable>
ExecStartPost=<some executable>
## ExectStart runs only if ExecStartPre is successful and ExecStartPost runs only if ExecStart is successful
[Install]
WantedBy=basic.target
To list all the system timers,last/next schedule
ubuntu@ip-11-223-3-40:/tmp$ systemctl list-timers --all
NEXT LEFT LAST PASSED UNIT ACTIVATES
Tue 2020-12-22 00:00:00 IST 1h 19min left Mon 2020-12-21 16:06:50 IST 6h ago logrotate.timer logrotate.service
Tue 2020-12-22 00:00:00 IST 1h 19min left Mon 2020-12-21 16:09:06 IST 6h ago man-db.timer man-db.service
Tue 2020-12-22 01:02:49 IST 2h 22min left Mon 2020-12-21 15:04:47 IST 7h ago motd-news.timer motd-news.service
Tue 2020-12-22 03:01:02 IST 4h 20min left Mon 2020-12-21 15:05:43 IST 7h ago certbot.timer certbot.service
Tue 2020-12-22 04:58:50 IST 6h left Mon 2020-12-21 14:54:08 IST 7h ago apt-daily.timer apt-daily.service
To Check the syntax of calendar event
ubuntu@ip-11-223-3-40:~/tmp$ systemd-analyze calendar "Mon..Fri 06:01"
Original form: Mon..Fri 06:01
Normalized form: Mon..Fri *-*-* 06:01:00
Next elapse: Tue 2020-12-22 06:01:00 IST
(in UTC): Tue 2020-12-22 00:31:00 UTC
From now: 7h left
Comments