Lewati ke isi

Server & Infrastruktur

Cara Memakai systemd Timer sebagai Pengganti Cron

systemd timer bisa menggantikan cron dengan log rapi dan jadwal yang tidak terlewat saat server mati. Ini cara membuatnya dan kapan cron masih lebih pas.

Terbit 5 menit baca

Jawaban singkat

systemd timer menjalankan tugas terjadwal lewat pasangan file .service dan .timer. Kelebihannya log otomatis di journalctl, opsi Persistent untuk mengejar jadwal yang terlewat, dan batas CPU atau RAM. Cron tetap lebih ringkas untuk tugas sederhana.

Daftar isi
  1. Bagaimana systemd timer bekerja?
  2. Dua file untuk satu tugas
  3. Membaca jadwal OnCalendar
  4. Memantau dan menguji
  5. Perbandingan systemd timer dan cron
  6. Kapan memilih cron, kapan systemd timer
  7. Bagaimana memindahkan tugas cron ke timer?
  8. Pertanyaan yang sering diajukan

systemd timer adalah unit systemd yang tugasnya menjalankan unit lain, biasanya sebuah service, pada waktu tertentu atau setelah jeda tertentu. Fungsinya sama dengan cron, tapi tugasnya diperlakukan sebagai service penuh: punya log, status, dependensi, dan batas sumber daya.

Pilihan ini tidak menentukan hidup matinya server, tapi menentukan seberapa cepat kamu tahu ketika backup malam tidak jalan. Dengan cron, kegagalan sering baru ketahuan berhari-hari kemudian. Dengan timer, status terakhir dan lognya bisa dicek dengan satu perintah.

Bagaimana systemd timer bekerja?

Dua file untuk satu tugas

Satu tugas terjadwal butuh dua file di /etc/systemd/system/. File .service berisi apa yang dijalankan. File .timer berisi kapan menjalankannya. Bila namanya sama, timer otomatis memicu service pasangannya.

Contoh backup database setiap pukul 02.30. File pertama, backup-db.service:

[Unit]
Description=Backup database harian

[Service]
Type=oneshot
User=backup
ExecStart=/usr/local/bin/backup-db.sh

File kedua, backup-db.timer:

[Unit]
Description=Jadwal backup database harian

