systemd adalah init system modern di banyak distro Linux (Debian/Ubuntu, RHEL/CentOS/Alma/Rocky, Fedora, openSUSE).
systemctl adalah CLI utama untuk mengelola service (unit): start/stop, enable/disable saat boot, melihat status dan log, serta membuat unit kustom.
.service (proses/aplikasi).socket (socket activation).timer (penjadwalan, pengganti cron).target (kumpulan unit, mode runlevel).mount / .automount.path, .device, .slice, .scope/etc/systemd/system/ — local override (persisten) ✅/usr/lib/systemd/system/ — file dari paket (RHEL/Fedora/Arch)/lib/systemd/system/ — file dari paket (Debian/Ubuntu)/etc/systemd/system/<unit>.d/*.conf untuk menimpa sebagian konfigurasi tanpa menyentuh file paket..service:
[Unit] → metadata & dependency[Service] → eksekusi & perilaku proses[Install] → integrasi enable/disable (mis. WantedBy=)systemctl status nginx.service
systemctl start nginx.service
systemctl stop nginx.service
systemctl restart nginx.service
systemctl reload nginx.service # kirim SIGHUP jika didukung
systemctl enable nginx.service
systemctl disable nginx.service
systemctl is-enabled nginx.service
systemctl is-active nginx.service
systemctl is-failed nginx.service
systemctl list-units --type=service
systemctl list-unit-files --type=service
journalctl -u nginx.service --since "today"
journalctl -u nginx.service -f # follow realtime
journalctl -xeu nginx.service # detail error + context
sudo systemctl daemon-reload
Buat file /etc/systemd/system/myapp.service:
[Unit]
Description=MyApp Web API
After=network.target
Wants=network-online.target
[Service]
Type=simple
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/dotnet /opt/myapp/MyApp.dll
Restart=on-failure
RestartSec=5
User=myapp
Group=myapp
Environment=ASPNETCORE_URLS=http://0.0.0.0:5000
[Install]
WantedBy=multi-user.target
Aktifkan:
sudo systemctl daemon-reload
sudo systemctl enable --now myapp.service
systemctl status myapp.service
journalctl -u myapp.service -f
sudo systemctl edit nginx.service
Akan membuat /etc/systemd/system/nginx.service.d/override.conf. Contoh isi:
[Service]
Environment="WORKERS=4"
[Service]simple|forking|oneshot|notify|dbusalways|on-failure|on-abnormal|on-watchdog|no(Debian) atau/etc/sysconfig/myapp` (RHEL)0027 (contoh default permission yang lebih ketat)Tambahkan pada [Service] untuk membatasi dampak kompromi proses:
NoNewPrivileges=true
ProtectSystem=strict # rootfs read-only; gunakan ReadWritePaths= jika perlu tulis
ProtectHome=true # blok akses /home, /root, /run/user
PrivateTmp=true # /tmp terisolasi
PrivateDevices=true # blok akses device mentah
CapabilityBoundingSet= # kosongkan untuk drop semua capability root
AmbientCapabilities= # whitelist capability yang dibutuhkan, mis. CAP_NET_BIND_SERVICE
ReadWritePaths=/var/lib/myapp /var/log/myapp
RestrictAddressFamilies=AF_INET AF_INET6
RestrictNamespaces=yes
SystemCallFilter=@system-service
LockPersonality=yes
MemoryMax=500M
CPUQuota=80%
TasksMax=1024
Analisis tingkat keamanan unit:
systemd-analyze security myapp.service
/etc/systemd/system/backup-db.service
[Unit]
Description=Backup Database harian
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup_db.sh
/etc/systemd/system/backup-db.timer
[Unit]
Description=Jalankan backup-db.service setiap hari
[Timer]
OnCalendar=daily
Persistent=true # jalankan yang terlewat saat sistem mati
Unit=backup-db.service
[Install]
WantedBy=timers.target
Aktifkan:
sudo systemctl daemon-reload
sudo systemctl enable --now backup-db.timer
systemctl list-timers
Contoh OnCalendar: Mon..Fri 08:00, *:0/15 (tiap 15 menit), weekly, 2025-09-01 23:00.
/etc/systemd/system/echo.socket
[Unit]
Description=Echo TCP socket
[Socket]
ListenStream=12345
Accept=no
[Install]
WantedBy=sockets.target
/etc/systemd/system/echo.service
[Unit]
Description=Echo server
[Service]
ExecStart=/usr/local/bin/echo-server --port=12345
Aktifkan:
sudo systemctl daemon-reload
sudo systemctl enable --now echo.socket
systemctl status echo.socket
Service akan start hanya saat ada koneksi ke port 12345.
systemctl get-default sudo systemctl set-default multi-user.target (server) / graphical.target (desktop) sudo systemctl rescue sudo systemctl emergency systemd-analyze blame
systemd-analyze critical-chainSystemd juga berjalan per-user:
systemctl --user enable --now myapp.service
journalctl --user -u myapp.service -f
Agar tetap hidup setelah logout, aktifkan lingering:
sudo loginctl enable-linger <username>
Unit user disimpan di: ~/.config/systemd/user/
systemctl status <unit>
journalctl -xeu <unit> # error detail
systemctl cat <unit> # lihat isi unit + drop-in
systemd-analyze verify <path/to/unit> # validasi sintaks unit
systemd-delta # lihat perbedaan override
systemctl show -p ExecMainStatus <unit> # exit code eksekusi
Jika mengubah unit/override, selalu:
sudo systemctl daemon-reload
/etc/systemd/system/ atau drop-in .d/, hindari edit file bawaan paket. EnvironmentFile= untuk konfigurasi yang mudah diubah tanpa restart biner. Restart= dan RestartSec= sesuai karakter aplikasi (service resilien). journalctl -u <service> -f saat debugging. After=, Requires=, Wants=) agar urutan start jelas. systemctl adalah alat utama untuk mengelola lifecycle service di Linux modern. journalctl, dan fitur timer/socket untuk operasi yang rapi dan terukur.