Table of Contents
-
- What is Cron?
- Cron Syntax Explained
- Managing Crontabs
-
- Choosing a Backup Tool (rsync vs. tar)
- Writing a Robust Backup Script
- Testing the Script Manually
-
- Editing the Crontab
- Example Cron Job Entries
- Verifying Cron is Running
-
Monitoring and Troubleshooting Cron Backups
- Logging Backup Output
- Common Cron Issues and Fixes
- Checking Cron Job Status
-
- Incremental Backups with rsync
- Rotating Old Backups
- Securing Backups (Encryption, Offsite Storage)
1. Understanding Cron Jobs
What is Cron?
Cron is a daemon (background service) in Linux that executes scheduled commands or scripts at predefined intervals. It’s ideal for automating repetitive tasks like backups, log rotation, or system updates. Cron jobs are defined in a crontab (cron table), a text file that stores job schedules for individual users.
Cron Syntax Explained
A crontab entry has six fields (five for timing, one for the command):
* * * * * command_to_execute
- - - - -
| | | | |
| | | | +-- Day of the Week (0=Sunday, 6=Saturday, or 7=Sunday)
| | | +---- Month (1-12)
| | +------ Day of the Month (1-31)
| +-------- Hour (0-23)
+---------- Minute (0-59)
*(asterisk): Wildcard for “every” (e.g.,*in the minute field = “every minute”).,(comma): List of values (e.g.,1,3,5in the hour field = “1 AM, 3 AM, 5 AM”).-(hyphen): Range of values (e.g.,10-15in the minute field = “minutes 10 to 15”)./(slash): Step interval (e.g.,*/15in the minute field = “every 15 minutes”).
Examples:
0 3 * * * /backup/script.sh: Run daily at 3:00 AM.30 8 * * 1 /backup/weekly.sh: Run every Monday at 8:30 AM.
Managing Crontabs
- Edit crontab: Use
crontab -eto open the crontab editor for the current user. - List crontabs:
crontab -lshows all scheduled jobs for the current user. - Delete crontabs:
crontab -rremoves all jobs (use with caution!). - System-wide crontabs: Stored in
/etc/crontabor/etc/cron.d/(requires root access).
2. Preparing a Backup Script
Before scheduling a cron job, you need a reliable backup script. We’ll use rsync (for efficient file synchronization) and tar (for archiving) in this example.
Choosing a Backup Tool
- rsync: Ideal for incremental backups (only copies changed files) and syncing to remote servers (via SSH).
- tar: Best for creating compressed archives (e.g.,
.tar.gz) of directories.
We’ll combine both: use rsync to sync files to a local backup directory, then tar to compress and archive critical data.
Sample Backup Script
Create a script (e.g., backup_script.sh) with the following components:
#!/bin/bash
# --------------------------
# Backup Configuration
# --------------------------
SOURCE_DIR="/home/user/documents" # Directory to back up
BACKUP_DIR="/mnt/external_drive/backups" # Backup destination
LOG_FILE="/var/log/backup_script.log" # Log file path
DATE=$(date +%Y-%m-%d_%H-%M-%S) # Timestamp for backup files
BACKUP_ARCHIVE="$BACKUP_DIR/backup_$DATE.tar.gz" # Archive name
# --------------------------
# Create Backup Directory if Missing
# --------------------------
mkdir -p "$BACKUP_DIR" || { echo "Error: Failed to create $BACKUP_DIR" | tee -a "$LOG_FILE"; exit 1; }
# --------------------------
# Sync Files with rsync (Incremental Backup)
# --------------------------
echo "Starting rsync sync at $(date)" | tee -a "$LOG_FILE"
rsync -av --delete "$SOURCE_DIR/" "$BACKUP_DIR/latest/" # --delete removes files in dest not in source
if [ $? -ne 0 ]; then
echo "Error: rsync failed at $(date)" | tee -a "$LOG_FILE"
exit 1
fi
# --------------------------
# Compress Latest Backup to Tarball
# --------------------------
echo "Creating compressed archive: $BACKUP_ARCHIVE" | tee -a "$LOG_FILE"
tar -czf "$BACKUP_ARCHIVE" "$BACKUP_DIR/latest/"
if [ $? -ne 0 ]; then
echo "Error: tar failed to create archive at $(date)" | tee -a "$LOG_FILE"
exit 1
fi
# --------------------------
# Cleanup: Delete Archives Older Than 30 Days
# --------------------------
echo "Cleaning up old backups..." | tee -a "$LOG_FILE"
find "$BACKUP_DIR" -name "backup_*.tar.gz" -type f -mtime +30 -delete
# --------------------------
# Backup Success
# --------------------------
echo "Backup completed successfully at $(date)" | tee -a "$LOG_FILE"
echo "----------------------------------------" | tee -a "$LOG_FILE"
Script Breakdown
- Shebang:
#!/bin/bashspecifies the script should run with Bash. - Variables: Define paths, timestamps, and filenames for clarity.
- Error Handling:
mkdir -p ... || { ... exit 1; }checks if directory creation fails. - rsync Options:
-a: Archive mode (preserves permissions, timestamps).-v: Verbose output (logs details).--delete: Ensures the backup matches the source (deletes obsolete files).
- Tar Compression:
tar -czfcreates a compressed.tar.gzarchive. - Cleanup:
find ... -mtime +30 -deleteremoves backups older than 30 days.
Make the Script Executable
Run the following command to make the script executable:
chmod +x /path/to/backup_script.sh
Test the Script Manually
Always test the script before adding it to cron:
sudo /path/to/backup_script.sh
Check the log file (/var/log/backup_script.log) and backup directory to verify success.
3. Scheduling Backups with Cron
Once the script works, schedule it with cron.
Edit Crontab
Run crontab -e and add a line to schedule the job. For example, to run daily at 2:00 AM:
# Daily backup at 2:00 AM
0 2 * * * /path/to/backup_script.sh
Important Notes for Cron Jobs
- Full Paths: Cron has a limited environment (no
PATHvariables), so use absolute paths for scripts, commands, and files (e.g.,/usr/bin/rsyncinstead ofrsync). - Log Output: Redirect output to a log file to debug issues:
(0 2 * * * /path/to/backup_script.sh >> /var/log/cron_backup.log 2>&12>&1redirects errors to the log file.) - Permissions: Ensure the cron user (usually your user or
root) has read access toSOURCE_DIRand write access toBACKUP_DIR.
Verify Cron is Running
Check if the cron daemon is active:
systemctl status cron # Debian/Ubuntu
# or
systemctl status crond # RHEL/CentOS/Fedora
If inactive, start and enable it:
sudo systemctl start cron
sudo systemctl enable cron # Run on boot
4. Monitoring and Troubleshooting Cron Backups
Even with a working script, cron jobs can fail. Here’s how to monitor and fix issues.
Check Backup Logs
- Script Logs: Review
LOG_FILE(e.g.,/var/log/backup_script.log) for errors like “permission denied” or “rsync failed.” - Cron Logs: Cron logs are stored in
/var/log/syslog(Debian/Ubuntu) or/var/log/cron(RHEL/CentOS). Search for cron entries:grep CRON /var/log/syslog
Common Cron Issues and Fixes
| Issue | Cause | Fix |
|---|---|---|
| Script doesn’t run | Incorrect path in crontab | Use absolute path: /home/user/backup_script.sh |
| ”Permission denied” | Cron user lacks access to SOURCE_DIR or BACKUP_DIR | Run cron job as root (add to /etc/crontab) or adjust file permissions. |
| rsync/tar not found | Cron’s PATH doesn’t include /usr/bin | Use full command paths: /usr/bin/rsync, /usr/bin/tar. |
| Backup destination full | No cleanup step in script | Add find ... -delete to remove old backups (as in the sample script). |
5. Advanced Backup Strategies
Incremental Backups with rsync --link-dest
For space-efficient backups, create incremental snapshots with hard links to unchanged files:
# In backup_script.sh, replace rsync line with:
rsync -av --link-dest="$BACKUP_DIR/latest" "$SOURCE_DIR/" "$BACKUP_DIR/snapshot_$DATE/"
ln -nsf "$BACKUP_DIR/snapshot_$DATE" "$BACKUP_DIR/latest" # Update "latest" symlink
Rotating Backups with logrotate
Use logrotate to manage backup logs or old archives. Create a config file (e.g., /etc/logrotate.d/backup_logs):
/var/log/backup_script.log {
weekly
rotate 4 # Keep 4 weeks of logs
compress
missingok
notifempty
}
Security Best Practices
- Encrypt Backups: Use
gpgto encrypt archives:tar -czf - "$BACKUP_DIR/latest/" | gpg -c -o "$BACKUP_ARCHIVE.gpg" # Encrypt with password - Offsite Storage: Sync backups to a remote server with
rsync -e ssh user@remote:/backup/dir. - Restrict Crontab Access: Use
/etc/cron.allowand/etc/cron.denyto control who can edit crontabs.
6. Conclusion
Automating Linux backups with cron jobs ensures your data is protected without manual intervention. By combining robust scripts (with rsync and tar), scheduling with cron, and monitoring logs, you can build a reliable backup system. Remember to test scripts, secure backups, and rotate old files to keep storage manageable.