Waktu adalah bahan bakar cron — dan timezone yang salah adalah penyebab job jalan di jam yang keliru atau dua kali. Episode ini membahas CRON_TZ=Asia/Jakarta, dampak Daylight Saving Time pada job harian, dan praktik terbaik: UTC untuk infrastruktur dan jadwal di jam stabil.

Di episode 15 kita memindahkan cron ke cluster Kubernetes. Sekarang kembali ke dasar yang sering diabaikan: waktu. Cron mencocokkan field waktu dengan jam sistem — dan jika jam sistem di zona waktu yang salah, atau zona waktu itu punya aturan Daylight Saving Time (DST), semua jadwal "benar" pun bisa berjalan di jam yang keliru.
Indonesia tidak menerapkan DST, tetapi banyak infrastruktur yang kalian kelola bisa terhubung dengan region yang menerapkannya (misal Eropa atau Amerika Utara). Episode ini membahas bagaimana cron menangani timezone dan DST, serta kebijakan yang menghindari masalah ini selamanya.
Cron secara default membaca jam waktu lokal host — dari localtime sistem. Inilah kenapa satu server di Jakarta dan satu di New York mengeksekusi 0 2 * * * pada waktu lokal masing-masing.
Cek timezone host:
timedatectl
dateCronie menyediakan CRON_TZ untuk mengatur zona waktu khusus crontab — tanpa mengubah zona host:
CRON_TZ=Asia/Jakarta
30 2 * * * /usr/local/bin/backup.shDengan CRON_TZ=Asia/Jakarta, jadwal dievaluasi di waktu Jakarta, apa pun zona host. Ini penting untuk job yang harus sinkron dengan waktu bisnis lokal — misal laporan yang harus jadi sebelum kantor buka pukul 07.00 WIB.
CRON_TZ=Asia/Jakarta
SHELL=/bin/bash
30 6 * * 1-5 /usr/local/bin/morning-report.shNote
CRON_TZ memakai database tzdata (IANA) — nama zona seperti Asia/Jakarta, Asia/Makassar, atau Etc/UTC. Nama ini harus valid; cek dengan timedatectl list-timezones | grep Asia. Nama zona lebih andal daripada offset seperti +7 karena mengikuti aturan DST secara otomatis.
Di zona waktu dengan DST, jam maju satu jam di musim semi ("spring forward") dan mundur di musim gugur ("fall back"). Dampaknya pada cron:
30 2 * * * tidak berjalan hari itu.Keduanya berpotensi merusak: job yang lewat, dan job yang dobel.
Bahkan server di Indonesia bisa terkena dampak ini jika:
CRON_TZ menunjuk zona ber-DST, atauKebijakan yang paling banyak dipakai di industri: seluruh infrastruktur memakai UTC, dan konversi ke zona lokal dilakukan di lapisan presentasi (aplikasi), bukan di penjadwalan.
sudo timedatectl set-timezone UTC
timedatectlKeuntungannya:
Untuk job yang harus berjalan di jam lokal tertentu sementara host memakai UTC, ekspresikan dalam UTC:
30 19 * * * /usr/local/bin/backup.shAtau kombinasikan dengan CRON_TZ jika lebih jelas secara bisnis:
CRON_TZ=Asia/Jakarta
30 2 * * * /usr/local/bin/backup.shTip
Pilih salah satu pola dan konsisten. Campur UTC dan CRON_TZ tanpa dokumentasi adalah sumber kebingungan terbesar. Rekomendasi: host dan log dalam UTC, CRON_TZ hanya untuk job yang memang mengikuti waktu bisnis lokal, dan selalu tulis komentar di crontab menjelaskan zona yang dipakai.
| Situasi | Praktik |
|---|---|
| Infrastruktur umum | Host UTC, log UTC |
| Job mengikuti waktu bisnis lokal | CRON_TZ=Asia/Jakarta |
| Region ber-DST | Hindari jam yang lompat; gunakan UTC |
| Job harian sensitif | Jadwalkan di jam stabil, hindari jam 02.00 di zona DST |
| Koordinasi tim | Satu bahasa: UTC |
Inti yang harus dibawa pulang:
CRON_TZ mengatur zona per crontab.CRON_TZ hanya untuk job yang mengikuti waktu bisnis lokal.Di episode 17 selanjutnya kita akan membahas Cronie 1.7.x dan fitur terbarunya — perbaikan MAILFROM, opsi -n untuk menunggu job selesai, anacron terintegrasi, dan perbandingan lengkap cronie vs vixie-cron vs systemd timers vs at!