systemd forking vs simple?

24

Saya menulis systemdfile unit pertama saya .

Karena Type, ada beberapa pilihan: forking,, simpledll. Saya telah membaca Dokumentasi Redhat tentang topik ini (Tabel 9.9), tetapi masih tidak yakin kapan saya harus menggunakan opsi mana.

Ada pedoman?

leeyuiwah
sumber

Jawaban:

46

Ketika Anda memulai layanan secara manual dari baris perintah (tanpa menggunakan nohupperintah awalan atau &akhiran untuk menjalankannya di latar belakang, atau dengan kata lain, jalankan perintah yang akan Anda letakkan di ExecStart=baris .servicefile), apa yang terjadi?

a) Jika layanan mulai dan terus berjalan, dan prompt tidak kembali sampai Anda menekan Control-C atau menghentikan layanan dengan cara lain: maka itu Type = simpleadalah pilihan yang tepat.

b) Jika prompt kembali tetapi layanan tetap berjalan di latar belakang (yaitu layanan mengubah sendiri dengan sendirinya), maka itu Type = forkingadalah pilihan yang tepat.

c) Jika layanan melakukan tugasnya dan kembali ke prompt tanpa membiarkan apa pun berjalan (yaitu layanan hanya menyesuaikan beberapa pengaturan kernel, mengirimkan perintah ke sesuatu yang lain atau melakukan sesuatu yang serupa), maka Type = oneshotmungkin itu adalah pilihan yang tepat. Dalam hal ini, ExecStartlayanan mungkin adalah perintah untuk "mengatur" sesuatu, dan ExecStopakan menjadi perintah yang sesuai untuk "membatalkan" itu. Jenis ini biasanya menguntungkan RemainAfterExit=true, jadi systemd akan melacak "keadaan" layanan ini sesuai dengan apakah hal itu baru-baru ini "diatur" atau "tidak disetel".

Nilai- Typenilai lain adalah kasus khusus. Misalnya, jika layanan menggunakan koneksi D-Bus, maka Type = dbusmungkin merupakan pilihan terbaik. Itu membuat systemdsadar akan fakta, dan kemudian systemd akan melacak layanan ini (dan apa pun yang bergantung padanya) dengan kehadiran layanan ini di D-Bus.

Untuk menggunakannya Type = notify, proses tersebut harus dapat terhubung ke soket Unix yang ditentukan dalam variabel lingkungan $NOTIFY_SOCKETdan melaporkan statusnya dengan menulis pesan ke soket itu setiap kali diperlukan. Selain itu, file layanan harus menentukan NotifyAccessopsi untuk memberikan akses ke soket pemberitahuan yang sesuai.

Ada utilitas baris perintah systemd-notifydan fungsi pustaka C yang sd_notify(3)dapat Anda gunakan untuk mengirim pesan-pesan ini, tetapi jika tidak ada yang cocok dengan kebutuhan Anda, Anda bisa mengimplementasikan pengirim pesan Anda sendiri. Pesan yang diperlukan sangat sederhana, dan terlihat seperti penugasan variabel shell: misalnya, untuk memberi tahu bahwa layanan telah berhasil menyelesaikan startup dan siap untuk melayani permintaan masuk apa pun, layanan harus mengirim string yang setara dengan output printf "READY=1\n"ke soket. Lihat man 3 sd_notifyuntuk detail lebih lanjut tentang pesan yang dikenali.

Catatan: banyak aplikasi layanan yang dirancang untuk dibawa-bawa ke banyak sistem gaya Unix mungkin berlaku sebagai b) secara default, tetapi dapat dibuat berfungsi seperti a) dengan menambahkan opsi (biasanya digambarkan sebagai "jangan bercabang", "tetap berjalan di latar depan "," jangan daemonisasi "atau serupa). Dalam hal itu, jika opsi tidak memiliki efek samping lain, maka menambahkan opsi dan menggunakan perilaku tipe a) akan lebih disukai systemd.

telcoM
sumber
Misalkan saya mulai apache, tipe apa yang harus digunakan?
kittygirl
2
Nah, bagaimana Anda memulainya secara manual? Dengan menjalankannya apachectl startsebagai root, mungkin? Coba lakukan itu, dan lihat apa yang terjadi. Kemudian pilih a), b) atau c) dari jawaban saya. Saya berani bertaruh bahwa prompt akan kembali dan Apache tetap berjalan, jadi b) akan menjadi jawabannya.
telcoM
Saya sangat menyukai penjelasan yang Anda berikan dalam jawaban Anda. Maukah Anda menambahkan penjelasan bahasa Inggris biasa untuk kasus ini Type=notify?
Yankee
Deskripsi Type=notifyditambahkan.
telcoM