Timer systemd

Menjadwalkan tugas dengan timer systemd sebagai pengganti cron.

Daftar isi

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.

AspekcronTimer systemd
Definisi jadwalbaris crontab dengan lima kolom waktudirektif OnCalendar= pada berkas unit
Log hasil eksekusitercampur di log sistem atau surat lokalotomatis tercatat di jurnal atas nama layanannya
Jadwal yang terlewattidak dijalankan ulangdapat dikejar dengan Persistent=true
Inspeksi jadwalmembaca crontab setiap penggunasystemctl list-timers beserta picu berikutnya
Hak aksescrontab sendiri per pengguna dan rootberkas unit sistem di /etc/systemd/system dan timer pengguna di ~/.config/systemd/user
bash
# tidak-dijalankan
# crontab tidak terpasang di sandbox, dan lingkungan latihan ini tidak memakai cron
crontab -l

cron 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:

ini arsip-cadangan.timer
[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:00 menetapkan picu mingguan pada hari Minggu pukul 03.30.
  • Baris Persistent=true mengejar picu yang terlewat, yaitu apabila mesin mati pada saat jadwal, timer terpicu segera setelah sistem menyala kembali.
  • Bagian [Install] dengan WantedBy=timers.target mengaktifkan 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.

EkspresiArtinya
*-*-* 02:00:00setiap hari pukul 02.00
Sun *-*-* 03:30:00setiap hari Minggu pukul 03.30
*-*-* *:00/15:00setiap 15 menit
*-*-01 00:00:00tanggal 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:

bash
# menghitung picu berikutnya dari ekspresi kalender timer
systemd-analyze calendar "Sun *-*-* 03:30:00"
text Keluaran
Normalized form: Sun *-*-* 03:30:00
    Next elapse: Sun 2026-11-08 03:30:00 UTC
       From now: 5 days left

Baris 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:

bash
# ekspresi berbahasa Indonesia tidak dikenali penjadwal
systemd-analyze calendar "Minggu 03:30"
text Keluaran
Failed to parse calendar specification 'Minggu 03:30': Invalid argument

Kebiasaan 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:

bash
# 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: $?"
text Keluaran
kode kembali: 0

Keluaran senyap dengan kode kembali nol berarti berkasnya sah. Aktivasi berikutnya menuntut sistem yang menjalankan systemd:

bash
# 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-timers

Keluaran 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.service cukup ada berkasnya tanpa di-enable.
  • Menulis nama hari dalam bahasa Indonesia. Sintaks OnCalendar memakai singkatan bahasa Inggris atau angka, sehingga kata Minggu membuat penguraian ekspresi gagal.
  • Lupa memberikan daemon-reload setelah 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=true hanya 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 OnCalendar menyatakan hari, tanggal, dan jam dengan * sebagai semua nilai dan / sebagai langkah.
  • systemd-analyze calendar memvalidasi ekspresi sekaligus menghitung picu berikutnya sebelum timer dipasang.
  • Persistent=true mengejar picu yang terlewat saat mesin mati, sedangkan systemctl list-timers menampilkan seluruh timer aktif beserta picunya.

Referensi#