Job cron yang "jalan" belum tentu andal: jika berjalan lebih lama dari intervalnya, ia bisa tumpang tindih dan merusak data. Episode ini mengajarkan flock untuk lock, retry dengan backoff, script idempotent, dan timeout — pola-pola yang membuat job layak produksi.

Di episode 8 kita memahami anacron dan system directories. Sekarang kita naik satu tingkat: dari "job jalan" menjadi "job andal". Perbedaan keduanya terlihat saat terjadi hal tak terduga — job berjalan dua menit lebih lama, script crash di tengah jalan, atau server kelebihan beban.
Ada tiga pilar keandalan yang akan kita bangun: lock (cegah tumpang tindih), retry (hadapi kegagalan sementara), dan idempotency (jalankan ulang dengan aman), ditambah timeout sebagai jaring pengaman.
Bayangkan backup yang biasanya selesai 40 menit, lalu suatu hari berjalan 70 menit. Dengan jadwal setiap jam, instance berikutnya mulai sebelum yang pertama selesai — dua proses backup berjalan bersamaan, saling menimpa file, dan merusak keduanya.
Cron tidak mencegah ini secara bawaan. Kalian harus melakukannya sendiri.
flock mengunci file dan hanya menjalankan perintah jika lock tersedia:
0 * * * * flock -n /var/lock/backup.lock /usr/local/bin/backup.sh-n (non-blocking): jika lock sudah dipegang proses lain, perintah tidak dijalankan — tidak menunggu.-n.Hasilnya: job kedua yang tumpang tindih langsung keluar tanpa merusak apapun.
Untuk kontrol penuh dan log yang jelas, gunakan flock di dalam script:
#!/bin/bash
set -euo pipefail
exec 9>/var/lock/backup.lock
if ! flock -n 9; then
echo "Job sebelumnya masih berjalan, keluar." >> /var/log/backup.log
exit 1
fi
rsync -a /data /backup >> /var/log/backup.log 2>&1Trik lama yang tetap berguna — direktori bersifat atomik:
if ! mkdir /var/lock/backup.run 2>/dev/null; then
echo "Lock sudah ada."; exit 1
fi
trap 'rmdir /var/lock/backup.run' EXITmkdir yang gagal berarti lock sudah dipegang. trap ... EXIT memastikan lock dibersihkan meski script error.
Warning
Saat menggunakan lock, selalu tangani kegagalan untuk mendapat lock secara eksplisit. Jika tidak, job kedua akan "gagal diam-diam" — dan tidak ada yang tahu. Tulis pesan ke log, dan (di episode 12) kirim alert.
Jaringan putus sesaat, database restart — banyak kegagalan sementara yang sembuh dengan percobaan ulang. Retry sederhana dengan loop:
#!/bin/bash
MAX=3
for i in $(seq 1 $MAX); do
if curl -fsS https://api.example.com/sync; then
exit 0
fi
echo "Percobaan $i gagal, menunggu..." >> /var/log/sync.log
sleep $((i * 30))
done
echo "Gagal setelah $MAX percobaan" >> /var/log/sync.log
exit 1Pola backoff (sleep makin lama tiap percobaan) menghindari membebani layanan yang sedang bermasalah. Jangan retry dengan interval tetap tanpa batas — tetapkan batas, lalu gagal dengan exit code jelas.
Idempotent berarti menjalankan operasi berkali-kali memberi hasil yang sama seperti sekali jalan. Backup full yang menimpa dengan data terbaru, sinkronisasi yang menghasilkan state sama — semuanya idempotent.
rsync -a --delete /data/ /backup/ # hasil akhir selalu sama
pg_dump -Fc db > /backup/db.dump # menimpa, bukan menumpukLawan dari idempotent: script yang menumpuk — misalnya pg_dump >> file atau membuat file baru setiap kali tanpa membersihkan yang lama. Job yang dijalankan ulang setelah retry akan menghasilkan duplikat.
Script bisa hang — menunggu jaringan, lock yang tak pernah lepas. timeout memotong proses setelah durasi tertentu:
0 * * * * timeout 30m /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1timeout 30m membunuh proses (default SIGTERM) jika melebihi 30 menit. Tanpa ini, job yang hang menutup lock selamanya dan memblokir semua eksekusi berikutnya.
Tip
Kombinasi produksi yang lengkap: flock -n (anti-tumpang-tindih) + timeout (anti-hang) + retry internal (anti-gagal-sementara) + idempotency (aman diulang). Empat lapis ini menjadikan job cron hampir tidak mungkin melukai sistem.
| Pattern | Masalah yang Diselesaikan | Alat |
|---|---|---|
| Lock | Dua job tumpang tindih | flock -n, mkdir |
| Retry | Kegagalan sementara | Loop + backoff |
| Idempotency | Duplikat saat diulang | --delete, timpa bukan append |
| Timeout | Job hang tanpa akhir | timeout 30m |
Inti yang harus dibawa pulang:
flock -n.timeout mencegah job hang memblokir segalanya.Di episode 10 selanjutnya kita akan mengaplikasikan semua ini ke kasus nyata: otomasi backup dan maintenance — menjadwalkan rsync, restic, dan pg_dump, memverifikasi hasil backup, plus logrotate, cleanup tmp, dan update paket yang hati-hati!