systemd adalah init system default di hampir semua distro Linux modern (Ubuntu, Debian, Fedora, Arch). Tugasnya: jalankan service, restart saat crash, manage dependency antar-service, kumpulkan log.
Unit files — blueprint untuk service:
# /etc/systemd/system/myapp.service
[Unit]
Description=My Node.js app
After=network.target
[Service]
Type=simple
User=deploy
WorkingDirectory=/srv/myapp
ExecStart=/usr/bin/node server.js
Restart=on-failure
RestartSec=5
Environment="NODE_ENV=production"
[Install]
WantedBy=multi-user.target
Tiga bagian:
- [Unit] — metadata + dependensi (
After,Requires) - [Service] — cara menjalankan (
ExecStart,Restart,User) - [Install] — target untuk
enable(biasanyamulti-user.target)
Perintah dasar systemctl:
sudo systemctl start myapp # jalankan sekarang
sudo systemctl stop myapp # hentikan
sudo systemctl restart myapp # restart
sudo systemctl reload myapp # reload config tanpa stop/start
sudo systemctl status myapp # status + 10 log terakhir
sudo systemctl enable myapp # start otomatis saat boot
sudo systemctl disable myapp # tidak start saat boot
sudo systemctl daemon-reload # reload setelah edit unit file
Melihat log dengan journalctl:
journalctl -u myapp # semua log service ini
journalctl -u myapp -f # follow (seperti tail -f)
journalctl -u myapp --since "1 hour ago"
journalctl -u myapp -n 100 # 100 baris terakhir
journalctl -u myapp --grep "ERROR"
journalctl -p err # hanya level error ke atas
Restart policy:
| Policy | Kapan restart |
|---|---|
no |
Tidak pernah (default) |
on-failure |
Jika exit non-zero atau crash (paling umum) |
always |
Selalu, termasuk jika di-stop manual |
on-abnormal |
Hanya sinyal/timeout |
Timers — alternatif modern untuk cron:
# /etc/systemd/system/backup.timer
[Timer]
OnCalendar=daily
Persistent=true # jalankan saat boot jika terlewat
[Install]
WantedBy=timers.target
Keuntungan timer vs cron:
- Log terintegrasi dengan journalctl
- Tidak gagal senyap (systemd track exit status)
- Bisa depend pada service lain
User-level service (tanpa sudo):
systemctl --user start myapp
# unit file di ~/.config/systemd/user/myapp.service
loginctl enable-linger $USER # service tetap jalan meski user logout
Debugging service yang gagal start:
systemctl status myapp # cek exit code + log terakhir
journalctl -u myapp -b # log sejak boot terakhir
systemd-analyze verify /etc/systemd/system/myapp.service # validasi syntax
Pitfalls:
- Lupa
daemon-reloadsetelah edit unit file → perubahan tidak terbaca ExecStartpakai path relatif → absolute path wajib- Tidak set
User=→ service jalan sebagai root (risiko keamanan) Restart=alwaysuntuk proses yang selalu exit → loop tak terbatas