systemd timers adalah penerus modern cron dengan dependensi antar unit, logging journald terpusat, dan RandomizedDelaySec. Episode ini membangun unit .timer + .service, memakai OnCalendar= dan OnBootSec, menyalakan Persistent=, lalu memetakan kapan dan bagaimana pindah dari cron.

Di episode 17 kita membandingkan cronie dengan systemd timers. Sekarang kita pelajari lawannya itu secara penuh — karena di distro berbasis systemd, timer adalah alternatif yang semakin sering jadi pilihan default untuk tugas baru. systemd timers bukan sekadar "cron versi systemd": ia membawa tiga hal yang tidak dimiliki cron — dependensi antar unit, logging terpusat di journald, dan randomisasi bawaan (RandomizedDelaySec). Episode ini membangun timer pertama kalian dan memetakan kapan saatnya pindah.
Timer bekerja berpasangan: file .timer (jadwal) dan file .service (perintah yang dijalankan).
[Unit]
Description=Backup harian
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh[Unit]
Description=Jadwal backup harian 02.30
[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true
[Install]
WantedBy=timers.targetsudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
systemctl list-timerssystemctl list-timers menampilkan jadwal, waktu eksekusi berikutnya, dan waktu terakhir — dasbor jadwal yang jauh lebih baik daripada crontab -l.
OnCalendar= menerima jadwal kalender yang ekspresif — eksplorasi format penuh dengan systemd-analyze calendar:
OnCalendar=*-*-* 02:30:00 # setiap hari 02.30
OnCalendar=Mon-Fri 22:00:00 # hari kerja pukul 22.00
OnCalendar=*-*-1,15 00:00:00 # tanggal 1 & 15
OnCalendar=hourly # setiap jamSelain jadwal kalender, systemd mendukung timer monotonik — dihitung dari event (boot, aktivasi unit), bukan dari jam kalender:
OnBootSec=10min # 10 menit setelah boot
OnUnitActiveSec=1h # 1 jam setelah aktivasi terakhir
OnUnitInactiveSec=2hPola ini tidak bisa dibuat cron — berguna untuk job yang harus berjalan sesudah boot tanpa harus tahu jam kalender.
Persistent=true pada OnCalendar= menjalankan job yang terlewat saat sistem mati — setara anacron. Saat mesin menyala kembali dan ternyata 02.30 sudah lewat, timer langsung menjalankan service:
[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=trueAfter=, Requires=, Wants= memungkinkan job menunggu layanan lain:
[Unit]
Description=Backup DB
After=postgresql.service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/pg_backup.shSemua output service masuk journald otomatis — tanpa redirect manual >> log 2>&1 seperti di cron (episode 5):
journalctl -u backup.service -n 20
journalctl -u backup.timerSetara sleep $((RANDOM % 300)) dari episode 11, tetapi bawaan:
[Timer]
OnCalendar=*-*-* 02:30:00
RandomizedDelaySec=300Sintaks OnCalendar berbeda total dari crontab (kurva belajar baru), memerlukan systemd sehingga tidak berguna di container non-systemd atau BSD, dan jadwal yang kompleks tetap lebih mudah dibaca sebagai crontab.
Pindah ke timer saat butuh dependensi antar unit, logging journald terpusat, atau random delay/persistent built-in. Tetap pakai cron di host non-systemd atau yang ingin portabilitas, dan gunakan entrypoint loop untuk container (episode 15).
Tip
Jangan migrasi semua crontab sekaligus. Mulai dari job baru, atau job yang memang butuh keunggulan timer (dependensi/journald). Migrasi bertahap memungkinkan tim belajar sintaks baru tanpa risiko downtime massal.
Inti yang harus dibawa pulang:
.timer (jadwal) + .service (perintah).OnCalendar= untuk kalender; OnBootSec/OnUnitActiveSec untuk monotonik.Persistent=true mengejar job yang terlewat (padanan anacron).RandomizedDelaySec untuk randomisasi.Di episode 19 selanjutnya kita akan membahas distributed scheduling: K8s CronJob lanjut — startingDeadlineSeconds, suspend, successfulJobsHistoryLimit, job parallelism, serta alternatif Argo Workflows dan KEDA Cron scaler untuk workload besar!