systemd: apa itu, cara kerjanya, dan cara mengelola layanan di Linux
systemd adalah sistem inisialisasi dan pengelola layanan Linux: kernel menjalankannya sebagai proses pertama (PID 1), lalu ia menyalakan layanan lain sesuai urutan dan mengawasinya. Semua yang dikelola systemd dideskripsikan dalam bentuk unit — layanan, timer, titik mount — dan dikelola dengan systemctl, sedangkan journalctl menampilkan log-nya.
systemd adalah sistem inisialisasi dan pengelola layanan yang dipakai di sebagian besar distribusi Linux modern: Debian, Ubuntu, Fedora, RHEL, dan turunannya. Setelah boot, kernel menjalankan systemd sebagai proses pertama dengan PID 1, lalu systemd menyalakan jaringan, memasang disk, menjalankan web server, basis data, dan semua layanan lain. Jika dijawab singkat, systemd adalah "pengatur" yang tahu layanan apa yang harus berjalan, dalam urutan apa dinyalakan, dan apa yang harus dilakukan jika sebuah layanan jatuh.
Memastikan bahwa sistem Anda memakai systemd cukup mudah:
$ ps -p 1 -o comm=
systemd
Mengapa systemd diciptakan
Dulu Linux memakai SysV init: kumpulan skrip shell di /etc/init.d/ yang dijalankan satu per satu. Cara ini mudah dipahami tetapi lambat dan rapuh. Setiap skrip menulis berkas PID sendiri, memutuskan sendiri cara memeriksa apakah proses masih hidup, dan memulai ulang layanan yang jatuh harus dibuat secara terpisah.
systemd menyelesaikan masalah-masalah ini secara terpusat:
- Peluncuran paralel. Layanan dinyalakan bersamaan selama tidak ada ketergantungan di antaranya, sehingga boot lebih cepat.
- Ketergantungan dan urutan. Deskripsi layanan menyatakan secara eksplisit apa yang dibutuhkannya (misalnya jaringan) dan setelah apa ia harus dijalankan.
- Pengawasan. systemd mengenali semua proses layanan melalui cgroups dan dapat memulai ulangnya saat terjadi kegagalan.
- Satu jurnal. Keluaran semua layanan dikumpulkan oleh journald dan dibaca dengan satu perintah.
- Antarmuka yang seragam. Setiap layanan dikelola dengan cara yang sama:
systemctl start|stop|restart|status.
Selain pengelola layanan, proyek systemd mencakup beberapa komponen: journald (log), logind (sesi pengguna), timesyncd (sinkronisasi waktu), resolved (DNS), dan networkd (jaringan). Tidak semua distribusi memakai semuanya, tetapi systemd sebagai PID 1 dan journald hampir selalu ada.
Unit: komponen systemd
Semua yang dikelola systemd dideskripsikan oleh unit. Unit adalah berkas teks berformat INI, dan jenisnya ditentukan oleh ekstensinya.
| Jenis | Ekstensi | Yang dideskripsikan |
|---|---|---|
| service | .service | layanan — proses daemon atau tugas sekali jalan |
| timer | .timer | menjalankan unit lain sesuai jadwal (pengganti cron) |
| socket | .socket | socket yang menyalakan layanan saat diakses |
| target | .target | kelompok unit, yaitu "keadaan sistem" (misalnya multi-user.target) |
| mount | .mount | titik pemasangan (mount point) |
| path | .path | pemantauan berkas atau direktori |
Lokasi berkas unit
Berkas unit disimpan di beberapa direktori, dan masing-masing memiliki prioritas:
/usr/lib/systemd/system/(di Debian dan Ubuntu juga/lib/systemd/system/) — unit yang dipasang oleh paket. Jangan diedit langsung: pembaruan paket akan menimpa perubahan Anda./etc/systemd/system/— unit dan penimpaan dari administrator. Prioritasnya paling tinggi./run/systemd/system/— unit sementara yang dibuat saat sistem berjalan.
Untuk melihat isi unit beserta semua penimpaannya, gunakan systemctl cat nginx.service.
Target sebagai pengganti runlevel
Runlevel lama digantikan oleh target. multi-user.target adalah mode server biasa tanpa grafis, graphical.target dengan antarmuka grafis, dan rescue.target adalah mode pemulihan single-user. Target default ditampilkan dengan systemctl get-default dan diubah dengan systemctl set-default multi-user.target.
systemctl: mengelola layanan
systemctl adalah alat utama untuk bekerja dengan systemd. Sebagian besar perintahnya mengubah keadaan sistem dan membutuhkan sudo.
| Perintah | Fungsi |
|---|---|
systemctl status nginx | status layanan, PID, memori, beberapa baris log terakhir |
systemctl start nginx | menjalankan sekarang |
systemctl stop nginx | menghentikan |
systemctl restart nginx | memulai ulang (stop + start) |
systemctl reload nginx | memuat ulang konfigurasi tanpa berhenti (jika layanan mendukungnya) |
systemctl enable nginx | mengaktifkan autostart |
systemctl disable nginx | menonaktifkan autostart |
systemctl enable --now nginx | mengaktifkan autostart dan langsung menjalankan |
systemctl is-active nginx | menampilkan active/inactive — praktis di dalam skrip |
systemctl list-units --type=service | layanan yang sudah dimuat |
systemctl --failed | unit yang gagal |
systemctl daemon-reload | membaca ulang berkas unit setelah diedit |
Cara membaca systemctl status
$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled)
Active: active (running) since Mon 2026-10-12 09:14:03 UTC; 2h 5min ago
Docs: man:nginx(8)
Main PID: 812 (nginx)
Tasks: 3 (limit: 2307)
Memory: 6.1M
CPU: 154ms
CGroup: /system.slice/nginx.service
├─812 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
├─813 "nginx: worker process"
└─814 "nginx: worker process"
Baris Loaded menunjukkan dari mana unit diambil dan apakah autostart aktif (enabled). Baris Active adalah keadaan saat ini: active (running), inactive (dead), atau failed. Blok CGroup memperlihatkan semua proses layanan — begitulah systemd mengetahui proses mana yang menjadi miliknya.
Beda enable dan start
Ini sering membingungkan. start menjalankan layanan sekarang, tetapi setelah reboot layanan tidak ikut naik. enable membuat tautan simbolik di direktori target (misalnya /etc/systemd/system/multi-user.target.wants/), sehingga layanan naik saat boot, tetapi tidak dijalankan sekarang. Biasanya Anda membutuhkan keduanya — gunakan enable --now.
Ada juga keadaan ketiga, yaitu mask. systemctl mask service menghubungkan unit ke /dev/null, sehingga unit tidak bisa dijalankan, baik manual maupun sebagai dependensi. Berguna ketika sebuah layanan harus benar-benar dimatikan.
journalctl: log layanan
Semua yang ditulis layanan ke stdout dan stderr ditangkap oleh systemd-journald dan disimpan dalam jurnal biner bersama metadatanya: nama unit, PID, prioritas, dan waktu. Jurnal dibaca dengan journalctl.
journalctl -u nginx # log satu layanan
journalctl -u nginx -f # memantau real-time, seperti tail -f
journalctl -u nginx --since "1 hour ago"
journalctl -u nginx -n 50 # 50 baris terakhir
journalctl -b # sejak boot saat ini
journalctl -b -1 # boot sebelumnya
journalctl -p err -b # hanya error dan yang lebih berat
journalctl -k # pesan kernel
journalctl --disk-usage # ruang yang dipakai jurnal
Opsi -p menyaring menurut prioritas syslog: emerg, alert, crit, err, warning, notice, info, debug. Level yang ditentukan ikut menampilkan semua yang lebih berat darinya.
Jurnal setelah reboot
Jika direktori /var/log/journal tidak ada dan di /etc/systemd/journald.conf tertulis Storage=auto, jurnal hanya disimpan di memori (/run/log/journal) dan hilang saat reboot. Agar permanen, atur Storage=persistent atau buat direktorinya lalu restart journald. Ukurannya dibatasi oleh SystemMaxUse=, dan data lama dibersihkan dengan journalctl --vacuum-time=2weeks atau --vacuum-size=500M.
journald sering dipasangkan dengan rsyslog: journal meneruskan pesan ke rsyslog, yang menulis berkas teks klasik di /var/log/ dan dapat mengirim log ke server pusat.
Autostart layanan sendiri: contoh unit file
Misalkan Anda punya aplikasi — skrip atau binari — yang harus terus berjalan, naik saat boot, dan dimulai ulang jika jatuh. Buat berkas /etc/systemd/system/myapp.service:
[Unit]
Description=My web application
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=myapp
Group=myapp
WorkingDirectory=/opt/myapp
EnvironmentFile=/etc/myapp/env
ExecStart=/opt/myapp/bin/server --port 8080
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
Mari kita bahas bagian-bagiannya:
- [Unit] — deskripsi dan ketergantungan.
After=hanya menentukan urutan,Wants=adalah ketergantungan lunak (ikut dinyalakan, tetapi tidak gagal jika unit itu tidak naik). Ketergantungan keras adalahRequires=. - [Service] — cara menjalankan.
Type=simpleberarti proses dariExecStartadalah layanan itu sendiri dan tidak berpindah ke latar belakang.User=menjalankan layanan dengan pengguna tanpa hak istimewa.Restart=on-failurememulai ulang layanan jika berakhir dengan error, setelahRestartSecdetik. - [Install] — apa yang dilakukan
enable.WantedBy=multi-user.targetberarti "jalankan pada boot biasa".
Menerapkannya:
sudo useradd --system --no-create-home --shell /usr/sbin/nologin myapp
sudo systemctl daemon-reload
sudo systemctl enable --now myapp
systemctl status myapp
journalctl -u myapp -f
Kesalahan umum di unit file
- Path relatif di ExecStart. Path ke program harus absolut. systemd tidak mencari perintah di
PATHpengguna seperti shell. - Lupa daemon-reload. Setelah berkas diedit, systemd masih memakai versi lama dan memperingatkannya di
status. - Daemon berpindah ke latar belakang. Jika program melakukan fork sendiri tetapi ditulis
Type=simple, systemd menganggap layanan sudah selesai. Jalankan program dalam mode foreground, atau gunakanType=forkingdenganPIDFile=. - Variabel lingkungan dari profil. Layanan tidak membaca
~/.bashrcdan/etc/profile. Variabel diatur lewatEnvironment=atauEnvironmentFile=.
Penimpaan tanpa mengubah unit dari paket
Untuk mengubah parameter layanan dari paket tanpa menyentuh berkasnya, gunakan drop-in:
sudo systemctl edit nginx
Editor akan terbuka, dan perubahan disimpan di /etc/systemd/system/nginx.service.d/override.conf. Misalnya, Anda bisa menambahkan [Service] dan Restart=always. Setelah editor ditutup, systemd memuat ulang konfigurasinya secara otomatis.
Timer systemd sebagai pengganti cron
Timer adalah unit yang menjalankan layanan dengan nama yang sama sesuai jadwal. Kelebihannya dibanding cron: log tugas tersimpan di journal, ada ketergantungan, dan jalannya yang terlewat bisa dikejar (Persistent=true). Contoh cadangan harian:
# /etc/systemd/system/backup.service
[Unit]
Description=Nightly backup
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
# /etc/systemd/system/backup.timer
[Unit]
Description=Run backup daily
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
systemctl list-timers
Ekspresi OnCalendar bisa diuji dengan systemd-analyze calendar "*-*-* 03:00:00", yang akan menampilkan waktu eksekusi berikutnya.
Diagnostik boot
systemd menyimpan waktu mulai setiap unit, sehingga boot yang lambat mudah dianalisis:
systemd-analyze # total waktu boot
systemd-analyze blame # unit diurutkan menurut waktu mulai
systemd-analyze critical-chain # rantai yang menunda boot
systemd-analyze verify /etc/systemd/system/myapp.service # memeriksa unit file
Kesimpulan
systemd adalah PID 1 dan pengelola layanan di Linux modern. Ia mendeskripsikan segalanya dengan unit, dikendalikan dengan systemctl, mengumpulkan log ke dalam jurnal yang dibaca dengan journalctl, dan dapat menjalankan tugas dengan timer sebagai pengganti cron. Untuk memakainya dengan percaya diri, cukup kuasai status, enable --now, journalctl -u, dan kemampuan menulis unit file sederhana dengan Restart=on-failure. systemd, journald, dan pencatatan log dibahas dengan praktik dalam kursus Linux.
Pertanyaan umum
Bagaimana cara memastikan sistem saya memakai systemd?
Jalankan ps -p 1 -o comm= — jika keluarannya systemd, sistem berjalan dengan systemd. Direktori /run/systemd/system juga hanya ada jika sistem di-boot dengan systemd.
Apa bedanya systemctl restart dan reload?
restart menghentikan lalu menjalankan ulang layanan sepenuhnya, sehingga koneksi terputus. reload meminta layanan memuat ulang konfigurasinya tanpa berhenti, tetapi hanya berfungsi jika unit memiliki ExecReload.
Bisakah layanan systemd dijalankan tanpa sudo oleh pengguna biasa?
Bisa, systemd memiliki instance pengguna: unit diletakkan di ~/.config/systemd/user/ dan dikelola dengan systemctl --user. Agar tetap berjalan tanpa sesi aktif, aktifkan loginctl enable-linger untuk pengguna tersebut.
Mengapa layanan berstatus failed dan bagaimana mereset statusnya?
Cari penyebabnya di journalctl -u nama -b dan di baris Active pada status. Setelah masalah diperbaiki, jalankan layanan lagi; penanda failed dihapus dengan systemctl reset-failed.
Di mana log systemd disimpan di disk?
Jika penyimpanan permanen aktif, di /var/log/journal/ dalam format biner; jika tidak, di /run/log/journal/ di memori. Bacalah lewat journalctl, bukan dengan utilitas teks.
Topik ini dibahas mendalam dengan praktik di kursus “Linux: с нуля до уверенного администрирования”.
- systemd: как на самом деле запускаются сервисы в современном Linux
- Журналы и мониторинг: journald, rsyslog и sysstat