Cara Membuat dan Menjalankan Unit Layanan Baru di Systemd


Beberapa hari yang lalu, saya menemukan distro Centos 8 32-bit dan saya merasakan keinginan untuk mengujinya pada mesin 32-bit lama. Setelah booting, saya menyadari ada bug dan kehilangan koneksi jaringan, sehingga saya harus mengaktifkan "up" secara manual setiap kali setelah boot. Jadi, pertanyaannya adalah bagaimana saya bisa mengatur skrip yang melakukan pekerjaan ini, berjalan setiap kali saya mem-boot mesin saya?

Ini sangat sederhana dan saya akan menunjukkan cara sistem menggunakan unit layanan. Tapi pertama-tama, pengenalan kecil tentang unit layanan.

Pada artikel ini, saya akan menjelaskan apa itu “unit layanan” di systemd, dan betapa mudahnya membuat dan menjalankannya. Saya akan mencoba menyederhanakan apa itu "target", mengapa kami menyebutnya "kumpulan unit" dan apa "keinginan" mereka. Terakhir, kami memanfaatkan unit layanan untuk menjalankan skrip kami sendiri setelah prosedur boot.

Jelas sekali bahwa komputer Anda berguna karena layanan yang ditawarkannya dan untuk mendapatkan fungsi ini, banyak layanan yang harus dipanggil saat komputer melakukan booting dan mencapai level yang berbeda.

Layanan lain dipanggil untuk dijalankan ketika komputer mencapai, misalnya, tingkat penyelamatan (runlevel 0) dan lainnya ketika mencapai tingkat multi-pengguna (runlevel 3) . Anda dapat membayangkan level ini sebagai target.

Secara sederhana, target adalah kumpulan unit layanan. Jika Anda ingin melihat unit layanan yang berjalan di level graphical.target Anda, ketik:

systemctl --type=service

Seperti yang Anda lihat, beberapa layanan aktif dan “berjalan” sepanjang waktu, sementara layanan lainnya hanya berjalan satu kali dan berakhir (keluar).

Jika Anda ingin memeriksa status suatu layanan, Anda dapat menggunakan perintah systemctl seperti yang ditunjukkan.

systemctl status firewalld.service

Seperti yang Anda lihat, saya memeriksa status firewalld.service (tip: Anda dapat menggunakan pelengkapan otomatis untuk nama layanan ). Ini memberi tahu saya bahwa layanan firewalld berjalan sepanjang waktu dan diaktifkan.

Diaktifkan dan dinonaktifkan berarti layanan akan dimuat secara permanen atau tidak, masing-masing pada boot berikutnya. Di sisi lain, untuk memulai dan menghentikan suatu layanan memiliki batasan pada sesi saat ini dan tidak permanen.

Misalnya, jika Anda mengetik:

systemctl stop firewalld.service
systemctl status firewalld.service

Anda dapat melihat bahwa firewalld.service tidak aktif (mati) tetapi masih diaktifkan, yang berarti pada boot berikutnya akan dimuat. Jadi jika kita ingin suatu layanan dimuat saat boot di masa mendatang, kita harus mengaktifkannya. Kesimpulan yang luar biasa! Ayo buat, mudah.

Jika Anda masuk ke folder:

cd /etc/systemd/system
ls -l

Anda dapat melihat beberapa file tautan layanan unit dan beberapa direktori "keinginan" suatu target. Misalnya, apa yang ingin dimuat oleh target multi-pengguna ketika prosedur booting mencapai levelnya, tercantum dalam direktori dengan nama /etc/systemd/system/multi-user.target.wants/ .

ls multi-user.target.wants/

Seperti yang Anda lihat, ini tidak hanya berisi layanan tetapi juga target lain yang juga merupakan kumpulan layanan.

Mari kita buat unit layanan dengan nama connection.service.

vim connection.service

dan ketik yang berikut (tekan “i ” untuk mode penyisipan), simpan, dan keluar (dengan “esc ” dan “:wq! ” ) :

[Unit]
Description = making network connection up
After = network.target

[Service]
ExecStart = /root/scripts/conup.sh

[Install]
WantedBy = multi-user.target

Untuk menjelaskan hal di atas: kami telah membuat unit jenis layanan (Anda juga dapat membuat unit jenis target), dan kami telah menetapkannya untuk dimuat setelah network.target (Anda dapat memahami bahwa prosedur booting mencapai target dengan urutan yang ditentukan) dan kami ingin setiap kali layanan mulai menjalankan skrip bash dengan nama conup.sh yang akan kami buat.

Kegembiraan dimulai dengan bagian terakhir [install]. Dikatakan bahwa ini akan diinginkan oleh “multi-user.target ”. Jadi jika kita mengaktifkan layanan kita, tautan simbolis ke layanan itu akan dibuat di dalam folder multi-user.target.wants! Mengerti? Dan jika kita menonaktifkannya, tautan itu akan dihapus. Sangat sederhana.

Aktifkan saja dan periksa:

systemctl enable connection.service

Ini memberi tahu kita bahwa tautan simbolik di folder multi-user.target.wants telah dibuat. Anda dapat mengonfirmasi dengan menjalankan perintah ls seperti yang ditunjukkan.

ls multi-user.target.wants/

Seperti yang Anda lihat “connection.service ” siap untuk booting berikutnya, tetapi kita harus membuat file skrip terlebih dahulu.

cd /root
mkdir scripts
cd scripts
vim conup.sh

Tambahkan baris berikut di dalam Vim dan simpan:

#!/bin/bash
nmcli connection up enp0s3

Perintah nmcli untuk memunculkan koneksi jaringan untuk antarmuka enp0s3.

Tentu saja, jika Anda ingin skrip Anda mengeksekusi sesuatu yang lain, Anda dapat mengetikkan apa pun yang Anda inginkan, bukan baris kedua.

Misalnya,

#!/bin/bash
touch /tmp/testbootfile

itu akan membuat file di dalam folder /tmp (hanya untuk memeriksa apakah layanan Anda berfungsi).

Kita juga harus membuat skrip dapat dieksekusi dengan menjalankan perintah chmod seperti yang ditunjukkan.

chmod +x conup.sh

Sekarang kami siap. Jika Anda tidak ingin menunggu hingga boot berikutnya (sudah diaktifkan) kita dapat memulai layanan untuk sesi saat ini dengan mengetik:

systemctl start connection.service

Voila! Koneksi saya aktif dan berjalan!

Jika Anda memilih untuk menulis perintah “touch /tmp/testbootfile ” di dalam skrip, hanya untuk memeriksa fungsinya, Anda akan melihat file ini dibuat di dalam folder /tmp .

Saya sangat berharap dapat membantu Anda mengetahui apa itu layanan, keinginan, target, dan menjalankan skrip saat booting.