[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true
RandomizedDelaySec=5min

[Install]
WantedBy=timers.target

Aktifkan timer-nya, bukan service-nya:

sudo systemctl daemon-reload
sudo systemctl enable --now backup-db.timer

Type=oneshot cocok untuk skrip yang berjalan lalu selesai. Isi skrip backup-nya sendiri bisa mengikuti cara backup MySQL dan PostgreSQL otomatis.

Membaca jadwal OnCalendar

Format OnCalendar adalah HariMinggu Tahun-Bulan-Tanggal Jam:Menit:Detik, dengan * sebagai "apa saja". Ada juga singkatan seperti hourly, daily, weekly, dan monthly. Beberapa contoh:

  • Mon..Fri 08:00 untuk setiap hari kerja pukul 08.00.
  • *-*-01 03:00 untuk tanggal 1 setiap bulan pukul 03.00.
  • *:0/15 untuk setiap 15 menit.

Sebelum dipakai, uji jadwalnya dengan:

systemd-analyze calendar "Mon..Fri 08:00"

Perintah ini menampilkan bentuk baku jadwal dan kapan berikutnya akan berjalan. Fitur ini sendiri sudah mencegah banyak salah ketik yang di cron baru ketahuan setelah tugasnya tidak jalan.

Selain jadwal kalender, timer juga bisa berbasis jeda. OnBootSec=10min menjalankan tugas 10 menit setelah boot, dan OnUnitActiveSec=1h menjalankannya lagi satu jam setelah eksekusi terakhir.

Memantau dan menguji

systemctl list-timers
systemctl status backup-db.service
journalctl -u backup-db.service --since today
sudo systemctl start backup-db.service

list-timers menampilkan kapan setiap timer terakhir dan berikutnya berjalan. Perintah terakhir menjalankan tugas saat itu juga untuk uji coba, tanpa menunggu jadwal.

Perbandingan systemd timer dan cron

AspekCronsystemd timer
Jumlah file per tugasSatu baris di crontabDua file (.service dan .timer)
LogHarus diarahkan sendiri, atau dikirim lewat email bila MAILTO diaturOtomatis di journalctl
Jadwal terlewat saat server matiDilewatiDikejar saat boot bila Persistent=true
Mencegah tugas berjalan gandaPerlu flock atau trik lainService yang masih aktif tidak dijalankan ulang
Uji format jadwalTidak ada alat bawaansystemd-analyze calendar
Batas CPU, RAM, waktuTidak ada bawaanBisa, lewat opsi service seperti MemoryMax=
Notifikasi gagalEmail dari cronPerlu OnFailure= ke unit lain
Akurasi bawaanPer menitDefault AccuracySec=1min, bisa diperketat

Kapan memilih cron, kapan systemd timer

Cron tetap pilihan yang wajar untuk tugas kecil dan cepat, misalnya membersihkan file sementara atau memanggil satu URL. Satu baris crontab lebih cepat dibuat dan dibaca, dan hampir semua admin sudah paham formatnya. Cron juga tersedia di sistem tanpa systemd, termasuk banyak container dan beberapa hosting bersama. Panduan formatnya ada di cara membuat cron job di Linux.

systemd timer lebih masuk akal untuk tugas yang penting dan perlu diaudit: backup, sinkronisasi data, pembaruan sertifikat, atau laporan harian. Log yang tertata, status terakhir yang jelas, kemampuan mengejar jadwal setelah server mati, serta batas sumber daya membuat tugas seperti ini lebih mudah dipercaya. Timer juga cocok bila tugas harus menunggu layanan lain, misalnya baru boleh jalan setelah jaringan atau database aktif, karena bisa memakai After= dan Requires= seperti service biasa.

Banyak tim memakai keduanya berdampingan. Tidak ada keharusan memindahkan semua crontab sekaligus. Mulailah dari tugas yang paling merugikan bila diam-diam gagal.

Bagaimana memindahkan tugas cron ke timer?

Ambil satu baris crontab, misalnya 30 2 * * * /usr/local/bin/backup-db.sh. Perintah di bagian akhir menjadi ExecStart= di file service, lengkap dengan path. User pemilik crontab menjadi User=. Lima kolom waktu diterjemahkan ke OnCalendar=, dalam contoh ini *-*-* 02:30:00, lalu diperiksa dengan systemd-analyze calendar.

Setelah timer aktif dan systemctl list-timers menampilkan jadwal berikutnya dengan benar, beri tanda komentar pada baris crontab lama, jangan langsung dihapus. Biarkan beberapa hari sambil memantau journalctl. Bila semuanya lancar, baris lama boleh dibuang. Langkah ini mencegah tugas berjalan dua kali atau malah tidak berjalan sama sekali selama masa peralihan.

Kalau kamu belum terbiasa menulis unit systemd, mulai dari membuat service systemd untuk aplikasi. Struktur [Unit], [Service], dan [Install] di sana sama persis dengan yang dipakai pasangan timer.

Pertanyaan yang sering diajukan

Apakah systemd timer bisa dipakai oleh user biasa tanpa root?

Bisa. Simpan file di ~/.config/systemd/user/ lalu kelola dengan systemctl --user. Agar tetap berjalan saat user tidak login, aktifkan lingering dengan loginctl enable-linger nama-user.

Bagaimana mendapat notifikasi saat tugas gagal?

Tambahkan OnFailure=nama-unit-notifikasi.service di bagian [Unit] file service. Unit notifikasi itu bisa menjalankan skrip pengirim email, pesan chat, atau webhook.

Apa fungsi RandomizedDelaySec?

Menunda eksekusi secara acak sampai batas yang ditentukan. Berguna agar banyak server tidak menjalankan tugas berat pada detik yang sama, misalnya semua backup ke satu storage pukul 02.30 tepat.

Bagaimana mematikan sebuah timer?

Jalankan systemctl disable --now nama.timer. Service pasangannya tidak perlu diubah dan masih bisa dijalankan manual bila dibutuhkan.

Sumber & referensi

Baca juga