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|dbus
always|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-chain
Systemd 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.