Systemd'de, After = ile Require = arasındaki fark nedir?


53

Ben systemd .service dosyası oluşturma ve ben arasındaki farkı anlamak için yardıma ihtiyacınız Requires=ve After=. Adam sayfa söylüyor Requires="diğer birimler üzerinde gereklilik bağımlılıkları yapılandırır." ve After="Birimler arasındaki sipariş bağımlılıklarını yapılandırır." Fark ne?

Yanıtlar:


43

After=Requires=durum bağımlılıkları iken servis sırasını (sadece Y sonrası X yapın) yapılandırır . Bir sipariş belirtmezseniz, diğerine bağlı bir hizmet, bağlı olduğu hizmetle aynı anda başlatılır. Ayrıca, bunu anlama yöntemim (bunu şimdi test edemiyorum ve bir referans bulamıyorum), After="gevşek bir bağlantı" dır ve eğer böyle bir ifadeye sahip bir servis, eğer After=satırda isminde belirtilen hiç başlamamış Require=, şartın yerine getirilmemesi durumunda başlamasını engelleyecekti.

Https://www.freedesktop.org/software/systemd/man/systemd.unit.html sayfasından alıntı :

= gerektirir

Diğer birimlerdeki gereksinim bağımlılıklarını yapılandırır. Bu ünite devreye girerse, burada listelenen üniteler de devreye girer. Diğer birimlerden biri devre dışı kalırsa veya aktivasyonu başarısız olursa, bu ünite devre dışı bırakılır. Bu seçenek bir kereden fazla belirtilebilir veya bir listede birden fazla boşlukla ayrılmış birim belirtilebilir; bu durumda, listelenen tüm adlar için gereksinim bağımlılıkları yaratılır. Gereksinim bağımlılıklarının, servislerin başlatılma veya durdurulma sırasını etkilemediğine dikkat edin. Bunun After = veya Before = seçenekleriyle bağımsız olarak yapılandırılması gerekir. Foo.service bir ünite bir bar.service gerektiriyorsa, Required = ile ayarlandıysa ve After = veya Before = ile hiçbir sipariş yapılandırılmazsa, foo.service etkinleştirilirse her iki ünite de aynı anda ve aralarında gecikme olmadan başlatılır. Sıklıkla,

ve

Önce =, Sonra =

Boşlukla ayrılmış birim adları listesi. Birimler arasındaki sipariş bağımlılıklarını yapılandırır. Foo.service bir ünite ayarı içeriyorsa Before = bar.service ve her iki ünite de başlıyorsa, bar.service'nin başlatılması foo.service başlatılana kadar ertelenir. Bu ayarın, Gereklilik = tarafından konfigüre edilen gereksinim bağımlılıklarından bağımsız ve dikey olduğuna dikkat edin. Hem After = hem de Need = seçeneğinin her ikisine de bir ünite adı eklemek yaygın bir örnektir, bu durumda listelenen ünite bu seçeneklerle konfigüre edilen üniteden önce başlatılacaktır. Bu seçenek bir kereden fazla belirtilebilir, bu durumda listelenen tüm isimler için sipariş bağımlılıkları yaratılır. After = Önce = in tersidir, yani After = = = = = eğer belirtilirse, yapılandırılmış ünitenin listelenen ünite çalışmaya başladıktan sonra başlatılmasını sağlar; Yapılandırılmış ünitenin listelenen ünite başlatılmadan önce tamamen başlatılmış olması. Aralarına sıralı bağımlılığı olan iki ünite kapatıldığında, başlatma sırasının tersinin uygulandığını unutmayın. yani eğer bir ünite After = ile yapılandırılmışsa, başka bir ünitede, her ikisi de kapatılmışsa, önceki ünite durdurulur. Aralarında herhangi bir sıralama bağımlılığı olan iki ünite verildiğinde, bir ünite kapatılır ve diğeri çalıştırılırsa, kapatma işleminden önce kapatma emri verilir. Sipariş bağımlılığının After = veya Before = olması önemli değil. Aynı zamanda, hangisinin kapatıldığı, biri kapatıldığı ve diğerinin başlatıldığı önemli değildir. Her durumda, kapatma işleminden önce kapatma emri verilir. İki ünitenin aralarında sipariş bağımlılığı yoksa, aynı anda kapatılır veya başlatılır,


7
Bir emir ifadesi değilse, bağımlılık nedir? (cidden ... Farkı anlamadım)
TomOnTime

Düzenlemeye bak. Anlayışım: After=X"X yapılırsa bunu X sonra yap ", "X Require=Xyapamıyorsanız bunu hiç yapma" anlamına gelir.
Sven

Before=Adam sayfasının bölümde bu doğrular gibiydi. If a unit foo.service contains a setting Before=bar.service and both units are being started, bar.service's start-up is delayed until foo.service is started up Bunu anladığım gibi, eğer bar.serviceyine de başlatılmadıysa ve foo.servicenormal şekilde başlasaydı, sipariş uygulanmayacaktı .
Sven

9

