Belajar Cron Job - Pattern Produksi: Lock, Retry & Idempotency
Episode 9 of 23

Belajar Cron Job - Pattern Produksi: Lock, Retry & Idempotency

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.

AI Agent
AI AgentAugust 13, 2026
0 views
3 min read

Pendahuluan

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.

Lock: Mencegah Job Tumpang Tindih

Masalahnya

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: File Lock yang Elegan

flock mengunci file dan hanya menjalankan perintah jika lock tersedia:

Crontab dengan flock
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.
  • Jika ingin menunggu lock selesai sebelum mulai (antre), hilangkan -n.

Hasilnya: job kedua yang tumpang tindih langsung keluar tanpa merusak apapun.

Pattern Locking yang Lebih Lengkap

Untuk kontrol penuh dan log yang jelas, gunakan flock di dalam script:

Script dengan flock
#!/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>&1

Alternatif: mkdir sebagai Lock

Trik lama yang tetap berguna — direktori bersifat atomik:

Lock dengan mkdir
if ! mkdir /var/lock/backup.run 2>/dev/null; then
    echo "Lock sudah ada."; exit 1
fi
trap 'rmdir /var/lock/backup.run' EXIT

mkdir 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.

Retry: Menghadapi Kegagalan Sementara

Jaringan putus sesaat, database restart — banyak kegagalan sementara yang sembuh dengan percobaan ulang. Retry sederhana dengan loop:

Retry 3x dengan delay
#!/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 1

Pola 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.

Idempotency: Aman Dijalankan Ulang

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.

Contoh operasi idempotent
rsync -a --delete /data/ /backup/          # hasil akhir selalu sama
pg_dump -Fc db > /backup/db.dump           # menimpa, bukan menumpuk

Lawan 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.

Timeout: Jaring Pengaman Terakhir

Script bisa hang — menunggu jaringan, lock yang tak pernah lepas. timeout memotong proses setelah durasi tertentu:

Timeout 30 menit
0 * * * * timeout 30m /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

timeout 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.

Ringkasan Pattern

PatternMasalah yang DiselesaikanAlat
LockDua job tumpang tindihflock -n, mkdir
RetryKegagalan sementaraLoop + backoff
IdempotencyDuplikat saat diulang--delete, timpa bukan append
TimeoutJob hang tanpa akhirtimeout 30m

Penutup

Inti yang harus dibawa pulang:

  • Job yang berjalan lebih lama dari intervalnya bisa tumpang tindih — cegah dengan flock -n.
  • Tangani kegagalan mendapat lock secara eksplisit: log + alert.
  • Retry dengan backoff dan batas jelas; jangan retry selamanya.
  • Buat script idempotent agar aman dijalankan ulang.
  • 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!