Bagaimana saya bisa memastikan satu pekerjaan pemula dimulai sebelum pekerjaan pemula lainnya?

33

Ini adalah pertanyaan pemula yang umum, tetapi izinkan saya menggunakan kasus khusus:

Centrify adalah gateway NIS ke ActiveDirectory. Perlu memuat sebelum layanan apa pun yang akan bergantung pada layanan otentikasi yang disediakannya, misalnya autof, cron, nis, et al.

Ini telah terbukti cukup sulit untuk dicapai, bahkan ketika mencoba mengubah dependensi dari layanan lain (yang saya pikir tidak seharusnya kita lakukan, saya tidak ingin menyentuh pekerjaan pemula lainnya jika memungkinkan) .

Saran?

Mark Russell
sumber

Jawaban:

29

Solusinya adalah dengan mendekati masalah dari arah lain: untuk memenuhi kriteria awal Centrify, tidak perlu membuat layanan yang ada bergantung pada layanan Centrify baru, melainkan membuat layanan Centrify baru bergantung pada layanan yang ada.

Misalnya, file konfigurasi Pemula /etc/init/centrify.confdapat mengatakan:

mulai (mulai cron atau mulai autof atau memulai nis)

Mengubah ini ke dalam bahasa Inggris, ini akan diterjemahkan sebagai:

memulai layanan Centrify sesaat sebelum cron, autofs atau nis mulai (mana yang dimulai lebih dulu).

Urutan cron, autofs atau nis mulai tidak relevan: Pemula akan memastikan bahwa Centrify akan mulai sebelum layanan mana pun yang dimulai terlebih dahulu, sehingga memastikan bahwa Centrify berjalan sebelum salah satu dari layanan tersebut dimulai.

Perhatikan juga bahwa Upstart akan memblokir dimulainya layanan pertama yang ingin memulai sampai Centrify mulai berjalan.

Sangat elegan dan sederhana begitu Anda terbiasa berpikir dengan cara ini.

James Hunt
sumber
4
ini tampaknya benar-benar terbelakang bagi saya. mengapa skrip conf untuk satu layanan harus dimodifikasi ketika hal lain bergantung padanya ?
ben w
3
@benw Agar Anda tidak harus mengubah pengaturan layanan yang ada yang tidak Anda miliki.
Paccc
1
@Paccc ketika saya menulis skrip baru yang tergantung pada nginx, saya harus memodifikasi skrip conf untuk nginx ... yang bukan milik saya.
ben w
2
@ Benw Kenapa kamu tidak bisa menggunakan start on (started nginx)skrip baru?
Paccc
2
@Paccc tidak juga. start on (started nginx)berarti "memulai layanan saya setelah nginx". Yang tidak sama dengan "mulai nginx sebelum layanan saya karena membutuhkannya".
sickill
12

Jawaban James bekerja untuk ketergantungan 1 banding 1. Untuk 1 hingga banyak, yaitu untuk memastikan layanan A dimulai sebelum layanan B, C, dan D, Anda perlu mengambil pendekatan lain. Anda dapat melihat skrip portmap saat ini untuk referensi tetapi di sini adalah pendekatan umum: buat skrip tunggu.

Skenario: Anda ingin agar Layanan A Anda selalu berjalan sebelum service-b, service-c, dan service-d.

Solusi: buat skrip tunggu untuk Layanan A. Sebut saja "/etc/init/service-a-wait.conf"

# 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

Apa artinya ini dalam bahasa Inggris biasa adalah: ketika layanan b, c, atau d memberi tanda bahwa mereka ingin memulai, mereka harus menunggu untuk memulai sampai service-a berjalan. Pekerjaan service-a-wait dirancang untuk berjalan sampai service-a telah dimulai. Setelah layanan-a-tunggu keluar, sekarang layanan b, c, dan d bebas untuk melanjutkan dan menjalankan.

Ini akan memastikan service-a aktif dan berjalan sebelum salah satu dari dependensi kebalikannya mencoba untuk memulai.

Catatan: baris "instance $ JOB" penting dalam skenario "mulai dari ... atau .. atau .." ini. Kalau tidak, Anda hanya akan benar-benar memblokir B, C, atau D mana yang dimatikan terlebih dahulu.

(Instansiasi layak mendapat penjelasan yang lebih baik secara jujur. Untuk saat ini, lakukan saja.;)

Mark Russell
sumber
3
Saya tidak mendapatkan ini ... apa yang mencegah kondisi balapan antara mulai layanan A dan layanan B terus dimulai? Saya tidak melihat bagaimana pemula akan tahu bahwa skrip telah menyelesaikan "memulai layanan-a" ... (salahkan ini pada dokumentasi jelek Upstart mungkin ...)
Chris Pacejo
@ Mark Russell: Bukankah seharusnya normal exit 2garis itu normal exit 0 2? Baris pertama di scriptbagian ini cukup jelas bisa exit 0.
froage