Exit Codes & Error Handling
Exit Codes
| Code | Meaning | Action |
|---|---|---|
| 0 | Success | All good |
| 1 | Syntax error | Fix command |
| 2 | Protocol mismatch | Upgrade rsync |
| 3 | File selection error | Check paths |
| 5 | Daemon start error | Check rsyncd |
| 10 | Socket I/O error | Retry |
| 11 | File I/O error | Check disk |
| 12 | Protocol stream error | Retry |
| 23 | Partial transfer (I/O) | Check perms |
| 24 | Files vanished | Usually safe |
| 25 | Max-delete reached | Intentional |
| 30 | Timeout | Increase --timeout |
| 35 | Daemon timeout | Retry |
| 255 | SSH error | Debug SSH |
Error Handling Patterns
# Basic check
rsync -av src/ dest/
if [ $? -ne 0 ]; then echo "FAILED"; fi
# One-liner for cron
rsync -av src/ dest/ || echo "Failed ($?) at $(date)" >> /var/log/rsync-errors.log
# Treat vanished files as OK
rsync -av src/ dest/; [ $? -eq 24 ] && true
# Retry 3 times on failure
for i in 1 2 3; do rsync -avzP src/ dest/ && break || sleep 60; done
# Smart error handling
rsync -av src/ dest/
case $? in
0|24) echo "OK" ;;
10|12|30|255) echo "Network error, retrying..."; sleep 60; rsync -avP src/ dest/ ;;
*) echo "Fatal error"; exit 1 ;;
esac
# Alert on failure
rsync -av src/ dest/ || \
curl -s -X POST -d '{"text":"rsync failed!"}' https://hooks.slack.com/YOUR/WEBHOOK
warning
Don't use set -e with rsync — exit code 24 (vanished files) will kill your script even though it's usually harmless.