Seseorang tidak perlu membutuhkan ini.
Jika C
layanan perlu menunggu untuk S
siap sehingga mereka dapat membuka koneksi soket untuk itu, maka orang tidak perlu melakukan ini sama sekali. Sebaliknya, seseorang dapat mengambil keuntungan dari pembukaan soket mendengarkan dini oleh manajer layanan.
Beberapa sistem, termasuk s6 Laurent Bercot , toolset nosh saya , dan systemd, memiliki cara di mana soket pendengaran dapat dibuka sejak dini, hal pertama dalam menyiapkan layanan. Mereka semua melibatkan sesuatu selain program layanan yang membuka soket pendengar, dan program layanan, ketika dipanggil, menerima soket pendengar sebagai deskriptor file yang sudah terbuka.
Dengan systemd, khususnya, seseorang menciptakan unit soket yang mendefinisikan soket pendengaran. systemd membuka unit soket dan mengaturnya sehingga subsistem jaringan kernel mendengarkan koneksi; dan meneruskannya ke layanan aktual sebagai deskriptor file terbuka ketika datang untuk menelurkan proses yang menangani koneksi ke soket. (Dapat melakukan ini dalam dua cara, sama seperti inetd
bisa, tetapi diskusi tentang detail Accept=true
versus Accept=false
layanan berada di luar cakupan jawaban ini.)
Poin penting adalah bahwa seseorang tidak perlu memesan lebih dari itu. Kernel mengumpulkan koneksi klien dalam antrian sampai program layanan diinisialisasi, dan siap untuk menerimanya dan berbicara dengan klien.
Ketika seseorang melakukannya, protokol kesiapan adalah masalahnya.
systemd memiliki seperangkat protokol kesiapan yang dipahami, layanan dengan layanan tertentu dengan Type=
pengaturan di unit layanan. Protokol kesiapan tertentu yang menarik di sini adalah notify
protokol kesiapan. Dengan itu, systemd diberitahu untuk mengharapkan pesan dari layanan, dan ketika layanan siap mengirimkan pesan yang menandai kesiapan. systemd menunda aktivasi layanan lain hingga kesiapan ditandai.
Memanfaatkan ini melibatkan dua hal:
- Memodifikasi kode
S
sehingga ia memanggil sesuatu seperti notify_systemd()
fungsi Pierre-Yves Ritschard atau fungsi Cameron T Norman notify_socket()
.
- Menyiapkan unit layanan untuk layanan dengan
Type=notify
dan NotifyAccess=main
.
The NotifyAccess=main
pembatasan (yang merupakan default) karena kebutuhan systemd tahu untuk mengabaikan pesan dari program nakal (atau hanya rusak plain), karena setiap proses pada sistem dapat mengirim pesan ke soket pemberitahuan systemd ini.
Seseorang menggunakan kode Pierre-Yves Ritschard atau Cameron T Norman untuk preferensi karena tidak mengecualikan kemungkinan memiliki mekanisme ini di UbuntuBSD, FreeBSD Debian, FreeBSD aktual, TrueOS, OpenBSD, dan sebagainya; yang dikecualikan oleh kode yang diberikan oleh systemd penulis.
Satu jebakan yang harus dihindari adalah systemd-notify
program. Ini memiliki beberapa masalah utama, tidak sedikit di antaranya adalah bahwa pesan yang dikirim dengannya akhirnya dapat dibuang tanpa diproses oleh systemd. Masalah yang paling utama dalam hal ini adalah bahwa itu tidak berjalan sebagai proses "utama" dari layanan, jadi kita harus membuka notifikasi kesiapan untuk layanan S
untuk setiap proses pada sistem dengan NotifyAccess=all
.
Jebakan lain yang harus dihindari adalah berpikir bahwa forking
protokol lebih sederhana. Bukan itu. Melakukannya dengan benar melibatkan tidak forking dan keluar dari orang tua sampai (untuk satu hal) semua utas pekerja program berjalan. Ini tidak cocok dengan bagaimana sebagian besar demon yang garpu sebenarnya.
Bacaan lebih lanjut
systemd.service(5)
,NotifyAccess=all
akan menerima pesan dari semua anggota kelompok kontrol layanan , yang tidak menyiratkan sembarang proses jahat pada sistem. Ini cukup aman untuk sebagian besar kasus penggunaan. Juga, kekhawatiran Anda tentang portabilitas ke sistem operasi lain tidak relevan dengan OP, karena kami sudah membahas topik Systemd di sini.