- Timer systemd adalah pengganti praktis untuk
cron, yang menjalankan unit seperti .service sesuai jadwal serta membuat pengelolaan riwayat, output, dan lingkungan lebih jelas
cron tradisional punya beberapa kelemahan praktis: $PATH yang ambigu, stdout/stderr yang mudah hilang, riwayat eksekusi yang sulit dilacak, dan sintaks jadwal yang sulit dibaca
- Timer menghubungkan
.timer dan .service dengan stem yang sama, dan mengekspresikan eksekusi berbasis waktu maupun event melalui OnCalendar, OnBootSec, dan OnUnitActiveSec
- Dengan
systemd-analyze calendar dan systemctl list-timers, Anda bisa memeriksa ekspresi waktu dan waktu eksekusi berikutnya, sementara WakeSystem= dapat membangunkan sistem untuk menjalankan tugas bahkan saat dalam mode suspend
RandomizedOffsetSec dan FixedRandomDelay= membantu mengurangi lonjakan eksekusi serentak, dan Persistent= menebus eksekusi yang terlewat saat offline segera setelah sistem kembali online
Alasan memakai timer systemd sebagai pengganti cron
- Istilah
cron job digunakan luas untuk menyebut elemen dasar komputasi yang menjalankan tugas berdasarkan jadwal seperti “jalankan ini setiap hari” atau “jalankan itu setiap bulan”, bahkan bila daemon cron yang sebenarnya tidak dipakai
- Timer systemd adalah unit systemd yang menjalankan unit lain, biasanya
.service, sesuai jadwal tertentu, dan dapat menjadi pengganti fungsional untuk daemon cron tradisional
cron tradisional memiliki beberapa kelemahan praktis
- Konfigurasi
$PATH yang ambigu membuat hasil eksekusi skrip sulit diprediksi
- Output
stdout dan stderr sering masuk ke lubang hitam atau dikirim ke sistem mail host
- Riwayat eksekusi sulit dilacak dan di-query
- Sintaks jadwal seperti
01,31 04,05 1-15 1,6 * tidak mudah dibaca atau intuitif bagi manusia
- Timer systemd mengurangi masalah tersebut sambil tetap menyediakan pengaturan kalender yang mirip dengan gaya ekspresi
cron
Struktur dasar: service dan timer
- Timer systemd memerlukan target eksekusi, dan unit
.service secara logis bisa dipandang seperti skrip
- Sebagai contoh, jika Anda menaruh unit berikut di
/etc/systemd/system/roulette.service, Anda akan memasang layanan yang mematikan komputer dengan peluang 1 banding 10
[Unit]
Description=1 in 10 chance to break your chains
[Service]
ExecStart=/usr/bin/env bash -c '[[ $(($RANDOM % 10)) == 0 ]] && systemctl poweroff || echo LIVE ANOTHER DAY'
ExecCondition= adalah cara yang lebih terintegrasi untuk mengekspresikan eksekusi bersyarat sebagai opsi layanan systemd, dan menampilkan “apakah ini harus terus dijalankan?” dengan lebih jelas di level unit
[Unit]
Description=1 in 10 chance to break your chains
[Service]
ExecCondition=/run/current-system/sw/bin/bash -c '[[ $(($RANDOM % 10)) == 0 ]]'
ExecStart=/run/current-system/sw/bin/systemctl poweroff
- Jika kondisi tidak terpenuhi, jurnal akan mencatat pesan yang lebih jelas
May 05 11:05:32 diesel systemd[3117]: Condition check resulted in 1 in 10 chance to break your chains being skipped.
- Secara umum, memanfaatkan opsi yang disediakan systemd memberi pengalaman yang lebih baik daripada menulis skrip sendiri
OnFailure= dapat dipakai saat ingin merespons kegagalan skrip layanan
Restart= dapat dipakai saat ingin mencoba pulih dari kegagalan sementara
Menghubungkan dan menjalankan unit timer
- Jika Anda menaruh
/etc/systemd/system/roulette.timer dengan stem file yang sama, Anda bisa menghubungkan timer ke roulette.service
[Unit]
Description=impending destruction
[Timer]
OnCalendar=10:00
[Install]
WantedBy=timers.target
- Secara default, pengaturan
Unit= pada timer akan memilih unit layanan dengan .service yang ditambahkan ke stem yang sama
- Dalam contoh ini, yang dipilih adalah
roulette.service
- Jika ingin menjalankan unit layanan dengan nama lain, Anda bisa mengubah
Unit=
- Target
ExecStart= secara default tidak dijalankan sebagai perintah shell
- Target dengan path absolut harus diperlakukan sebagai skrip, atau sebagai interpreter yang mengharapkan skrip dalam argumen string
ExecStart=/usr/bin/echo Hello | /usr/bin/awk tidak akan bekerja di konteks ini karena pipe tidak bermakna
- Argumen
ExecStart= secara default tidak mewarisi variabel lingkungan selain beberapa default dari system manager
$PATH default nyaris kosong
- Menjalankan
/usr/bin/env menjadi perlindungan sederhana agar item seperti systemctl dapat digunakan
- Jika hanya menulis
ExecStart=/usr/bin/bash, $PATH akan berisi item default, tetapi memakai env adalah pengaman tambahan
- Layanan bisa dijalankan langsung tanpa timer
systemctl start roulette
- Layanan tanpa bagian
[Install] tidak bisa di-enable, dan dalam struktur ini timer adalah cara standar untuk menjalankan layanan secara konsisten
systemctl secara default bekerja pada roulette.service meski akhiran tidak ditulis eksplisit
- Menerapkan
systemctl start pada unit .timer membuat timer menjadi aktif, tetapi tidak langsung menjalankan layanan target Unit=
systemctl start roulette.timer
status akan menunjukkan kapan timer akan dijalankan berikutnya
systemctl status roulette.timer
Trigger: Sat 2026-04-18 10:00:00 MDT; 35min left
- Alur paling sederhana adalah membuat layanan target eksekusi, menaruh timer dengan jadwal di lokasi yang sama, lalu memulai timer, bukan targetnya
- Jika
[Install] pada unit timer memiliki WantedBy=, timer juga bisa dijalankan saat boot
systemctl enable roulette.timer
Ekspresi waktu: event kalender dan durasi
- Dalam timer, cara mengekspresikan jadwal itu penting, dan perlu dibedakan antara rentang waktu berulang dengan event kalender atau stempel waktu
- Manual
systemd.time(7) punya cukup banyak contoh dan layak jadi referensi pertama saat menulis timer
systemd-analyze dapat memvalidasi dan menjelaskan ekspresi waktu
systemd-analyze calendar '*-*-* *:*:*'
Normalized form: *-*-* *:*:*
Next elapse: Sat 2026-04-18 16:44:26 MDT
(in UTC): Sat 2026-04-18 22:44:26 UTC
From now: 431ms left
- Timer systemd tidak hanya bisa mendefinisikan waktu berulang berbasis jam dinding, tetapi juga, tidak seperti
cron tradisional, durasi berulang yang dihitung dari event sebelumnya
- Bentuk lengkap
daily berarti dijalankan setiap tahun, setiap bulan, setiap hari pada pukul 00:00:00
*-*-* 00:00:00
│ │ │ │ │ ╰── at second 00
│ │ │ │ ╰───── at minute 00
│ │ │ ╰──────── at hour 00
│ │ ╰────────── every day
│ ╰──────────── every month
╰────────────── every year
- Anda bisa memakai singkatan seperti
daily, bentuk lengkap, atau nilai lain yang didukung systemd.time(7), lalu memverifikasi asumsi dengan systemd-analyze
Saat eksekusi berbasis event lebih cocok
- Dalam pekerjaan nyata, sering kali “jalankan setelah event lain” lebih cocok daripada “jalankan pada jam yang sama setiap hari”
- Pekerjaan membersihkan direktori sementara mungkin hampir tidak punya apa pun untuk dibersihkan di
/tmp jika ekspresi cron untuk sesaat setelah boot sudah terlewat
- Mengekspresikannya sebagai “jalankan satu jam setelah komputer mulai, lalu setiap satu jam setelah itu” lebih sesuai dengan perilaku layanan yang sebenarnya dan logika penjadwalannya
[Timer]
OnBootSec=1h
OnUnitActiveSec=1h
OnBootSec=1h berarti dijalankan sekali satu jam setelah mesin menyala
OnUnitActiveSec=1h berarti dijalankan lagi satu jam setelah Unit= dieksekusi, sehingga timer secara implisit terus berulang
- Ekspresi durasi periodik seperti ini lebih sering cocok untuk penggunaan “jalankan sesekali” daripada ekspresi seperti “jalankan pada menit ini setiap jam”
- Dalam contoh bot Slack yang melakukan polling API Advent of Code, ekspresi cron
*/15 memang mematuhi kebijakan API “setiap 15 menit”, tetapi jika semua orang melakukan polling dengan cara yang sama, lalu lintas bisa menumpuk
- Jika timer dimulai setelah perubahan kode lalu dijalankan setiap 15 menit sesudahnya, perilaku yang dibutuhkan tetap terpenuhi sambil berpotensi mengurangi masalah thundering herd
Melihat status timer secara sekilas
systemctl list-timers adalah perintah tingkat tinggi yang merangkum kondisi timer pada sebuah mesin
systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
Mon 2026-04-20 15:15:00 MDT 1min 40s Mon 2026-04-20 15:00:05 MDT 13min ago zfs-snapshot-frequent.timer zfs-snapshot-frequent.service
Mon 2026-04-20 15:32:16 MDT 18min Mon 2026-04-20 14:22:15 MDT 51min ago fwupd-refresh.timer fwupd-refresh.service
Mon 2026-04-20 16:00:00 MDT 46min Mon 2026-04-20 15:00:05 MDT 13min ago logrotate.timer logrotate.service
Mon 2026-04-20 16:00:00 MDT 46min Mon 2026-04-20 15:00:05 MDT 13min ago zfs-snapshot-hourly.timer zfs-snapshot-hourly.service
Tue 2026-04-21 00:00:00 MDT 8h Mon 2026-04-20 09:43:22 MDT 5h 29min ago zfs-snapshot-daily.timer zfs-snapshot-daily.service
Tue 2026-04-21 07:31:28 MDT 16h Sun 2026-04-19 20:15:47 MDT 7h ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
Mon 2026-04-27 00:00:00 MDT 6 days Mon 2026-04-20 09:43:22 MDT 5h 29min ago zfs-snapshot-weekly.timer zfs-snapshot-weekly.service
Mon 2026-04-27 01:09:27 MDT 6 days Mon 2026-04-20 09:43:22 MDT 5h 29min ago fstrim.timer fstrim.service
Mon 2026-04-27 04:28:38 MDT 6 days Mon 2026-04-20 09:43:22 MDT 5h 29min ago zpool-trim.timer zpool-trim.service
Fri 2026-05-01 00:00:00 MDT 1 week 3 days Wed 2026-04-01 10:07:51 MDT 1 week 1 day ago zfs-snapshot-monthly.timer zfs-snapshot-monthly.service
Fri 2026-05-01 03:17:17 MDT 1 week 3 days Wed 2026-04-01 10:07:51 MDT 1 week 1 day ago zfs-scrub.timer zfs-scrub.service
11 timers listed.
Pass --all to see loaded but inactive timers, too.
- Dengan satu perintah, Anda bisa mendapatkan gambaran menyeluruh tentang item-item yang dijalankan menurut jadwal timer
list-timers adalah bagian dari keluarga subperintah systemd yang sering dipakai
list-units juga berguna
list-paths adalah subperintah yang lebih baru ditambahkan ke systemctl
Bangunkan sistem dari mode suspend untuk menjalankan tugas
WakeSystem= dapat membuat timer yang waktunya tiba membangunkan sistem dari mode suspend
WakeSystem=
Takes a boolean argument. If true, an elapsing timer will
cause the system to resume from suspend, should it be
suspended and if the system supports this.
...
- Fitur ini berguna saat skrip penting perlu dijalankan tanpa harus menunggu tindakan fisik seseorang membuka tutup laptop
- Pada distribusi seperti Arch atau NixOS yang mendukung pengunduhan pembaruan paket sebelum dipakai, Anda bisa mengambil paket pembaruan larut malam dan melakukan pembaruan saat pagi hari sudah berada di depan keyboard
- Manual menyebutkan bahwa jika ingin kembali masuk mode suspend setelah
.service selesai, Anda harus menangani suspend ulang itu secara manual
Menyebarkan waktu eksekusi dan meredam thundering herd
- Masalah thundering herd adalah masalah sistem yang terjadi saat banyak proses bangun pada saat yang sama
- Jika semua sistem Debian di seluruh dunia di-hardcode untuk menjalankan
apt update pada 00:00:00, tengah malam akan menjadi puncak trafik yang buruk bagi semua orang
FixedRandomDelay= dan RandomizedOffsetSec= membantu menyebarkan waktu eksekusi
FixedRandomDelay=
Takes a boolean argument. When enabled, the randomized delay
specified by RandomizedDelaySec= is chosen deterministically,
and remains stable between all firings of the same timer,
even if the manager is restarted. ...
RandomizedOffsetSec=
Offsets the timer by a stable, randomly-selected, and evenly
distributed amount of time between 0 and the specified time
value. ...
- Pengaturan seperti ini bisa dipakai pada sistem nyata yang memeriksa pembaruan perangkat lunak
- Menyebarkan eksekusi secara merata membantu mengurangi masalah thundering herd, membuat perilaku lebih konsisten, dan membantu menghindari gangguan seperti restart daemon yang sedang mengoordinasikan layanan terdistribusi
- Opsi timing secara umum sangat bisa dikonfigurasi dan memberi kontrol yang rinci
Segera menebus eksekusi yang terlewat
Persistent= sangat cocok terutama untuk skrip terjadwal yang tidak boleh terlewat hanya karena laptop sedang suspend, tetapi juga tidak sampai memerlukan WakeSystem=
Persistent=
Takes a boolean argument. If true, the time when the service
unit was last triggered is stored on disk. When the timer is
activated, the service unit is triggered immediately if it
would have been triggered at least once during the time when
the timer was inactive. ...
- Jika sistem yang menjadwalkan check-in manajemen konfigurasi mengalami downtime, cukup menaruh
Persistent= pada .timer dapat membuatnya kembali menuju keadaan yang benar segera setelah online
- Tanpa
Persistent=, Anda mungkin harus menunggu sampai waktu eksekusi normal timer berikutnya, dan itu bisa memakan waktu lama
- Pekerjaan lain yang juga tidak boleh menunggu saat aktivasi terlewat terdeteksi antara lain pembaruan sistem dan pemeriksaan batch job
Hal yang perlu diperhatikan saat menulis timer
- Timer dalam konteks user manager yang dikelola dengan
systemctl --user juga valid, tetapi perhatikan target yang dipakai di [Install]
- Bergantung pada distribusinya, target yang tepat untuk timer pengguna bisa jadi
default.target
- Seperti pada
cron, catatan umum bahwa jam sistem harus akurat tetap berlaku
- Pengguna systemd dapat memeriksa status sinkronisasi dengan
timedatectl timesync-status
- Banyak editor sudah mendukung format file unit systemd secara bawaan, yang membantu saat file unit mulai membesar
- Di Emacs, Anda bisa memakai paket emacs systemd
2 komentar
Komentar Hacker News
Sulit membantah karena saya belum cukup banyak memakai systemd timer, tetapi saya kurang paham dengan pernyataan bahwa $PATH cron itu ambigu
PATHbisa diatur langsung di dalam crontab, jadi saya tidak melihat alasan mengapa itu harus dianggap lebih sulit diprediksi dibanding pengaturan di tempat seperti/etc/bashrc,~/.bashrc,~/.profile,~/.bash_profile, atau/etc/systemd/…Saya sudah memakai Linux sejak 1994, tetapi saya tidak menghafal sintaks cron. Namun, di komentar crontab sudah tertulis
m h dom mon dow command, jadi tinggal memasukkan angka sesuai judul kolomKeluhan lainnya bisa saya pahami, dan lain kali kalau saya butuh pekerjaan cron, saya berniat mencoba systemd timer
Ada koma, garis miring, tanda bintang, kombinasi, dan jika butuh pengacakan, biasanya itu tidak bisa dilakukan oleh cron sendiri sehingga harus dimasukkan ke dalam perintah. Menulis spesifikasi cron yang tidak sepele itu tidak mudah
Kalau seseorang memasukkan sesuatu seperti
5,3/4 4-8,11 1 4,5,6,9-11 */2, kita jadi mendapat hiburan dengan merekayasa balik apa sebenarnya maksudnya, dan biasanya itu bukan arti dari yang dia tulisKalau ditambah ekstensi yang hanya didukung di sebagian lingkungan cron, jadinya makin rumit
systemd timer jauh lebih mudah dikelola. Kemampuan mengendalikan apakah eksekusi ganda untuk pekerjaan yang berjalan lama diperbolehkan, atau menjalankan pekerjaan di antara waktu mulai-selesai alih-alih pada jam tetap, adalah peningkatan besar
Dulu pernah ada pekerjaan backup yang masuk ke loop symbolic link dan membuat VPS mati, dan cron tetap terus meluncurkan pekerjaan backup baru meskipun backup sebelumnya belum selesai
PATHkhusus milik CRON yang membuat saya harus menulis ulang perintah dan skrip juga merepotkan, walaupun hal serupa bisa saja terjadi pada beberapa systemd timer. Meski begitu, kita tetap bisa menjalankan timer secara manual tanpa harus mengubah crontab agar berjalan 30 detik kemudian lalu menunggu$PATHdi crontab untuk menguji pekerjaan cronJika tidak di-hardcode, maka
$PATHsaat cron mengeksekusi akan berbeda dari$PATHsaat kita menguji perintah secara langsung.systemctl start foo.servicemenjalankan perintah dalam lingkungan yang sama seperti saat timer terpicu, jadi kita bisa tahu apakah perilakunya akan samaSebaliknya, pekerjaan cron berjalan pada waktu yang ditentukan di crontab. systemd timer biasanya juga terpicu pada waktu yang ditentukan, tetapi karena bug logika systemd, bisa saja ia berjalan sekali pada 29 Februari lalu tidak pernah berjalan lagi, atau saat unit timer di-"restart" ia bisa terpicu atau tidak
Di systemd, apa pun pemicunya, unit yang benar-benar dijalankan tetap sama, jadi tidak ada jurang perbedaan
Kita memang tetap perlu tahu lingkungan default-nya seperti apa, tetapi itu adalah lingkungan yang hampir bersih dan tidak terpengaruh shell. Menurut saya ini keunggulan systemd
PATH-nya sampai ambigu, tetapi cron memang punya masalah terkaitPATHNilai default-nya tidak mencakup hal-hal yang mungkin kita harapkan seperti
/usr/local/binatau/usr/sbinuntuk root, dan beberapa distro seperti Arch Linux bahkan tidak mencantumkan path default maupun saran pengaturan di halaman manualJika ingin menambahkan path hanya untuk satu skrip tertentu, kita harus membungkusnya dengan
env, mengaturnya di skrip pembungkus, atau mengubah path sebelum entri lalu mengembalikannya setelah ituKita juga tidak bisa memakai
~atau$HOMEdi dalamPATHdan harus menulis path absolut lengkap, yang terutama merepotkan di crontab penggunaSolusinya memang tidak sulit, tetapi menurut saya pengalaman systemd timer lebih baik karena secara default memakai path yang sama dengan layanan lain
Saya pindah dari cronie ke systemd timer karena lebih tangguh terhadap waktu sistem mulai menyala
Strategi backup saya adalah membuat entri arsip borg setiap hari pada waktu tetap, tetapi cronie mengharuskan sistem menyala pada waktu yang dijadwalkan. systemd timer tahan terhadap kondisi ini dan akan menjalankan layanan segera setelah sistem tersedia
Repositori otomatisasi backup-nya ada di https://github.com/gchamon/borg-automated-backups
/etc/cron.hourly/0anacronsetiap jam dan menjalankan pekerjaan/etc/cron.{daily,weekly,monthly}meskipun waktu eksekusi paling awal sudah terlewat. Penundaan acak juga bisa diaturDengan mengedit
/etc/anacrontab, kita bisa membuat jadwal kustomDi level pengguna, mungkin kita bisa memasukkan entri seperti
@hourly anacron -t /path/to/anacrontab -S /path/to/spooldirke crontab pengguna, walaupun saya belum pernah mencobanya sendiriBanyak implementasi cron juga punya mekanisme serupa
@reboot, dan saya memakainya di beberapa skrip; berfungsi dengan baik@reboot?Saya tidak percaya nozzle printer Canon; kalau dibiarkan menganggur beberapa waktu bisa mampet. Jadi saya menyuruh Claude membuat skrip systemd agar setiap minggu mencetak foto anjing, dengan spektrum CMYK yang cukup penuh supaya printer benar-benar dipakai
Setiap hari Senin, duduk di meja lalu tiba-tiba ada foto keluar dari printer itu jadi kejutan kecil yang cukup menyenangkan
Setidaknya bisa jadi ide proyek pameran sains anak-anak
Setelah beliau wafat, printer itu tidak dipakai selama beberapa tahun dengan kondisi mati total, lalu saat butuh cetak warna saya tinggal colokkan listrik dan langsung cetak
Setelah sekitar 1/5 halaman pertama, semua warna kembali, dan setelah itu ia mencetak sekitar 20 halaman tanpa masalah
Masalahnya tampak lebih seperti software daripada hardware; kalau printer dibiarkan terhubung ke komputer lebih dari seminggu tanpa dipakai, pencetakan akan berhenti begitu saja
Saya bisa saja membongkar log, tetapi sebagai gantinya saya membuat job cron yang mencetak halaman uji setiap Senin dan Kamis. Di bagian atas halaman uji itu hanya ada tulisan seperti
LOL PRINTER WORKSTernyata tidak terlalu boros. Saya mengambil banyak mata kuliah matematika jadi sangat butuh kertas bekas sisi balik untuk mengerjakan soal, dan saya selalu memakai hasil cetak gagal atau hasil cetak uji lebih dulu sebelum memakai kertas kosong
Walau resolusi maksimumnya cuma 600dpi, warnanya sangat bagus dan merata, dan toner yang tidak mengering adalah kriteria pembelian utama kakak saya. Inkjet HP beberapa kali mampet
Saya sangat menyukai systemd timer. Saya pelan-pelan memindahkan semua job cron yang dulu saya deploy dengan Ansible menjadi timer, dan sekarang tinggal pakai salin-tempel Ansible saja
Integrasinya dengan
journalctlsangat bagus, dan pada OS modern seperti Debian 13 yang sudah tidak punya syslog, ini malah lebih bagus lagi. Bisa menjalankan service secara manual untuk debugging juga sangat praktisJob cron yang tidak jalan itu merepotkan karena harus copy-paste atau memakai skrip shell tambahan, belum lagi lubang hitam tempat stdout job cron menghilang
Kita juga bisa memantau dan menerima notifikasi kegagalan seperti pada service systemd biasa. Saya juga senang melihat proyek open source makin sering merekomendasikan timer sebagai cara deployment
NixOS memakai systemd secara bawaan, jadi ini diperlakukan sebagai komponen kelas satu untuk administrasi. Terutama terasa bagus kalau datang dari launchd di macOS
Saya juga suka bahwa saat mendistribusikan tool untuk NixOS, kita bisa memanfaatkan systemd secara alami alih-alih menempelkannya sebagai tambalan
Namun, kalau harus mendistribusikan tool dengan banyak pengelolaan siklus hidup ke seluruh pengguna Linux, saya penasaran bagaimana sebaiknya dilakukan karena systemd tidak ada di mana-mana
Saya menjalankan scrub bulanan pada pool btrfs dengan systemd timer. Cukup berguna karena bisa menentukan apakah saat pengguna memulai scrub secara manual jadwal berikutnya dilewati, atau untuk pekerjaan bulanan ketika perangkat mati selama 6 bulan apakah tugas yang tertunda ditumpuk atau digabung jadi satu eksekusi saja
systemd.services.sync-recyclarr = { serviceConfig.Type = "oneshot"; path = [ pkgs.podman ]; script = '' podman exec -it recyclarr recyclarr sync radarr podman exec -it recyclarr recyclarr sync sonarr ''; };systemd.timers.sync-recyclarr = { timerConfig = { OnCalendar = "daily"; Persistent = true; Unit = "sync-recyclarr.service"; }; partOf = [ "sync-recyclarr.service" ]; requires = [ "podman-recyclarr.service" ]; wantedBy = [ "timers.target" ]; };flake.nixSaya juga memakai NixOS, tetapi semua konfigurasi saya tetap dipertahankan dalam format aslinya dan hanya diberi symbolic link lewat Nix. Dengan begitu konfigurasi itu tetap mudah dibawa ke sistem non-NixOS juga
Masalahnya, NixOS tampaknya tidak menangkap dan menjalankan timer serta service systemd yang saya taruh di folder
~/.config/systems/user, dan hal sepertiWantedBy=default.targetjuga tidak berpengaruhKarena itu, setelah saya me-restart semua service secara manual tiap selesai reboot, barulah saya setuju bahwa systemd timer memang keren
Timer ternyata cukup fleksibel karena bisa bekerja bukan hanya dengan unit service yang namanya sama, tetapi juga dengan unit arbitrer
Di server saya ada timer yang memulai
backup.target, yang menjalankan seluruh siklus backuprestic backup,restic prune, danrestic forget, lengkap dengan waktu mulai acak tiap pagi dan notifikasiUnit
restic-*yang sebenarnya adalah Podman Quadlet, jadi selama server punya Podman dan Systemd, konfigurasinya sendiri bisa berjalan tanpa tergantung isi serverMeski begitu, untuk pemakaian sehari-hari timer adalah salah satu jenis unit systemd yang paling kikuk. Saya paham kenapa harus dipisah jadi dua file dan kenapa sintaks
startdanenableberbeda, tetapi kadang saya cuma ingin membuat satu file, menjalankan skrip, lalu selesaiMungkin di era LLM ini bukan masalah besar, tetapi tetap terasa sedikit merepotkan setiap kali
Ada beberapa aspek systemd yang tidak selalu sangat saya sukai, tetapi saya pada umumnya setuju dengan kesan ini
Untuk pekerjaan terjadwal tingkat “sistem”, saya hampir sepenuhnya berhenti memakai cron dan jadi lebih memilih timer systemd. Untuk penjadwalan dalam lingkup aplikasi tertentu, saya juga bisa memakai sesuatu seperti Quartz
Alasannya agak samar dan sulit dijelaskan, tetapi pendekatan systemd terasa lebih rapi cocok dengan model di kepala saya tentang “beginilah seharusnya cara kerjanya”. Di masa lalu saya juga cukup sering mengalami eksekusi skrip cron yang sulit diprediksi karena
PATHyang ambigu, meski itu bukan satu-satunya alasanSaya tidak akan mengklaim bahwa timer systemd secara universal dan objektif lebih baik daripada cron, tetapi setidaknya ia berhasil meyakinkan saya
Ini sangat bagus sebagai pengantar ke timer systemd, dan cukup meyakinkan hingga akhirnya membuat saya mencobanya
Saya juga suka
list-timers. Di cron, tidak mudah untuk memahami semua pekerjaan cron yang berjalan di satu mesin dalam sekali lihat. Kita harus memeriksa crontab semua pengguna,/etc/cron.d/, serta direktori daily/hourly/monthlyAda kasus penggunaan nyata di mana sesuatu perlu dijalankan sekali sekitar 5 menit setelah boot, lalu setiap sekitar 12 jam setelah itu, dan menyenangkan mengetahui timer systemd bisa menangani ini
systemd-analyzedansystemctl list-timerssystemd terlihat rumit saat pertama dilihat, tetapi setelah dipakai, jadinya tidak ingin memakai yang lain. Mengelola semuanya dengan
systemctlitu nyamanMisalnya, saya tidak mengerti mengapa definisi unit harus berupa file nyata di disk. Saat daemon memuat ulang, ia membaca ulang semua file, bukan hanya file yang berubah. Bukankah seharusnya bisa ada API untuk menambahkan unit secara terprogram? Ada sesuatu yang mirip, tetapi banyak batasannya dan tidak fleksibel
Saya juga mempertanyakan mengapa beberapa unit tidak bisa dideklarasikan dalam satu file. Desain yang berpusat pada filesystem seperti itu, dan pilihan untuk tidak membuat abstraksi di tingkat lain, tidak terlihat cerdas. Itu juga tidak benar-benar mengikuti filosofi Unix
Untuk format definisi unit, kalau TOML sudah ada saat itu, rasanya mereka akan memilih sesuatu yang lebih masuk akal
Tentu saja itu mungkin karena saya sudah tua. Jelas
systemd-*adalah satu-satunya jalan yang benar, dan siapa pun yang berpandangan berbeda pasti cuma tukang mengguruiSaya sudah memakai Linux lebih dari 20 tahun, dan systemd lebih dari 10 tahun
Meski begitu, selalu ada hal baru untuk dipelajari, dan ini benar-benar jadi sesuatu yang saya pertimbangkan sebagai alat berguna lainnya
Opini Lobste.rs
systemd memang tidak sempurna, tetapi terasa banyak keputusan desainnya didasarkan pada pelajaran yang didapat dari cara-cara lama yang lebih tradisional
Baru-baru ini saya mendengarkan lagi episode CRE tahun 2015 di mana Lennart Poettering menjelaskan latar belakangnya, dan itu masih layak direkomendasikan sampai sekarang
Saya termasuk pihak yang benar-benar tidak suka systemd, tetapi systemd.timers menurut saya adalah salah satu konsep yang “lumayan lebih baik” dalam produk ini
Karena itu, agak mengejutkan melihat penulis membelanya dengan cara yang terkesan meremehkan orang-orang yang punya keluhan yang masuk akal
Meski begitu, saya suka memakainya bersama perintah
at. Untuk perintah yang dijalankan sekali pada waktu tertentu, pakaiat, selain itu pakai timer systemd dan unit file sederhanaPeningkatan yang paling ingin saya lihat adalah kemampuan mengetahui pengguna mana yang sedang menjalankan timer. Saya memang salah satu dari sedikit orang yang masih mengelola shellbox pada 2026, tetapi akan berguna jika saya bisa tahu pengguna mana yang membuat timer yang mengakses disk setiap detik
Setahu saya, dengan
loginctl enable-linger, itu bisa berjalan bahkan tanpa sesi pengguna yang aktif. Tentu saja ada kasus penggunaan yang mungkin tidak cukup ditangani dengan itu, dan saya tidak tahu situasi spesifiknyaAkan lebih baik kalau systemd timer punya hambatan awal yang lebih rendah, terutama di sisi pengelolaan pengguna
Kalau melihat jumlah konfigurasi yang dibutuhkan, sangat sulit mengalahkan
crontab -eSaya sudah lama memikirkan cara mengumpulkan log skrip cron secara terstruktur, lalu sadar bahwa saya bisa langsung memakai systemd timer
Masalah logging pun selesai. Sekarang tidak ada alasan untuk kembali memakai cron, dan saya berharap tahu ini lebih cepat
logger, atau ditambahkan ke file log dengan>>, atau dibiarkan default lalu menerima email?Silakan bilang ini kuno, tapi saya masih menyiapkan email dari server untuk sampai ke saya
Kalau diotomatisasi, itu ikut tersedia gratis di setiap host baru, dan dalam penggunaan sehari-hari juga cukup nyaman
Misalnya, saya cukup membuka satu multiplexer lalu menjalankan
long_running_process | mail root@localhost -s "done $?"dan melupakannyaTulisan yang bagus, dan saya juga punya draf tulisan serupa yang belakangan harus saya rujuk lagi
Jika Anda seperti saya dan masuk ke lubang kelinci systemd, saya sarankan membuat tautan simbolis untuk unit file dan timer di folder proyek terkait ke
/etc/systemd/system/Salah satu keluhan saya terhadap systemd adalah distribusi tidak membedakan unit yang dipasang distro dengan unit yang saya tulis sendiri, dan dengan tautan simbolis saya bisa menjaga pemisahan itu sendiri
Unit sistem/paket/distribusi masuk ke
/usr/lib/systemd/system, sedangkan override lokal atau unit lokal masuk ke/etc/systemd/system