Cara Membuat Unit Perkhidmatan Sistem di Linux

Cara Membuat Unit Perkhidmatan Sistem di Linux

Walaupun SystemD telah menjadi objek banyak kontroversi, sehingga beberapa pengagihan telah dibakar hanya untuk menyingkirkannya (lihat Devuan, garpu Debian yang, secara lalai, menggantikan Systemd dengan sysvinit), pada akhirnya ia menjadi Sistem init standard de-facto di dunia linux.

Dalam tutorial ini, kita akan melihat bagaimana perkhidmatan Systemd berstruktur, dan kita akan belajar bagaimana mencipta satu.

Dalam tutorial ini anda akan belajar:

  • Apa itu unit perkhidmatan ..
  • Apakah bahagian unit perkhidmatan.
  • Apakah pilihan yang paling biasa yang boleh digunakan di setiap bahagian.
  • Apakah jenis perkhidmatan yang dapat ditakrifkan.

Keperluan perisian dan konvensyen yang digunakan

Keperluan Perisian dan Konvensyen Talian Perintah Linux
Kategori Keperluan, konvensyen atau versi perisian yang digunakan
Sistem Pengagihan GNU/Linux yang menggunakan sistem sebagai sistem init
Perisian sistemd
Yang lain Kebenaran root diperlukan untuk memasang dan menguruskan perkhidmatan.
Konvensyen # - Memerlukan arahan Linux yang diberikan untuk dilaksanakan dengan keistimewaan akar sama ada secara langsung sebagai pengguna root atau dengan menggunakan sudo perintah
$ - Memerlukan arahan Linux yang diberikan sebagai pengguna yang tidak layak

Sistem init systemd

Semua pengagihan utama, seperti Rhel, Centos, Fedora, Ubuntu, Debian dan Archlinux, mengadopsi sistemd sebagai sistem init mereka. Sistem, sebenarnya, adalah lebih daripada sekadar sistem init, dan itulah salah satu sebab mengapa sesetengah orang sangat menentang reka bentuknya, yang menentang moto Unix yang mantap: "Lakukan satu perkara dan lakukan dengan baik". Di mana sistem init lain menggunakan skrip shell mudah untuk menguruskan perkhidmatan, SystemD menggunakan sendiri .perkhidmatan fail (unit dengan .akhiran perkhidmatan): Dalam tutorial ini kita akan melihat bagaimana mereka berstruktur dan bagaimana membuat dan memasangnya.



Anatomi unit perkhidmatan

Apa itu unit perkhidmatan? Fail dengan .perkhidmatan Suffix mengandungi maklumat mengenai proses yang diuruskan oleh SystemD. Ia disusun oleh tiga bahagian utama:

  • [Unit]: Bahagian ini mengandungi maklumat yang tidak berkaitan dengan jenis unit, seperti keterangan perkhidmatan
  • [Perkhidmatan]: Mengandungi maklumat mengenai jenis unit tertentu, perkhidmatan dalam kes ini
  • [Pasang]: Bahagian ini mengandungi maklumat mengenai pemasangan unit

Mari kita menganalisis masing -masing secara terperinci.

Bahagian [unit]

The [Unit] seksyen a .perkhidmatan Fail mengandungi keterangan unit itu sendiri, dan maklumat mengenai tingkah laku dan kebergantungannya: (untuk berfungsi dengan betul perkhidmatan boleh bergantung pada yang lain). Di sini kita membincangkan beberapa pilihan yang paling relevan yang boleh digunakan di bahagian ini

Pilihan "Keterangan"

Pertama sekali kita mempunyai Penerangan pilihan. Dengan menggunakan pilihan ini, kami dapat memberikan keterangan unit. Keterangan kemudian akan muncul, sebagai contoh, ketika memanggil Systemctl perintah, yang mengembalikan gambaran keseluruhan status sistemd. Di sini, sebagai contoh, bagaimana penerangan tentang httpd Perkhidmatan ditakrifkan pada sistem fedora:

[Unit] Keterangan = pelayan HTTP Apache 

Pilihan "selepas"

Dengan menggunakan Selepas pilihan, kita boleh menyatakan bahawa unit kami harus dimulakan selepas unit yang kami sediakan dalam bentuk senarai yang dipisahkan ruang. Sebagai contoh, memerhatikan lagi fail perkhidmatan di mana perkhidmatan web Apache ditakrifkan, kita dapat melihat yang berikut:

Selepas = rangkaian.Sasaran jauh-FS.Sasaran NSS-Lookup.Sasaran HTTPD-INIT.perkhidmatan

