I want to make backups on a regular basis, allow the backup task to be run on-demand, and run in a specific environment (directory, environment variables, etc). I aleady have a script I can run to make the backup. The host uses systemd for service management.
Procedure #
Create a script to do the backup. This is system dependent: for purposes of this article, /path/to/backup/script is the backup script. It runs as the user infinite from the home directory /home/infinite.
Create a service unit file which runs the backup script. Create a service unit file at /etc/systemd/system/backup.service.
[Unit]
Description=Backup the database
[Service]
User=infinite
Group=infinite
Type=oneshot
WorkingDirectory=/home/infinite
ExecStart=/path/to/backup/script
[Install]
WantedBy= multi-user.target
Validate the service unit. Run the service and confirm it works as expected.
1$ sudo systemctl start backup
Create a timer unit to trigger the service. Create a timer unit at /etc/systemd/system/backup.timer like the following, which runs the backup service defined above at 4:00AM on a daily basis.
[Unit]
Description=Backup the database daily
[Timer]
OnCalendar=*-*-* 04:00:00
Persistent=true
Unit=backup.service
[Install]
WantedBy=timers.target
Enable the timer and start it:
1$ sudo systemctl enable backup.timer
2$ sudo systemctl start backup.timer
Validate the timer will execute.
1$ systemctl list-timers backup.timer
2NEXT LEFT LAST PASSED UNIT ACTIVATES
3Tue 2023-03-28 04:00:00 UTC 6h left Mon 2023-03-27 20:41:33 UTC 1h 7min ago backup.timer backup.service
Alternative Procedure #
Add a line to the crontab. Use the command crontab -e
to add a line like the following:
0 4 * * * /path/to/backup/script
Validate that cron sees the new entry.
1$ crontab -l
Comments #
Systemd allows for a high degree of control when executing automated tasks, such as customizing the environment with resource limits and permissions and secure access of secret information like credentials. Logging and debugging of tasks uses the same toolset and processes as running other systemd services.
If this degree of control is not required, using cron is a simple and time-tested alternative.
References #
- systemd manual: systemd.timer Timer unit configuration.
- systemd manual: systemd.exec Execution environment configuration.
- Arch Linux Wiki: Systemd/Timers
- Red Hat System Administrator's Guide: Managing services with systemd