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
daemon-reload adalah kebingungan klasikSetelah 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
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 masalahDengan 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
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
- Lognya menyatu di journal, bukan bergantung pada email atau redirect manual.
Persistent=truemenjalankan tugas yang terlewat karena mesin mati — cron tidak bisa.RandomizedDelaySecmencegah 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