Bir Başlatma işinin diğer Başlatma işlerinden önce başladığından nasıl emin olabilirim?


33

Bu genel bir Başlangıç ​​sorusu, ancak belirli bir durumu kullanmama izin verin:

Centrify, ActiveDirectory ağ geçidi için bir NIS'dir. Sağladığı kimlik doğrulama servisine bağlı olan herhangi bir hizmetten önce yüklemesi gerekir, örneğin, autofs, cron, nis, vd.

Bu, diğer hizmetlerin bağımlılıklarını değiştirmeye çalışırken bile (ki yine de yapmamamız gerektiğini düşünmüyorum, eğer mümkünse diğer Upstart işlerine dokunmak istemiyorum) bile elde etmek için oldukça zorlayıcı olduğu kanıtlandı. .

Öneriler?

Yanıtlar:


29

Çözüm, probleme diğer yönden yaklaşmaktır: Centrify için başlangıç ​​kriterlerini karşılamak için, mevcut servislerin yeni Centrify servisine bağlı olması gerekli değildir, yeni Centrify servisinin mevcut servislere bağlı olması gerekmez.

Örneğin, bir Upstart yapılandırma dosyası /etc/init/centrify.confşöyle diyebilir:

başlamak (cron başlatmak veya autofs başlatmak veya nis başlatmak)

Bunu İngilizceye çevirmek, şu şekilde tercüme edilir:

Centrify servisini cron, autofs veya nis startından hemen önce başlatın (hangisi önce başlarsa).

Cron, autofs veya nis başlatma işleminin önemi yoktur: Başlatma işlemi, herhangi bir hizmet başlamadan önce Centrify'nin başlamasını ve böylece herhangi bir hizmet başlamadan önce Centrify'in çalışmasını sağlar.

Upstart'ın, Centrify çalışmaya başlayana kadar başlamak isteyen ilk hizmetin başlamasını engelleyeceğini unutmayın.

Bu şekilde düşünmeye alışınca çok zarif ve basit.


4
Bu tamamen bana geri görünüyor. diğer şeyler bağlıdır zaman neden bir hizmet için conf komut modifiye edilmelidir buna ?
ben

3
@ benw Böylece sahip olmadığınız servislerin ayarlarını değiştirmek zorunda kalmazsınız.
Paccc

1
@Paccc, nginx'e bağlı yeni bir komut dosyası yazarken, sahip olmadığım nginx için conf komut dosyasını değiştirmem gerekiyor.
ben

2
@ benw Neden start on (started nginx)yeni betiğinizde kullanamıyorsunuz ?
Paccc

2
@ Paccc gerçekten değil. start on (started nginx)"hizmetimi nginx'ten sonra başlat" anlamına gelir. "Hizmetime ihtiyaç duymadan hizmetimden önce nginx'i başlat" ile aynı değildir.
sickill

12

James'in cevabı 1'e 1 bağımlılık için çalışıyor. 1'den çoğa, yani, A servisinin B, C ve D servislerinden önce başladığından emin olmak için, başka bir yaklaşım izlemeniz gerekir. Referans için mevcut portmap scriptlerine bakabilirsiniz, ancak genel yaklaşım şöyle: bir bekleme betiği oluşturun.

Senaryo: Servis A'nızın daima servis-b, servis-c ve servis-d'den önce çalışmasını istiyorsunuz .

Çözüm: Servis A için bir bekleme betiği oluşturun. "/Etc/init/service-a-wait.conf" olarak adlandırın.

# service-a-wait

start on (starting service-b 
    or starting service-c
    or starting service-d)
stop on (started service-a or stopped service-a)

# We know that we have more than one job that needs to wait for service-a and
# will make use of this service, so we need to instantiate.
instance $JOB

# Needed to make starting the job successful despite being killed
normal exit 2
task

script

    status service-a | grep -q "start/running" && exit 0
    start service-a || true

    # Waiting forever is ok.. upstart will kill this job when
    # the service-a we tried to start above either starts or stops
    while sleep 3600 ; do :; done

end script

Düz İngilizce'de bunun anlamı şudur: b, c veya d servisi başlatmak istediklerini bildirdiğinde, servis-a çalışıncaya kadar başlamayı beklemelidirler. Bekleme hizmeti işi, hizmet başlatılıncaya kadar çalışacak şekilde tasarlanmıştır. Bekleme servisinden çıktıktan sonra, b, c ve d servisleri devam etmekte ve koşmakta serbesttir.

Bu, herhangi bir ters bağımlılığı başlatmaya teşebbüs etmeden önce a servisinin çalışır durumda ve çalışır durumda olmasını sağlayacaktır.

Not: "example $ JOB" satırı, bu "başlangıç ​​... veya .. veya .." senaryosunda önemlidir. Aksi halde, yalnızca önce B, C veya D'den hangisinin ateş ettiğini gerçekten engelleyeceksiniz.

(örnekleme, dürüstçe daha iyi bir açıklama yapılmasını hak eder. Şimdilik, sadece yapın.)


3
Bunu anlamıyorum… Servis A ile B servisinin başlamaya devam etmesi arasındaki yarış koşulunu ne önler? Senaryonun "senaryoyu başlat" komutunu tamamladığını nasıl anlayacağımı anlamadım… (
Upstart'ın kaliteli

@Mark Russell: Bunun yerine o normal exit 2satır olmamalı normal exit 0 2mı? Bölümdeki ilk satır scriptoldukça açık olabilir exit 0.
Froage
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.