Timer systemd menjadwalkan tugas dengan memicu unit layanan pada waktu tertentu, dan pada distro modern menjadi pengganti cron. Topik ini memasang timer untuk layanan pengarsip cadangan yang berkas unitnya sudah ditulis, membaca sintaks OnCalendar, menghitung picu berikutnya dengan systemd-analyze, serta membandingkan timer dengan cron. Setelah dibaca, tugas berjadwal dapat diputuskan ke timer atau cron dengan dasar yang jelas.
Dari cron ke timer#
cron menjadwalkan tugas dengan membaca satu berkas crontab per pengguna, dan selama puluhan tahun cara itu menjadi standar. Timer systemd menawarkan model yang berbeda, yaitu setiap tugas adalah pasangan berkas unit, sehingga jadwal, sasaran, dan lingkungannya tersimpan dalam format yang sama dengan layanan lain. Perbedaan paling terasa ada pada pelaporan dan jadwal yang terlewat, sebagaimana dirangkum tabel berikut.
| Aspek | cron | Timer systemd |
|---|---|---|
| Definisi jadwal | baris crontab dengan lima kolom waktu | direktif OnCalendar= pada berkas unit |
| Log hasil eksekusi | tercampur di log sistem atau surat lokal | otomatis tercatat di jurnal atas nama layanannya |
| Jadwal yang terlewat | tidak dijalankan ulang | dapat dikejar dengan Persistent=true |
| Inspeksi jadwal | membaca crontab setiap pengguna | systemctl list-timers beserta picu berikutnya |
| Hak akses | crontab sendiri per pengguna dan root | berkas unit sistem di /etc/systemd/system dan timer pengguna di ~/.config/systemd/user |
# tidak-dijalankan
# crontab tidak terpasang di sandbox, dan lingkungan latihan ini tidak memakai cron
crontab -lcron tetap sah untuk kasus yang sederhana dan untuk distro lama. Timer lebih mengikat pada systemd, tetapi memberi jurnal, dependensi, dan pengejaran jadwal secara bawaan. Keduanya juga tidak saling meniadakan, karena sebuah server boleh memakai cron untuk tugas kecil milik pengguna dan timer untuk layanan sistem. Keputusannya lebih ditentukan oleh konsistensi alat daripada kemampuan teknis.
Yang perlu diperhatikan, crontab hanya berisi baris jadwal, sedangkan lingkungan eksekusinya seperti shell dan PATH dirawat terpisah. Berkas unit timer menyimpan keduanya di tempat yang sama, yaitu jadwal dan lingkungan eksekusi tugasnya. Untuk server yang seluruh layanannya sudah dikelola systemd, menggunakan timer berarti seluruh otomatisasi tunduk pada satu alat pemeriksaan yang sama.
Pasangan layanan dan timer#
Setiap timer memicu satu unit lain, dan apabila sasarannya tidak dinyatakan eksplisit, systemd memilih layanan dengan nama yang sama. Dengan aturan itu, timer untuk layanan arsip-cadangan.service cukup bernama arsip-cadangan.timer, dan berkas unitnya hanya berisi jadwal:
[Unit]
Description=Jadwal mingguan arsip cadangan
[Timer]
OnCalendar=Sun *-*-* 03:30:00
Persistent=true
[Install]
WantedBy=timers.target- Bagian
[Unit]kembali hanya berisi deskripsi, karena timer tidak menjalankan program apa pun oleh dirinya sendiri. - Baris
OnCalendar=Sun *-*-* 03:30:00menetapkan picu mingguan pada hari Minggu pukul 03.30. - Baris
Persistent=truemengejar picu yang terlewat, yaitu apabila mesin mati pada saat jadwal, timer terpicu segera setelah sistem menyala kembali. - Bagian
[Install]denganWantedBy=timers.targetmengaktifkan timer pada boot bersama timer-timer lainnya.
Setiap kali picu tiba, systemd menjalankan layanan sasarannya sebagaimana systemctl start, sehingga seluruh keluaran dan kegagalannya tercatat di jurnal atas nama arsip-cadangan.service. Layanan sasarannya sendiri tidak perlu di-enable, karena yang aktif secara permanen hanyalah timernya.
Sintaks OnCalendar#
Ekspresi OnCalendar tersusun atas tiga kelompok yang dipisah spasi, yaitu nama hari, tanggal dengan bentuk tahun-bulan-hari, dan jam dengan bentuk jam-menit-detik. Tanda * berarti semua nilai pada kelompoknya, sedangkan tanda / menetapkan langkah, koma mendaftar nilai, dan tanda .. menuliskan rentang. Beberapa pola yang lazim dirangkum tabel berikut.
| Ekspresi | Artinya |
|---|---|
*-*-* 02:00:00 | setiap hari pukul 02.00 |
Sun *-*-* 03:30:00 | setiap hari Minggu pukul 03.30 |
*-*-* *:00/15:00 | setiap 15 menit |
*-*-01 00:00:00 | tanggal 1 setiap bulan pada pukul 00.00 |
systemd juga menyediakan kata tunggal sebagai singkatan, misalnya hourly, daily, dan weekly, yang setara dengan ekspresi panjangnya. Nama hari ditulis dengan singkatan bahasa Inggris seperti Sun atau Mon, dan penulisan lengkapnya seperti Sunday juga sah. Kelompok yang tidak relevan tetap ditulis dengan *, sehingga ekspresi terlihat panjang, tetapi polanya konsisten dan mudah dibaca setelah terbiasa. Apabila jadwal perlu bergeser agar tidak menumpuk, direktif RandomizedDelaySec= pada berkas timer menambah jeda acak setelah picu, sehingga banyak mesin tidak menjalankan tugas yang sama pada detik yang persis sama.
Menghitung picu berikutnya#
Menebak kapan sebuah ekspresi kalender berlaku berikutnya adalah sumber kekeliruan yang halus, misalnya lupa bahwa *-*-* 03:30:00 juga berlaku hari ini. Perintah systemd-analyze calendar menguraikan ekspresi dan menghitung picunya tanpa perlu timer yang benar-benar terpasang:
# menghitung picu berikutnya dari ekspresi kalender timer
systemd-analyze calendar "Sun *-*-* 03:30:00"Normalized form: Sun *-*-* 03:30:00
Next elapse: Sun 2026-11-08 03:30:00 UTC
From now: 5 days leftBaris Normalized form menampilkan bentuk baku ekspresinya, sedangkan Next elapse menunjukkan saat picu berikutnya, dan nilai From now bergantung pada waktu perintah itu dijalankan. Perintah yang sama menerima beberapa ekspresi sekaligus, dan opsi --iterations= menampilkan sejumlah picu berikutnya, sehingga pola seperti jadwal mingguan yang bertepatan dengan tanggal tertentu dapat dipastikan lebih dahulu. Alat ini sekaligus berlaku sebagai pemeriksa sintaks, karena ekspresi yang tidak sah ditolak dengan pesan yang jelas:
# ekspresi berbahasa Indonesia tidak dikenali penjadwal
systemd-analyze calendar "Minggu 03:30"Failed to parse calendar specification 'Minggu 03:30': Invalid argumentKebiasaan yang baik adalah menghitung setiap ekspresi baru dengan perintah ini sebelum dipasang, karena keliru satu karakter saja bisa menggeser jadwal tanpa pesan error apa pun setelah timer aktif.
Memasang dan memantau timer#
Sama seperti layanan, berkas timer diperiksa dahulu dengan verify, lalu dipasang ke /etc/systemd/system. Pemeriksaan sintaksnya dapat dilakukan di mana saja karena systemd-analyze verify tidak menuntut systemd yang berjalan:
# memeriksa sintaks berkas timer
mkdir -p /tmp/kerja-timer
cp arsip-cadangan.timer /tmp/kerja-timer/
systemd-analyze verify /tmp/kerja-timer/arsip-cadangan.timer
echo "kode kembali: $?"kode kembali: 0Keluaran senyap dengan kode kembali nol berarti berkasnya sah. Aktivasi berikutnya menuntut sistem yang menjalankan systemd:
# tidak-dijalankan
# aktivasi timer menuntut systemd yang berjalan dan hak root
sudo cp arsip-cadangan.timer /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now arsip-cadangan.timer
# daftar timer aktif beserta picu berikutnya
systemctl list-timersKeluaran list-timers berupa tabel dengan kolom NEXT, LEFT, dan UNIT untuk setiap timer aktif, sehingga jadwal yang sedang berlaku terbaca dalam satu tampilan. Timer yang baru aktif tidak langsung menjalankan tugasnya, karena picu pertamanya mengikuti jadwal yang ditetapkan dan jadwal itu terbaca pada kolom NEXT. Apabila tugas perlu diuji lebih cepat, layanan sasarannya dapat dipanggil langsung dengan systemctl start, dan timer tetap mengikuti jadwalnya tanpa terpengaruh. Setelah timer aktif, jalannya tugas dapat diikuti lewat journalctl -u arsip-cadangan.service setiap kali picu tiba, dan arsip mingguannya menumpuk di direktori tujuan yang ditetapkan layanannya.
Kesalahan umum#
- Mengira enable pada layanan sasaran diperlukan. Timer yang aktiflah yang menjalankan layanannya setiap picu tiba, sehingga
arsip-cadangan.servicecukup ada berkasnya tanpa di-enable. - Menulis nama hari dalam bahasa Indonesia. Sintaks
OnCalendarmemakai singkatan bahasa Inggris atau angka, sehingga kataMinggumembuat penguraian ekspresi gagal. - Lupa memberikan
daemon-reloadsetelah berkas timer disalin. systemd tidak melihat berkas baru sampai daftar unitnya dimuat ulang, sehingga enable berakhir dengan pesan unit tidak ditemukan. - Mengharapkan pengejaran jadwal tanpa enable.
Persistent=truehanya bekerja pada timer yang aktif saat boot, sehingga timer yang hanya di-start sekali tidak pernah mengejar apa pun.
Ringkasan#
- Timer systemd memicu unit layanan menurut jadwal, dan tanpa direktif
Unit=sasarannya adalah layanan dengan nama yang sama. - Ekspresi
OnCalendarmenyatakan hari, tanggal, dan jam dengan*sebagai semua nilai dan/sebagai langkah. systemd-analyze calendarmemvalidasi ekspresi sekaligus menghitung picu berikutnya sebelum timer dipasang.Persistent=truemengejar picu yang terlewat saat mesin mati, sedangkansystemctl list-timersmenampilkan seluruh timer aktif beserta picunya.
Referensi#
- systemd.timer(5) — freedesktop.org
— Opsi berkas timer, termasuk
OnCalendar=danPersistent=. - systemd.time(7) — freedesktop.org — Sintaks lengkap ekspresi kalender dan contoh-contohnya.
- systemd.timer(5) — Ubuntu manpages — Manual berkas timer pada Ubuntu 24.04, versi yang dipakai jalur ini.