systemd çatal vs basit?


25

İlk systemdbirim dosyamı yazıyorum .

Çünkü Type, birkaç seçenek vardır: forking,, simplevb . Bu konuyla ilgili Redhat Belgelerini okudum (Tablo 9.9), ancak hangi seçeneği kullanmam gerektiğinden hala emin değilim.

Yönerge var mı?

Yanıtlar:


48

Hizmeti komut satırından el ile başlattığınızda ( arka planda çalıştırmak için nohupönek komutunu veya &soneki kullanmadan veya başka bir deyişle, yalnızca dosya ExecStart=satırına koyacağınız komutu çalıştırın .service), ne olur?

a) Hizmet başlar ve çalışmaya devam ederse ve siz Control-C tuşlarına basana veya hizmeti başka bir şekilde durdurana kadar geri dönmezse: Type = simpledoğru seçimdir.

b) Bilgi istemi geri döner ancak hizmet arka planda çalışmaya devam ederse (yani hizmet kendi kendine daemonize olursa), Type = forkingdoğru seçimdir.

c) Hizmet işini yaparsa ve çalışan herhangi bir şey bırakmadan komut istemine geri dönerse (örneğin, hizmet yalnızca bazı çekirdek ayarlarını yapar, başka bir şeye komut gönderir veya benzer bir şey yaparsa), Type = oneshotmuhtemelen doğru seçimdir. Bu durumda, ExecStarthizmetin bir şeyi "ayarlama" komutu olabilir ve "ayarı" ExecStopkaldırmaya karşılık gelen komut olabilir. Bu tür genellikle yararlanır RemainAfterExit=true, bu nedenle systemd, bu hizmetin "durumunu" en son "ayarlanmış" veya "ayarlanmamış" olup olmadığına göre izler.

Diğer Typedeğerler özel durumlardır. Örneğin, hizmet bir D-Bus bağlantısı kullanıyorsa, Type = dbusen iyi seçim olabilir. Bu systemddurumun farkında olur ve daha sonra systemd bu hizmeti (ve ona bağlı olan her şeyi) D-Bus'ta bu hizmetin varlığıyla izler.

Type = notifyİşlemin kullanılabilmesi için ortam değişkeninde belirtilen Unix soketine bağlanabilmesi $NOTIFY_SOCKETve gerektiğinde bu sokete mesaj yazarak durumunu bildirebilmesi gerekir. Ayrıca hizmet dosyası NotifyAccess, bildirim soketine uygun şekilde erişim verme seçeneğini belirtmelidir .

Bu iletileri göndermek için kullanabileceğiniz bir komut satırı yardımcı programı systemd-notifyve bir C kitaplığı işlevi vardır sd_notify(3), ancak bunlardan hiçbiri gereksinimlerinize uygun değilse, kendi ileti göndericinizi uygulayabilirsiniz. Gerekli iletiler çok basittir ve kabuk değişkeni atamalarına benzer: örneğin, hizmetin başlatmayı başarıyla tamamladığını ve gelen istekleri sunmaya hazır olduğunu bildirmek için, hizmetin çıkışına eşdeğer olan dizeyi printf "READY=1\n"sokete göndermesi gerekir . man 3 sd_notifyTanınan mesajlar hakkında daha fazla bilgi için bkz .

Not: Birçok Unix tarzı sisteme taşınabilir olarak tasarlanan birçok hizmet uygulaması varsayılan olarak b) gibi davranabilir, ancak a) bir seçenek ekleyerek (genellikle "çatal yapma" olarak tanımlanır) çalışmaya devam edebilir ön planda "," artalan etme "veya benzeri). Bu durumda, seçeneğin başka bir yan etkisi yoksa, seçeneği eklemek ve a) tipi davranışı kullanmak tercih edilir systemd.


Başladığımı varsayalım apache, hangi tip kullanılmalı?
kittygirl

2
Peki, manuel olarak nasıl başlatırsınız? apachectl startBelki de kök olarak koşarak ? Yapmayı deneyin ve ne olduğunu görün. Sonra cevabımdan a), b) veya c) seçin. Eminim istemi geri döner ve Apache çalışmaya devam eder, bu yüzden b) cevap olur.
telcoM

Cevabınızdaki açıklamaları gerçekten seviyorum. Durumuyla ilgili başka bir basit İngilizce açıklama eklemek ister misiniz Type=notify?
Yankee

1
Ekleme açıklaması Type=notify.
telcoM
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.