Mengotomatiskan backup rsync dengan cron: menjadwalkan lewat crontab, mengarahkan output ke log file, memahami exit code rsync (0 sukses, 23 partial), notifikasi email saat gagal, dan lock file untuk mencegah dua proses backup berjalan bersamaan.

Backup yang dikerjakan manual adalah backup yang tidak akan pernah dikerjakan. Episode 9 memberi kalian skrip snapshot yang siap jalan; episode 10 menempelkannya ke cron — penjadwal bawaan Linux — sehingga backup berjalan sendiri setiap malam, tanpa kalian mengetik apa pun.
Tapi penjadwalan saja tidak cukup. Otomasi yang andal butuh tiga hal: log (apa yang terjadi), exit code (apakah sukses), dan notifikasi (siapa yang tahu saat gagal). Episode ini membangun ketiganya.
Cron membaca jadwal dari crontab, diformat lima kolom:
minute hour day-of-month month day-of-week commandBuka editor crontab dan tambahkan entri backup:
crontab -e30 2 * * * /usr/local/bin/backup-rsync.sh >> /var/log/rsync.log 2>&130 2 * * * berarti setiap hari pukul 02.30. Waktu tersebut dipilih karena jam 2-3 pagi umumnya paling sepi. >> /var/log/rsync.log 2>&1 mengarahkan stdout dan stderr ke file log — kebiasaan yang wajib, karena tanpa redirect cron akan mengirim output ke email lokal yang jarang dibaca.
Jangan taruh seluruh perintah rsync langsung di crontab — bungkus dalam skrip agar bisa menambah logika:
#!/bin/bash
LOG=/var/log/rsync.log
echo "=== $(date) rsync mulai ===" >> "$LOG"
rsync -avhP --partial-dir=.rsync-partial \
/home/data/ /backup/daily/ >> "$LOG" 2>&1
RC=$?
echo "=== $(date) rsync selesai, exit=$RC ===" >> "$LOG"
exit $RCchmod +x /usr/local/bin/backup-rsync.sh lalu uji manual sekali sebelum dijadwalkan. Skrip ini menulis marka waktu di log sehingga setiap run mudah ditelusuri.
Exit code adalah bahasa rsync kepada cron. Nilai yang paling sering kalian temui:
| Exit | Arti |
|---|---|
0 | Sukses — semua data tersinkron |
1 | Error syntax/usage |
3 | Error proteksi file yang dipilih |
5 | Error I/O |
11 | Error I/O file |
23 | Partial transfer — sebagian file gagal (file hilang/berubah saat transfer) |
24 | Sebagian file source menghilang |
255 | Error koneksi/SSH |
23 adalah kode yang paling sering membingungkan: secara logis itu "tidak sepenuhnya sukses", dan script kalian harus memperlakukannya sebagai kegagalan untuk notifikasi — tetapi tahu bahwa sebagian data sudah terkirim.
Warning
Exit code 0 berarti "tidak ada error fatal", bukan "tidak ada yang berubah". File yang berubah saat transfer (vanished) menghasilkan exit 23/24 — data tidak konsisten. Jangan abaikan; log harus memuat pesan rsync warning yang menyertainya.
Mengirim email saat gagal mengubah backup dari "silent" menjadi "terpantau":
#!/bin/bash
LOG=/var/log/rsync.log
ADMIN=admin@example.com
rsync -avh /home/data/ /backup/daily/ >> "$LOG" 2>&1
RC=$?
if [ $RC -ne 0 ]; then
tail -50 "$LOG" | mail -s "Backup GAGAL (exit $RC) - $(hostname)" "$ADMIN"
fi
exit $RCmail mengirim ringkasan log terakhir ke alamat admin. Di server modern yang jarang punya MTA, alternatifnya: sendmail, curl ke webhook (Slack/Telegram), atau integrasi alerting di episode 20.
Bayangkan backup malam melebihi 24 jam (dataset besar), lalu cron besok malam menjalankan yang kedua — dua rsync menulis ke tujuan yang sama secara bersamaan. Hasilnya korupsi dan log yang kacau. Solusinya lock file:
#!/bin/bash
exec 9>/var/lock/rsync-backup.lock
if ! flock -n 9; then
echo "$(date) backup lain masih berjalan, skip." >> /var/log/rsync.log
exit 1
fi
rsync -avh /home/data/ /backup/daily/ >> /var/log/rsync.log 2>&1flock -n 9 mengunci file descriptor 9 secara non-blok. Jika backup sebelumnya masih berjalan, cron berikutnya langsung exit dengan pesan skip — bukan menumpuk proses. Ini pola wajib untuk backup dataset besar.
Tip
Kombinasi flock + --timeout + --partial-dir (episode 7) membuat backup cron nyaris tak pernah gagal permanen: transfer yang putus di-restart, yang bertabrakan di-skip, dan yang menggantung di-putus.
.bashrc/.profile tidak dibaca cron. Gunakan path absolut (/usr/bin/rsync, /usr/bin/date) atau set PATH=/usr/local/bin:/usr/bin:/bin di awal skrip.-e "ssh -i /root/.ssh/backup"); agent dari shell interaktif tidak tersedia di cron. Detailnya di episode 14.Setelah menulis crontab, pastikan daemon cron aktif dan entri tersimpan:
systemctl is-active cron
crontab -lcrontab -l menampilkan jadwal tersimpan. Uji juga skrip secara manual terlebih dahulu, lalu biarkan cron mengambil alih — dan jangan lupa cek log keesokan paginya.
Pada episode 10 ini, kalian telah mengotomatiskan backup rsync secara andal.
Inti yang harus dibawa pulang:
>> /var/log/rsync.log 2>&1.0 sukses, 23 partial transfer — perlakukan sebagai kegagalan.flock -n mencegah dua backup berjalan bersamaan.Di episode 11 selanjutnya, kita pakai semua skill ini untuk pekerjaan besar: migrasi server & directory sync — memindahkan home/var/www/database dump antar server dengan --numeric-ids dan -H (hardlink), plus diskusi jujur tentang keterbatasan rsync untuk sync dua arah dan solusinya (unison). Sampai jumpa di episode 11!