Kodeloka
  1. Kodeloka
  2. Kelas Linux & Shell
  3. Materi

2 · Proses & Sistem · Modul 4 dari 8

systemd: Layanan, Log & Timer

Menjalankan aplikasi sebagai layanan yang otomatis menyala kembali, membaca lognya, dan menjadwalkan tugas berkala.

Perintah Dasar

systemctl status nginx
systemctl start|stop|restart nginx
systemctl reload nginx            # muat ulang konfigurasi TANPA memutus koneksi
systemctl enable --now nginx      # aktifkan saat boot DAN nyalakan sekarang
systemctl disable nginx

systemctl list-units --type=service --state=running
systemctl list-unit-files --state=enabled
systemctl daemon-reload           # WAJIB setelah mengubah berkas unit
⚠️ Lupa daemon-reload adalah kebingungan klasik

Setelah mengubah berkas .service, systemd masih memakai versi lama yang ada di memorinya. Anda me-restart layanan, tidak ada yang berubah, dan mulai meragukan diri sendiri. Selalu jalankan systemctl daemon-reload setelah menyunting unit.

Unit Layanan yang Layak Produksi

# /etc/systemd/system/aplikasi.service
[Unit]
Description=Layanan Pesanan
After=network-online.target postgresql.service
Wants=network-online.target

[Service]
Type=simple
User=aplikasi
Group=aplikasi
WorkingDirectory=/srv/aplikasi
EnvironmentFile=/etc/aplikasi/env
ExecStart=/srv/aplikasi/bin/server
ExecReload=/bin/kill -HUP $MAINPID

Restart=on-failure
RestartSec=5s
StartLimitIntervalSec=60
StartLimitBurst=3

# Pengerasan
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/srv/aplikasi/data
CapabilityBoundingSet=

# Batas sumber daya
LimitNOFILE=65535
MemoryMax=2G

[Install]
WantedBy=multi-user.target
📌 Opsi pengerasan sering terlewat padahal murah

ProtectSystem=strict membuat seluruh filesystem hanya-baca kecuali yang Anda izinkan lewat ReadWritePaths. PrivateTmp=true memberi /tmp terisolasi. NoNewPrivileges=true memutus jalur eskalasi lewat setuid. Ketiganya hanya beberapa baris tetapi mempersempit dampak bila layanan Anda diretas.

⚠️ Restart=always bisa menyembunyikan masalah

Dengan always, layanan yang gagal menyala akan dicoba terus tanpa henti, dan bug konfigurasi bisa tidak terlihat berhari-hari. Restart=on-failure dipadu StartLimitBurst membuat systemd menyerah setelah beberapa kali gagal beruntun, sehingga status layanan menjadi failed dan alert Anda berbunyi.

journalctl

journalctl -u aplikasi -f                 # ikuti secara langsung
journalctl -u aplikasi --since "1 hour ago"
journalctl -u aplikasi --since today --until "10:00"
journalctl -u aplikasi -p err             # hanya level error ke atas
journalctl -u aplikasi -n 100 --no-pager
journalctl -k                             # pesan kernel
journalctl -b -1                          # boot sebelumnya
journalctl --disk-usage
journalctl --vacuum-time=7d               # buang log lebih tua dari 7 hari
💡 Log aplikasi cukup ditulis ke stdout

Bila layanan Anda dijalankan systemd, apa pun yang ditulis ke stdout dan stderr otomatis masuk journal dengan stempel waktu dan metadata unit. Aplikasi tidak perlu mengurus berkas log, rotasi, atau izin direktori sendiri. Prinsip yang sama berlaku di kontainer — dan itu bukan kebetulan.

Timer sebagai Pengganti cron

# /etc/systemd/system/pencadangan.service
[Unit]
Description=Pencadangan basis data

[Service]
Type=oneshot
User=postgres
ExecStart=/usr/local/bin/cadangkan.sh

# /etc/systemd/system/pencadangan.timer
[Unit]
Description=Jalankan pencadangan tiap hari pukul 02:00

[Timer]
OnCalendar=*-*-* 02:00:00
RandomizedDelaySec=300      # sebar beban antar server
Persistent=true             # kejar jadwal yang terlewat saat mesin mati

[Install]
WantedBy=timers.target
systemctl enable --now pencadangan.timer
systemctl list-timers --all
journalctl -u pencadangan.service --since today
📌 Kelebihan timer dibanding cron
  • Lognya menyatu di journal, bukan bergantung pada email atau redirect manual.
  • Persistent=true menjalankan tugas yang terlewat karena mesin mati — cron tidak bisa.
  • RandomizedDelaySec mencegah seratus server menjalankan pencadangan pada detik yang sama.
  • Bisa memakai seluruh opsi pengerasan dan batas sumber daya seperti layanan biasa.

Ketika Layanan Gagal

systemctl status aplikasi          # baca beberapa baris log terakhir di sini
systemctl list-units --state=failed
systemctl cat aplikasi             # unit final SETELAH semua override
systemctl show aplikasi | grep -i restart
systemd-analyze verify /etc/systemd/system/aplikasi.service