Garis di atas mengarahkan SystemD untuk memulakan unit perkhidmatan httpd.perkhidmatan hanya selepas rangkaian, Keluarkan-FS, NSS-Lookup sasaran dan Perkhidmatan HTTPD-INIT.

Menentukan kebergantungan keras dengan "memerlukan"



Seperti yang disebutkan secara ringkas di atas, satu unit (perkhidmatan dalam kes kita) boleh bergantung kepada unit lain (tidak semestinya unit "perkhidmatan") untuk berfungsi dengan betul: kebergantungan tersebut boleh diisytiharkan dengan menggunakan Memerlukan pilihan.

Sekiranya mana -mana unit di mana perkhidmatan bergantung kepada gagal, pengaktifan perkhidmatan yang dihentikan: inilah sebabnya mereka dipanggil ketergantungan keras. Dalam baris ini, diekstrak dari fail perkhidmatan Avahi-Daemon, kita dapat melihat bagaimana ia diisytiharkan sebagai bergantung dari Avahi-Daemon.Unit soket:

Memerlukan = Avahi-Daemon.soket

Mengisytiharkan kebergantungan "lembut" dengan "mahu"

Kami hanya melihat bagaimana untuk mengisytiharkan kebergantungan "keras" yang dipanggil untuk perkhidmatan dengan menggunakan Memerlukan pilihan; Kami juga boleh menyenaraikan kebergantungan "lembut" dengan menggunakan Mahu pilihan.

Apakah perbezaannya? Seperti yang kita katakan di atas, jika ada kebergantungan "keras" gagal, perkhidmatan itu akan gagal; Kegagalan apa -apa kebergantungan "lembut", bagaimanapun, tidak mempengaruhi apa yang berlaku kepada unit tanggungan. Dalam contoh yang disediakan, kita dapat melihat bagaimana Docker.perkhidmatan unit mempunyai pergantungan lembut pada Penyimpanan Docker-Storage.perkhidmatan satu:

[Unit] mahu = penyimpanan docker-storage.perkhidmatan 

Bahagian [perkhidmatan]

Di dalam [Perkhidmatan] seksyen a perkhidmatan unit, kita boleh menentukan perkara sebagai arahan yang akan dilaksanakan apabila perkhidmatan dimulakan, atau jenis perkhidmatan itu sendiri. Mari kita lihat sebahagian daripada mereka.

Memulakan, berhenti, dan memuatkan semula perkhidmatan

Perkhidmatan boleh dimulakan, dihentikan, dimulakan semula atau dimuat semula. Perintah yang akan dilaksanakan ketika melakukan setiap tindakan ini dapat ditentukan dengan menggunakan pilihan yang berkaitan di [Perkhidmatan] seksyen.

Perintah yang akan dilaksanakan apabila perkhidmatan bermula, diisytiharkan dengan menggunakan Execstart pilihan. Hujah yang diserahkan kepada pilihan juga boleh menjadi jalan ke skrip. Secara pilihan, kami boleh mengisytiharkan arahan untuk dilaksanakan sebelum dan selepas perkhidmatan dimulakan, dengan menggunakan Execstartpre dan ExecstartPost pilihan masing -masing. Berikut adalah arahan yang digunakan untuk memulakan perkhidmatan NetworkManager:



[Service] execstart =/usr/sbin/networkManager --No-Daemon 

Dengan cara yang sama, kita dapat menentukan arahan yang akan dilaksanakan apabila perkhidmatan dimuat semula atau dihentikan, dengan menggunakan Execstop dan Execreload pilihan. Begitu juga dengan apa yang berlaku ExecstartPost, Perintah atau arahan berganda yang akan dilancarkan selepas proses dihentikan, boleh ditentukan dengan Execstoppost pilihan.

Jenis perkhidmatan

SystemD mentakrifkan dan membezakan antara beberapa jenis perkhidmatan yang berbeza bergantung kepada tingkah laku yang diharapkan. Jenis perkhidmatan boleh ditakrifkan dengan menggunakan Jenis pilihan, menyediakan salah satu daripada nilai ini:

  • Mudah
  • forking
  • Oneshot
  • dbus
  • memberitahu

Jenis lalai perkhidmatan, jika Jenis dan Busname pilihan tidak ditakrifkan, tetapi arahan disediakan melalui Execstart pilihan, adalah Mudah. Apabila jenis perkhidmatan ini ditetapkan, arahan diisytiharkan masuk Execstart dianggap sebagai proses/perkhidmatan utama.

The forking taip berfungsi dengan cara yang berbeza: arahan yang disediakan Execstart dijangka melancarkan proses kanak -kanak, yang akan menjadi proses/perkhidmatan utama. Proses induk yang dijangka mati setelah proses permulaan selesai.