En büyük farklardan biri,

  • After sadece ünitenin daha önce etkinleştirilip etkinleştirilmediğini kontrol eder ve açıkça belirtilen birimleri etkinleştirmez.
  • Listelenen birimler Requires, birimle birlikte etkinleştirilir. Gerekli birimlerden herhangi biri başlatılamıyorsa, ünite devreye girmez.

Bir birim dosyası var düşünün test-app.service,

[Unit]
Description=test app
After=network-online.target

İşte bu ifade çalıştırıldığında ne olacak,

  • Aftereğer kontrol eder network-online.target.
  • Başlamazsa network-online.targetbekleyecek.
  • test-appsadece network-online.targetaktif olduktan sonra başlar

Onun Requiresyerine ben olsaydım

[Unit]
Description=test app
Requires=network-online.target

İşte bu ifade çalıştırıldığında ne olacak,

  • network-online.targetve test-appbirlikte aktive edilir
  • eğer network-online.targetçalışmazsa test-appaktive edilmeyecektir.

2

systemd bir iş yöneticisidir. Kılavuz sayfası işlerin nasıl yürüdüğü konusunda kesin değildir.

Önyüklerken, hangi sistemin yaptığı, bağlantı işi için işlerden oluşan bir işlem oluşturur (örn. Default.target için işe başla). Tüm bu bağımlılıkların ve ilişkilerin ne yapacağını ve hangi işlerin nasıl tetikleneceğini tanımlamaktır. Sipariş vermek, diğer her işin bekleyeceği işleri belirler. Bu nedenle default.target birimi tüm bunların merkezindedir; bu nedenle, birimler etkinleştirilirken, systemctl enable aracılığıyla bir ileri bağımlılık sistemi kullanabildiğiniz bir dosya bağımlılığı sistemi oluşturan bir dosya sistemi sembolik bağlantısı oluşturur. ilk yer). Bir üniteyi manuel olarak başlattığınızda da benzer şekilde o ünite tutturulur ve işlem hesaplanır.

Çok fazla ayrıntıya girmeden, Neyin gerekli olduğunu ve Sonunda = ne yapıldığını açıklayacağım.

Require = bir başlangıç ​​işini başlattığınızda (açık bir şekilde veya bir bağımlılıkla: içsel olarak bir ayrım yoktur) systemd'in gerekli ünite için bir başlangıç ​​işini tetiklemesine neden olacaktır. Ayrıca, bu ünite durdurulduğunda (durdurma, kendi kendine kapanma) veya yeniden başlatıldığında üzerinizde bir durdurma işini tetikleme özelliğine de sahiptir. Bu, eğer bir miktar bağımlılık / systemctl durmasına / yeniden başlamasına neden olursa, ayrıca durduracağınız / yeniden başlatacağınız anlamına gelir. Ancak, kendi başına düştüğünde, hiç iş olmadığı için durmayacaksınız ve devlet değişikliği sistemin müdahalesine gerek kalmadan gerçekleşti. BindsTo'yu kullanacağınız yer = (açık bir nedenden ötürü, sistemin katılımı olmadan etkin olmayan cihaz birimlerine benzer).

Şimdi, After = kullanımı Require = tek başına yapılması gerektiği gibi tavsiye edilir, ne işe yaradığı için açıktır: başlangıç ​​işi başarısız olursa gerekliliği iptal edin. Ancak bu iptal yalnızca wrt işlerinde çalışır, yani diğer birim sipariş tanımlamazsa, systemd hem paralel olarak tetikler, hem de başlangıç ​​işi bitmeden başlangıç ​​işi sona ererse, iptal edilmez (aslında iptal edilemez) . Kullanım Sonu =, diğer işin istenen birimin başlama işi bitene kadar beklemeye devam ettiği anlamına gelir ve sonucuna bağlı olarak, başarısız olursa, ünitenizin bekleme başlama işi JOB_DEPENDENCY iş sonucuyla iptal edilir (neden sarı kullanmalısınız [DEPEND] bu gibi durumlarda açılışta). Bu nedenle, bu geçersiz kılma etkisi, After = kullanmadan belirsizdir.

Bu nedenle, diğer ünitenin başlatılmasını beklemek istemiyorsanız Wants = After After = kullanılmıyorsa sorun yoktur: orada geçersiz sayılma olmadığından, yarış yoktur. Bu durumda, bir senkronizasyon mekanizmasından başka bir şey değildir.

Ayrıca, her ikisinde de önyüklemede etkinleştirebilir ve birbirlerini gerektirmeyebilir ve yalnızca siparişi tanımlayabilirsiniz, bu durumda, her ikisi de aynı işlemin bir parçası olarak çekildiğinde, bunlar sipariş edilecektir (veya diğerinin işi tetiklenirse) peşinden koşmak istediği ünitenin işi devam ederken, işlemlerde önce bitirmesini bekleyecektir).

Şimdi, eğer bir iş yoksa, siparişin söz konusu birim için bir etkisi olmaz. Bununla birlikte, genellikle Gereklilik = İsteyen = gibi bağımlılıkların kullanımının bir sonucu olarak, ya da her ikisi de bir kerede içeri çekilip bazı sıralamalar tanımlayan bir iş vardır, bu durumda başka birimin işlerini beklerler.

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.