When setting up automated backups with rsync and cron, missing email notifications can leave you blind to potential failures. The command structure you're using:
0 23 * * * /usr/bin/rsync -ravzX /mnt/external/project/ /media/backup/project/ | mail -s "Backup Success" admin@example.com
appears correct at first glance, but several technical factors could prevent delivery.
1. Verify Mail System Installation
# Check if mailutils or equivalent is installed
which mail || sudo apt-get install mailutils
2. Test Direct Mail Functionality
echo "Test message" | mail -s "SMTP Test" admin@example.com
3. Check Cron Environment Variables
# View cron's environment
grep -A5 "PATH=" /etc/crontab
Solution A: Full Path Specification
0 23 * * * /usr/bin/rsync -ravzX /mnt/external/project/ /media/backup/project/ 2>&1 | /usr/bin/mail -s "Backup Log" admin@example.com
Solution B: External Script Approach
#!/bin/bash
LOG_FILE=/var/log/backup_$(date +\%Y\%m\%d).log
/usr/bin/rsync -ravzX /mnt/external/project/ /media/backup/project/ > $LOG_FILE 2>&1
if [ $? -eq 0 ]; then
SUBJECT="Backup Success"
else
SUBJECT="Backup FAILED"
fi
/bin/mail -s "$SUBJECT" admin@example.com < $LOG_FILE
For enterprise environments, consider these robust alternatives:
# Using mutt with authentication
0 23 * * * /usr/bin/rsync -ravzX /mnt/external/project/ /media/backup/project/ > /tmp/rsync.log 2>&1 && \
/usr/bin/mutt -a /tmp/rsync.log -s "Rsync Report" -- admin@example.com < /dev/null
Or with SSMTP configuration:
# /etc/ssmtp/ssmtp.conf
mailhub=smtp.gmail.com:587
UseSTARTTLS=YES
AuthUser=your@gmail.com
AuthPass=yourpassword
FromLineOverride=YES
Implement comprehensive logging:
# Enhanced cron entry with logging
0 23 * * * /usr/bin/rsync -ravzX /mnt/external/project/ /media/backup/project/ > /var/log/backup.log 2>&1 || \
/usr/bin/mail -s "BACKUP FAILURE $(hostname)" admin@example.com < /var/log/backup.log
Symptom | Diagnostic Command | Solution |
---|---|---|
No mail received | sudo tail -f /var/log/mail.log |
Configure local MTA or use external SMTP |
Cron job runs but no output | grep CRON /var/log/syslog |
Redirect stderr to stdout with 2>&1 |
Permission errors | ls -la /usr/bin/mail |
Adjust PATH in crontab or use full paths |
When setting up automated backups using rsync via cron, many sysadmins encounter email delivery issues. The common approach of piping output to mail
often fails silently, leaving you unaware of backup status.
The basic command structure:
0 23 * * * /usr/bin/rsync -ravzX /mnt/external/project/ /media/backup/project/ | mail -s "Backup Success" admin@example.com
fails for several technical reasons:
- Missing MTA (Mail Transfer Agent) configuration
- No error handling for failed backups
- Incorrect assumption that rsync output will trigger email
Option 1: Configure Postfix for Local Mail
First install and configure a minimal MTA:
sudo apt-get install postfix mailutils
# Select "Internet Site" during installation
# Test email functionality:
echo "Test message" | mail -s "Test" admin@example.com
Option 2: Wrapper Script with Error Handling
Create /usr/local/bin/backup_notify.sh
:
#!/bin/bash
LOG=/var/log/backup.log
echo "Backup started at $(date)" > $LOG
rsync -ravzX /mnt/external/project/ /media/backup/project/ >> $LOG 2>&1
if [ $? -eq 0 ]; then
SUBJECT="Backup Success"
else
SUBJECT="Backup FAILED"
fi
mail -s "$SUBJECT" admin@example.com < $LOG
Make it executable: chmod +x /usr/local/bin/backup_notify.sh
Option 3: Advanced SMTP Configuration
For external SMTP servers, configure /etc/ssmtp/ssmtp.conf
:
root=admin@example.com
mailhub=smtp.example.com:587
AuthUser=username
AuthPass=password
UseSTARTTLS=YES
Always verify your setup:
# Check mail queue
mailq
# View mail logs
tail -f /var/log/mail.log
# Test cron job manually
/usr/local/bin/backup_notify.sh
For critical systems, consider supplementing email with:
- Slack/Teams webhooks
- SMS gateways
- Custom monitoring solutions
Example curl notification:
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"Backup completed"}' \
https://hooks.slack.com/services/YOUR/WEBHOOK/PATH