The Oneshot jenis digunakan sebagai lalai jika Jenis dan Execstart Pilihan tidak ditakrifkan. Ia berfungsi seperti Mudah: perbezaannya ialah proses itu dijangka menyelesaikan tugasnya sebelum unit lain dilancarkan. Unit, bagaimanapun, ia masih dianggap sebagai "aktif" walaupun selepas perintah keluar, jika Remainafterexit Pilihan ditetapkan kepada "ya" (lalai adalah "tidak").

Jenis perkhidmatan seterusnya adalah dbus. Sekiranya jenis perkhidmatan ini digunakan, daemon dijangka mendapat nama dari Dbus, Seperti yang dinyatakan dalam Busname pilihan, yang dalam kes ini, menjadi wajib. Untuk selebihnya ia berfungsi seperti Mudah Jenis. Unit akibatnya, bagaimanapun, dilancarkan hanya selepas nama DBUS diperoleh.

Proses lain berfungsi sama seperti Mudah, Dan itu memberitahu: perbezaannya ialah daemon dijangka menghantar pemberitahuan melalui sd_notify fungsi. Hanya sekali pemberitahuan ini dihantar, unit akibat dilancarkan.

Tetapkan masa tamat proses

Dengan menggunakan pilihan tertentu, ada kemungkinan untuk menentukan beberapa masa untuk perkhidmatan tersebut. Mari mulakan dengan Restartsec: Dengan menggunakan pilihan ini, kita dapat menyediakan jumlah masa (secara lalai dalam detik) sistemd harus menunggu sebelum memulakan semula perkhidmatan. Timespan juga boleh digunakan sebagai nilai untuk pilihan ini, sebagai "5min 20s". Lalai adalah 100ms.



The Timeoutstartsec dan Timeoutstopsec Pilihan boleh digunakan untuk menentukan, masing -masing, masa untuk permulaan perkhidmatan dan berhenti, dalam beberapa saat. Dalam kes pertama, jika selepas masa tamat yang ditentukan proses permulaan daemon, ia tidak selesai, ia akan dianggap gagal.

Dalam kes kedua, jika perkhidmatan hendak dihentikan tetapi tidak ditamatkan selepas tamat masa yang ditentukan, pertama a Sigterm Dan kemudian, selepas jumlah masa yang sama, a Sigkill Isyarat dihantar kepadanya. Kedua -dua pilihan juga menerima masa sebagai nilai dan boleh dikonfigurasikan sekaligus, dengan jalan pintas: Timeoutsec. Jika Infinity disediakan sebagai nilai, masa tamat dilumpuhkan.

Akhirnya, kita boleh menyediakan had untuk jumlah masa perkhidmatan boleh dijalankan, menggunakan Runtimemaxsec. Sekiranya perkhidmatan melebihi masa ini, ia ditamatkan dan dianggap gagal.

Bahagian [pemasangan]

Di dalam [Pasang] seksyen, kita boleh menggunakan pilihan yang berkaitan dengan pemasangan perkhidmatan. Contohnya, dengan menggunakan Alias pilihan, kami boleh menentukan senarai alias yang dipisahkan ruang untuk digunakan untuk perkhidmatan semasa menggunakan arahan SystemCTL (kecuali membolehkan).

Begitu juga dengan apa yang berlaku dengan Memerlukan dan Mahu pilihan dalam [Unit] seksyen, untuk menubuhkan kebergantungan, di [Pasang] seksyen, kita boleh menggunakan Diperlukanby dan Dikehendaki. Dalam kedua-dua kes, kami mengisytiharkan senarai unit yang bergantung pada yang kita konfigurasikan: dengan pilihan bekas mereka akan bergantung kepadanya, dengan yang terakhir mereka akan dianggap hanya sebagai lemah bergantung. Sebagai contoh:

[Pasang] Wanteby = Multi-User.sasaran 

Dengan garis di atas kami menyatakan bahawa MULTI-USER Sasaran mempunyai ketergantungan yang lembut pada unit kami. Dalam terminologi sistem, unit yang berakhir dengan .sasaran akhiran, boleh dikaitkan dengan apa yang dipanggil Runtime dalam sistem init lain sebagai Sysvinit. Dalam kes kita, maka, sasaran multi-pengguna, apabila dicapai, harus memasukkan perkhidmatan kami.

Membuat dan memasang unit perkhidmatan

