Systemd
adalah sistem init dan pengelola sistem yang secara luas telah menjadi standar baru untuk berbagai distribusi Linux. Karena digunakan secara luas, memahami systemd
akan mengatasi banyak masalah, karena ini akan membuat pengelolaan server menjadi jauh lebih mudah. Mempelajari dan memanfaatkan berbagai alat dan daemon yang meliputi systemd
akan membantu Anda menghargai kehebatan, fleksibilitas, dan kemampuan yang diberikannya dengan lebih baik, atau setidaknya membantu Anda melakukan pekerjaan tanpa banyak kesulitan.
Dalam panduan ini, kita akan membahas perintah systemctl
, yang merupakan alat manajemen pusat untuk mengontrol sistem init. Kita akan membahas cara mengelola layanan, memeriksa status, mengubah keadaan sistem, dan menangani berkas konfigurasi.
Harap diperhatikan bahwa meskipun systemd
telah menjadi sistem init asali untuk banyak distribusi Linux, tetapi tidak diterapkan secara universal ke semua distribusi. Saat mengikuti tutorial ini, jika terminal Anda memberikan keluaran pesan kesalahan bash: systemctl is not installed
, kemungkinan mesin Anda menginstal sistem init yang berbeda.
Kegunaan mendasar dari sistem init adalah menginisialisasi komponen yang harus dimulai setelah kernel Linux melakukan boot (biasanya dikenal dengan komponen “userland”). Sistem init juga digunakan untuk mengelola layanan dan daemon bagi server di titik apa pun selama sistem dijalankan. Dengan mengingat hal itu, kita akan mulai dengan beberapa operasi manajemen layanan dasar.
Di systemd
, target sebagian besar tindakan adalah “unit”, yakni sumber daya yang diketahui cara pengelolaannya oleh systemd
. Unit dikelompokkan menurut tipe sumber daya yang diwakilinya dan didefinisikan bersama berkas yang dikenal dengan berkas unit. Tipe setiap unit dapat ditebak dari akhiran di belakang berkas.
Untuk tugas manajemen layanan, unit target akan berupa unit layanan, yang memiliki berkas unit dengan akhiran .service
. Namun, untuk kebanyakan perintah manajemen layanan, Anda sebenarnya dapat menanggalkan akhiran .service
, karena systemd
sudah cukup cerdas untuk mengetahui bahwa Anda mungkin ingin mengoperasikan suatu layanan saat menggunakan perintah manajemen layanan.
Untuk memulai layanan systemd
, yang mengeksekusi instruksi dalam berkas unit layanan, gunakan perintah start
. Jika menjalankan sebagai pengguna non-root, Anda akan perlu menggunakan sudo
karena ini akan memengaruhi keadaan sistem operasi:
- sudo systemctl start application.service
Seperti yang kami sebutkan di atas, systemd
tahu untuk mencari berkas *.service
untuk perintah manajemen layanan, sehingga perintah dapat diketikkan semudah ini:
- sudo systemctl start application
Meskipun Anda mungkin menggunakan format di atas untuk administrasi umum, demi kejelasan, kita akan menggunakan akhiran .service
untuk perintah selebihnya, agar target operasi kita lebih jelas.
Untuk menghentikan layanan yang sedang berjalan, Anda dapat menggunakan perintah stop
sebagai gantinya:
- sudo systemctl stop application.service
Untuk memulai ulang layanan yang sedang berjalan, Anda dapat menggunakan perintah restart
:
- sudo systemctl restart application.service
Jika aplikasi tersebut dapat memuat ulang berkas konfigurasinya (tanpa memulai ulang), Anda dapat memberikan perintah reload
untuk memulai proses:
- sudo systemctl reload application.service
Jika tidak yakin apakah layanan memiliki fungsionalitas untuk memuat ulang konfigurasinya, Anda dapat memberikan perintah reload-or-restart
. Perintah ini akan memuat ulang konfigurasi jika tersedia. Jika tidak, perintah ini akan memulai ulang layanan sehingga konfigurasi baru akan diambil:
- sudo systemctl reload-or-restart application.service
Perintah di atas berguna untuk memulai atau menghentikan layanan selama sesi yang berjalan saat ini. Untuk memberi tahu systemd
agar memulai layanan secara otomatis saat boot, Anda harus mengaktifkannya.
Untuk memulai layanan saat boot, gunakan perintah enable
:
- sudo systemctl enable application.service
Ini akan membuat tautan simbolis dari salinan berkas layanan sistem (biasanya di /lib/systemd/system
atau /etc/systemd/system
) ke dalam lokasi di diska tempat systemd
mencari berkas autostart (biasanya /etc/systemd/system/some_target.target.wants
. Kita akan membahas targetnya nanti dalam panduan ini).
Untuk menonaktifkan layanan agar tidak dimulai secara otomatis, Anda dapat mengetikkan:
- sudo systemctl disable application.service
Ini akan menghapus tautan simbolis yang menandakan bahwa layanan harus dimulai secara otomatis.
Ingatlah bahwa mengaktifkan layanan tidak akan memulainya di sesi saat ini. Jika Anda ingin memulai layanan dan juga mengaktifkannya saat boot, Anda harus memberikan perintah start
dan enable
.
Untuk memeriksa status layanan di sistem, Anda dapat menggunakan perintah status
:
- systemctl status application.service
Perintah ini akan memberi tahu Anda keadaan layanan, hierarki cgroup, dan beberapa baris log pertama.
Misalnya, saat memeriksa status server Nginx, Anda mungkin melihat keluaran seperti ini:
Output● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2015-01-27 19:41:23 EST; 22h ago
Main PID: 495 (nginx)
CGroup: /system.slice/nginx.service
├─495 nginx: master process /usr/bin/nginx -g pid /run/nginx.pid; error_log stderr;
└─496 nginx: worker process
Jan 27 19:41:23 desktop systemd[1]: Starting A high performance web server and a reverse proxy server...
Jan 27 19:41:23 desktop systemd[1]: Started A high performance web server and a reverse proxy server.
Ini memberikan gambaran bagus tentang status aplikasi saat ini, yang memberi tahu Anda masalah dan tindakan yang mungkin diperlukan.
Ada juga metode untuk memeriksa keadaan tertentu. Misalnya, untuk memeriksa agar tahu apakah suatu unit sedang aktif (berjalan), Anda dapat menggunakan perintah is-active
:
- systemctl is-active application.service
Ini akan menunjukkan keadaan unit saat ini, yang biasanya berupa active
atau inactive
. Kode yang keluar akan “0” jika aktif, sehingga membuat hasilnya jadi lebih mudah diurai dalam skrip shell.
Untuk melihat apakah unit diaktifkan, Anda dapat menggunakan perintah is-enabled
:
- systemctl is-enabled application.service
Ini akan memberikan keluaran apakah layanan enabled
atau disabled
dan akan menetapkan lagi kode keluar ke “0” atau “1”, tergantung jawaban terhadap pertanyaan perintah.
Pemeriksaan ketiga adalah apakah unit dalam keadaan gagal. Ini menandakan adanya masalah saat memulai unit tersebut:
- systemctl is-failed application.service
Hasilnya akan menjadi active
jika berjalan dengan benar atau failed
jika terjadi kesalahan. Jika unit sengaja dihentikan, hasilnya mungkin akan berupa unknown
atau inactive
. Status keluar “0” menandakan terjadi suatu kegagalan dan status keluar “1” menandakan status lainnya.
Sejauh ini, perintah berguna untuk mengelola layanan tunggal, tetapi tidak terlalu berguna untuk mempelajari keadaan sistem saat ini. Ada sejumlah sejumlah perintah systemctl
yang memberikan informasi ini.
Untuk melihat daftar semua unit aktif yang diketahui systemd
, kita dapat menggunakan perintah list-units
:
- systemctl list-units
Perintah ini akan menampilkan semua unit systemd
yang saat ini aktif di sistem. Keluarannya akan terlihat seperti ini:
OutputUNIT LOAD ACTIVE SUB DESCRIPTION
atd.service loaded active running ATD daemon
avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack
dbus.service loaded active running D-Bus System Message Bus
dcron.service loaded active running Periodic Command Scheduler
dkms.service loaded active exited Dynamic Kernel Modules System
getty@tty1.service loaded active running Getty on tty1
. . .
Keluarannya memiliki kolom berikut:
systemd
systemd
. Konfigurasi unit yang dimuat tersimpan dalam memori.Karena perintah list-units
hanya menampilkan unit aktif secara asali, semua entri di atas akan menampilkan loaded
dalam kolom LOAD dan active
dalam kolom ACTIVE. Tampilan ini sebenarnya adalah perilaku asali systemctl
bila dipanggil tanpa perintah tambahan, sehingga Anda akan melihat hal yang sama jika memanggil systemctl
tanpa argumen:
- systemctl
Kita dapat menyuruh systemctl
agar mengeluarkan informasi yang berbeda dengan memberikan bendera tambahan. Misalnya, untuk melihat semua unit yang telah dimuat (atau berupaya dimuat) oleh systemd
, entah saat ini aktif atau tidak, Anda dapat menggunakan bendera --all
, seperti ini:
- systemctl list-units --all
Ini akan menampilkan unit yang telah dimuat atau berupaya dimuat oleh systemd
, terlepas dari keadaannya saat ini di sistem. Beberapa unit menjadi tidak aktif setelah berjalan, dan beberapa unit yang berupaya dimuat oleh systemd
mungkin tidak ditemukan pada diska.
Anda dapat menggunakan bendera lain untuk menyaring hasil ini. Misalnya, kita dapat menggunakan bendera --state=
untuk menandai keadaan LOAD, ACTIVE, atau SUB yang ingin kita lihat. Anda harus mempertahankan bendera --all
agar systemctl
mengizinkan unit nonaktif untuk ditampilkan:
- systemctl list-units --all --state=inactive
Filter umum lainnya adalah filter --type=
. Kita dapat menyuruh systemctl
agar hanya menampilkan unit dengan tipe yang kita minati. Misalnya, untuk melihat unit layanan aktif saja, kita dapat menggunakan:
- systemctl list-units --type=service
Perintah list-units
hanya menampilkan unit yang telah berupaya diurai dan dimuat systemd
ke dalam memori. Karena systemd
hanya akan membaca unit yang dianggapnya perlu, maka tidak perlu menyertakan semua unit yang tersedia di sistem. Untuk melihat setiap berkas unit yang tersedia dalam jalur systemd
, termasuk berkas yang tidak berupaya dimuat oleh systemd
, Anda dapat menggunakan perintah list-unit-files
sebagai gantinya:
- systemctl list-unit-files
Unit adalah representasi dari sumber daya yang diketahui systemd
. Karena systemd
menganggap belum perlu membaca semua definisi unit di tampilan ini, systemd hanya menampilkan informasi tentang berkas itu saja. Keluarannya memiliki dua kolom: berkas unit dan keadaan.
OutputUNIT FILE STATE
proc-sys-fs-binfmt_misc.automount static
dev-hugepages.mount static
dev-mqueue.mount static
proc-fs-nfsd.mount static
proc-sys-fs-binfmt_misc.mount static
sys-fs-fuse-connections.mount static
sys-kernel-config.mount static
sys-kernel-debug.mount static
tmp.mount static
var-lib-nfs-rpc_pipefs.mount static
org.cups.cupsd.path enabled
. . .
Keadaan biasanya berupa enabled
, disabled
, static
, atau masked
. Dalam konteks ini, static berarti berkas unit tidak berisi bagian install
, yang digunakan untuk mengaktifkan unit. Dengan demikian, unit-unit ini tidak dapat diaktifkan. Biasanya, ini berarti unit melakukan tindakan sekali-jalan atau hanya digunakan sebagai dependensi unit lain dan tidak boleh dijalankan dengan sendirinya.
Kita akan membahas makna masked
sebentar lagi.
Sejauh ini, kita telah menggunakan beberapa layanan dan menampilkan informasi tentang unit dan berkas unit yang diketahui oleh systemd
. Namun, kita dapat mengetahui informasi yang lebih spesifik tentang unit menggunakan beberapa perintah tambahan.
Untuk menampilkan berkas unit yang telah dimuat systemd
ke dalam sistemnya, Anda dapat menggunakan perintah cat
(ini telah ditambahkan dalam systemd
versi 209). Misalnya, untuk melihat berkas unit daemon penjadwalan atd
, kita dapat mengetikkan:
- systemctl cat atd.service
Output[Unit]
Description=ATD daemon
[Service]
Type=forking
ExecStart=/usr/bin/atd
[Install]
WantedBy=multi-user.target
Keluaran adalah berkas unit yang diketahui systemd
sebagai proses yang sedang berjalan. Ini dapat menjadi hal penting jika Anda baru-baru ini telah memodifikasi berkas unit atau jika Anda mengesampingkan beberapa opsi tertentu dalam fragmen berkas unit (kita akan membahasnya nanti).
Untuk melihat pohon dependensi unit, Anda dapat menggunakan perintah list-dependencies
:
- systemctl list-dependencies sshd.service
Perintah ini akan menampilkan pemetaan hierarki yang harus ditangani agar dapat memulai unit tersebut. Dependensi dalam konteks ini meliputi unit-unit yang diperlukan oleh atau yang diinginkan oleh unit di atasnya.
Outputsshd.service
├─system.slice
└─basic.target
├─microcode.service
├─rhel-autorelabel-mark.service
├─rhel-autorelabel.service
├─rhel-configure.service
├─rhel-dmesg.service
├─rhel-loadmodules.service
├─paths.target
├─slices.target
. . .
Dependensi rekursif hanya ditampilkan untuk unit .target
, yang menandakan keadaan sistem. Untuk menampilkan daftar semua dependensi secara rekursif, sertakan bendera --all
.
Untuk menampilkan dependensi terbalik (unit yang bergantung pada unit yang ditentukan), Anda dapat menambahkan bendera --reverse
pada perintah. Bendera lain yang berguna adalah --before
dan --after
, yang dapat digunakan untuk menampilkan unit yang bergantung pada unit yang ditentukan yang masing-masing dimulai sebelum dan setelah unit itu sendiri.
Untuk melihat properti tingkat rendah dari suatu unit, Anda dapat menggunakan perintah show
. Perintah ini akan menampilkan daftar properti yang diatur untuk unit yang ditentukan menggunakan format key=value
:
- systemctl show sshd.service
OutputId=sshd.service
Names=sshd.service
Requires=basic.target
Wants=system.slice
WantedBy=multi-user.target
Conflicts=shutdown.target
Before=shutdown.target multi-user.target
After=syslog.target network.target auditd.service systemd-journald.socket basic.target system.slice
Description=OpenSSH server daemon
. . .
Jika ingin menampilkan properti tunggal, Anda dapat memberikan bendera -p
bersama nama properti. Misalnya, untuk melihat konflik yang dimiliki unit sshd.service
, Anda dapat mengetikkan:
- systemctl show sshd.service -p Conflicts
OutputConflicts=shutdown.target
Di bagian manajemen layanan, kita telah melihat cara menghentikan atau menonaktifkan layanan, tetapi systemd
juga memiliki kemampuan untuk menandai suatu unit menjadi tidak dapat dimulai sama sekali, secara otomatis atau manual, dengan menautkannya ke /dev/null
. Perintah ini disebut masking unit, dan dapat dilakukan dengan perintah mask
:
- sudo systemctl mask nginx.service
Perintah ini akan mencegah layanan Nginx dimulai, secara otomatis atau manual, selama unit tersebut diberi mask.
Jika Anda memeriksa list-unit-files
, Anda akan melihat layanan kini tercantum sebagai diberi mask:
- systemctl list-unit-files
Output. . .
kmod-static-nodes.service static
ldconfig.service static
mandb.service static
messagebus.service static
nginx.service masked
quotaon.service static
rc-local.service static
rdisc.service disabled
rescue.service static
. . .
Jika Anda berupaya memulai layanan, Anda akan melihat pesan seperti ini:
- sudo systemctl start nginx.service
OutputFailed to start nginx.service: Unit nginx.service is masked.
Untuk melakukan unmask di suatu unit, agar unit dapat digunakan lagi, gunakan perintah unmask
:
- sudo systemctl unmask nginx.service
Ini akan mengembalikan unit ke keadaan sebelumnya, yang memungkinkannya dimulai atau diaktifkan.
Walaupun format spesifik untuk berkas unit berada di luar lingkup tutorial ini, systemctl
memberikan mekanisme bawaan untuk mengedit dan memodifikasi berkas unit jika Anda perlu membuat penyesuaian. Fungsionalitas ini ditambahkan dalam systemd
versi 218.
Perintah edit
secara asali akan membuka cuplikan berkas unit untuk unit tersebut:
- sudo systemctl edit nginx.service
Ini akan berupa berkas kosong yang dapat digunakan untuk mengesampingkan atau menambahkan arahan ke definisi unit. Direktori akan dibuat dalam direktori /etc/systemd/system
yang berisi nama unit dengan tambahan .d
. Misalnya, untuk nginx.service
, suatu direktori bernama nginx.service.d
akan dibuat.
Di dalam direktori ini, cuplikan akan dibuat dengan nama override.conf
. Bila unit dimuat, systemd
dalam memori akan menggabungkan cuplikan yang dikesampingkan dengan berkas unit penuh. Arahan cuplikan akan menjadi prioritas daripada yang ada dalam berkas unit asli.
Jika Anda ingin mengedit berkas unit penuh alih-alih membuat cuplikan, Anda dapat memberikan bendera --full
:
- sudo systemctl edit --full nginx.service
Perintah ini akan memuat berkas unit saat ini ke dalam editor, yang dapat dimodifikasi. Ketika keluar dari editor, berkas yang diubah ditulis ke /etc/systemd/system
, yang akan menjad prioritas dari definisi unit sistem (biasanya ditemukan di /lib/systemd/system
).
Untuk menghapus tambahan yang telah Anda buat, hapus direktori konfigurasi .d
unit atau berkas layanan yang dimodifikasi dari /etc/systemd/system
. Misalnya, untuk menghapus cuplikan, kita dapat mengetikkan:
- sudo rm -r /etc/systemd/system/nginx.service.d
Untuk menghapus berkas unit yang dimodifikasi sepenuhnya, kita ketikkan:
- sudo rm /etc/systemd/system/nginx.service
Setelah menghapus berkas atau direktori, Anda harus memuat ulang proses systemd
agar tidak lagi berupaya merujuk berkas-berkas ini dan kembali menggunakan salinan sistem. Anda dapat melakukannya dengan mengetikkan:
- sudo systemctl daemon-reload
Target adalah berkas unit khusus yang menggambarkan keadaan sistem atau titik sinkronisasi. Seperti unit lainnya, berkas yang mendefinisikan target dapat diidentifikasi melalui akhirannya, yang dalam hal ini adalah .target
. Target tidak mencocokkan dirinya sendiri, melainkan digunakan untuk mengelompokkan unit lain menjadi satu.
Perintah ini dapat digunakan untuk membawa sistem ke keadaan tertentu, seperti sistem init lainnya yang menggunakan runlevel. Semua itu digunakan sebagai referensi ketika fungsi tertentu tersedia, yang memungkinkan Anda menentukan keadaan yang diinginkan sebagai ganti unit individual yang diperlukan untuk menghasilkan keadaan itu.
Misalnya, ada swap.target
yang digunakan untuk menunjukkan bahwa swap siap digunakan. Unit yang menjadi bagian dari proses ini dapat menyinkronkan dengan target ini dengan menunjukkannya dalam konfigurasi bahwa unit tersebut WantedBy=
atau RequiredBy=
oleh swap.target
. Unit yang mengharuskan swap tersedia dapat menentukan syarat ini menggunakan spesifikasi Wants=
, Requires=
, dan After=
untuk menandakan sifat hubungannya.
Proses systemd
memiliki target asali yang digunakannya saat melakukan boot sistem. Memenuhi kaskade dependensi dari target tunggal itu akan membawa sistem ke keadaan yang diinginkan. Untuk menemukan target asali bagi sistem Anda, ketikkan:
- systemctl get-default
Outputmulti-user.target
Jika ingin menetapkan target asali yang berbeda, Anda dapat menggunakan set-default
. Misalnya, jika Anda telah menginstal desktop grafis dan ingin agar sistem melakukan boot ke desktop grafis secara asali, Anda dapat mengubah target asalinya:
- sudo systemctl set-default graphical.target
Anda bisa mendapatkan daftar target yang tersedia di sistem dengan mengetikkan:
- systemctl list-unit-files --type=target
Tidak seperti runlevel, beberapa target dapat aktif sekaligus. Target aktif menandakan bahwa systemd
berupaya memulai semua unit yang terikat ke target dan tidak mencoba untuk memutusnya lagi. Untuk melihat semua target aktif, ketikkan:
- systemctl list-units --type=target
Bisa saja memulai semua unit yang telah dikaitkan dengan target dan menghentikan semua unit yang bukan bagian dari pohon dependensi. Perintah yang kita perlukan untuk melakukannya disebut isolate
. Ini mirip dengan mengubah runlevel di sistem init lainnya.
Misalnya, jika Anda beroperasi di lingkungan grafis dengan graphical.target
aktif, Anda dapat mematikan sistem grafis dan memasukkan sistem ke bentuk baris perintah multipengguna dengan mengisolasi multi-user.target
. Karena graphical.target
bergantung pada multi-user.target
, tetapi tidak ada cara lainnya lagi, semua unit grafis akan dihentikan.
Anda mungkin perlu melihat dependensi target yang diisolasi sebelum melakukan prosedur ini untuk memastikan bahwa Anda tidak menghentikan layanan penting:
- systemctl list-dependencies multi-user.target
Bila Anda puas dengan unit yang akan dibiarkan tetap aktif, Anda dapat mengisolasi target dengan mengetikkan:
- sudo systemctl isolate multi-user.target
Ada beberapa target yang didefinisikan untuk kejadian penting seperti mematikan daya atau melakukan boot ulang. Namun, systemctl
juga memiliki beberapa pintasan yang memberikan beberapa fungsi tambahan.
Misalnya, untuk menempatkan sistem ke dalam mode pertolongan (pengguna tunggal), Anda dapat menggunakan perintah rescue
sebagai ganti isolate rescue.target
:
- sudo systemctl rescue
Perintah ini akan memberikan fungsi tambahan yang memperingatkan semua pengguna yang log masuk tentang kejadian tersebut.
Untuk menghentikan sistem, Anda dapat menggunakan perintah halt
:
- sudo systemctl halt
Untuk mulai mematikan daya sepenuhnya, Anda dapat menggunakan perintah poweroff
:
- sudo systemctl poweroff
Menyalakan ulang dapat dimulai dengan perintah reboot
:
- sudo systemctl reboot
Ini semua akan memperingatkan para pengguna yang log masuk mengenai kejadian tersebut, satu-satunya hal yang tidak akan dilakukan oleh menjalankan atau mengisolasi target. Harap diperhatikan bahwa kebanyakan mesin akan menautkan perintah yang lebih pendek dan lebih konvensional untuk operasi ini agar berfungsi secara benar dengan systemd
.
Misalnya, untuk melakukan boot ulang sistem, Anda biasanya dapat mengetikkan:
- sudo reboot
Saat ini, Anda sudah memahami beberapa kemampuan dasar dari perintah systemctl
yang memungkinkan Anda berinteraksi dengan dan mengendalikan instans systemd
. Utilitas systemctl
adalah titik utama interaksi Anda untuk manajemen layanan dan keadaan sistem.
Walaupun systemctl
terutama beroperasi dengan proses inti systemd
, ada beberapa komponen lain di ekosistem systemd
yang dikendalikan oleh utilitas lain. Kemampuan lainnya, seperti manajemen log dan sesi pengguna yang ditangani oleh daemon terpisah dan utilitas manajemen (masing-masing yaitu journald
/journalctl
dan logind
/loginctl
). Menyisihkan waktu untuk memahami berbagai alat dan daemon lain akan membuat manajemen menjadi tugas yang lebih mudah.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!