Pada dasarnya terdapat dua tempat dalam sistem fail di mana unit perkhidmatan SystemD dipasang: /usr/lib/sistem/sistem dan /etc/Systemd/System. Laluan bekas digunakan untuk perkhidmatan yang disediakan oleh pakej yang dipasang, sementara yang terakhir boleh digunakan oleh pentadbir sistem untuk perkhidmatannya sendiri yang dapat mengatasi lalai.

Mari buat contoh perkhidmatan tersuai. Katakan kami ingin membuat perkhidmatan yang melumpuhkan ciri Wake-on-Lan pada antara muka Ethernet tertentu (ENS5F5 dalam kes kami) apabila ia dimulakan, dan enables semula apabila ia dihentikan. Kita boleh menggunakan ethtool perintah untuk menyelesaikan tugas utama. Inilah cara fail perkhidmatan kami boleh kelihatan seperti:

[Unit] Description = Force ENS5F5 Antara muka Ethernet hingga 100Mbps Memerlukan = Rangkaian.sasaran selepas = rangkaian.sasaran [service] type = Oneshot RemainAfterExit = Yes execstart =/usr/sbin/ettool -S ens5f5 wol d execstop =/usr/sbin/ethtool -s ens5f5 wol g [install] wanty = multi -user = Multi -user = Multi -user = Multi -user.sasaran 


Kami menetapkan keterangan unit yang mudah, dan menyatakan bahawa perkhidmatan bergantung pada rangkaian.sasaran unit dan harus dilancarkan setelah dicapai. Di dalam [Perkhidmatan] seksyen kami menetapkan jenis perkhidmatan sebagai Oneshot, dan mengarahkan SystemD untuk mempertimbangkan perkhidmatan itu aktif selepas arahan dilaksanakan, menggunakan Remainafterexit pilihan. Kami juga menentukan arahan yang akan dijalankan apabila perkhidmatan dimulakan dan dihentikan. Akhirnya, di [Pasang] seksyen kita pada dasarnya menyatakan bahawa perkhidmatan kita harus dimasukkan ke dalam MULTI-USER sasaran.

Untuk memasang perkhidmatan kami akan menyalin fail ke dalam /etc/Systemd/System direktori sebagai Wol.perkhidmatan, daripada kita akan memulakannya:

$ sudo cp wol.Perkhidmatan/etc/Systemd/System && Sudo Systemctl Mula Wol.perkhidmatan

Kami boleh mengesahkan perkhidmatan itu aktif, dengan arahan berikut:

$ Systemctl IS-Active Wol.perkhidmatan aktif 

Output arahan, seperti yang diharapkan, adalah aktif. Sekarang untuk mengesahkan bahawa "bangun di lan" telah ditetapkan d, Dan sekarang ia dilumpuhkan, kita boleh menjalankan:

$ sudo ettool ens5f5 | Grep Wake-on menyokong Wake-on: PG Wake-on: D 

Sekarang, menghentikan perkhidmatan itu harus menghasilkan hasil songsang, dan mengaktifkan semula Wol:

$ sudo systemctl stop wol.perkhidmatan && sudo ettool ens5f5 | Grep Wake-on menyokong Wake-On: PG Wake-On: G 

Kesimpulan

Dalam tutorial ini, kita melihat bagaimana fail perkhidmatan Systemd disusun, apakah bahagiannya, dan beberapa pilihan yang boleh digunakan dalam setiap mereka. Kami belajar bagaimana untuk membuat penerangan perkhidmatan, untuk menentukan kebergantungannya dan mengisytiharkan arahan yang harus dilaksanakan apabila ia dimulakan, dihentikan atau dimuat semula.

Oleh kerana SystemD, seperti itu atau tidak, telah menjadi sistem init standard di dunia linux, penting untuk menjadi biasa dengan cara melakukan sesuatu. Dokumentasi Perkhidmatan Sistem Rasmi boleh didapati di laman web Freedesktop. Anda juga boleh berminat membaca artikel kami mengenai pengurusan perkhidmatan dengan SystemD.

Tutorial Linux Berkaitan:

  • Perkara yang hendak dipasang di Ubuntu 20.04
  • Perkara yang perlu dilakukan setelah memasang ubuntu 20.04 Focal Fossa Linux
  • Cara merosakkan linux
  • Mint 20: Lebih baik daripada Ubuntu dan Microsoft Windows?
  • Muat turun linux
  • Sistem Hung Linux? Cara melarikan diri ke baris arahan dan ..
  • Perkara yang perlu dilakukan setelah memasang Ubuntu 22.04 Jur -ubur Jammy ..
  • Pengenalan kepada Automasi, Alat dan Teknik Linux
  • Perintah Linux: Top 20 Perintah Paling Penting yang Anda Perlu ..
  • Perintah Linux Asas