Comment puis-je m'assurer qu'un travail de démarrage commence avant les autres travaux de démarrage?

34

Ceci est une question générale de démarrage, mais permettez-moi d'utiliser un cas spécifique:

Centrify est une passerelle NIS vers ActiveDirectory. Il doit être chargé avant tout service dépendant du service d'authentification qu'il fournit, par exemple autofs, cron, nis et al.

Cela s’est avéré très difficile à réaliser, même en essayant de changer les dépendances des autres services (ce que je ne pense pas que nous devrions faire de toute façon, je ne veux pas toucher les autres travaux Upstart si tout est possible).

Suggestions?

    
posée Mark Russell 13.01.2011 - 17:43
la source

2 réponses

12

La réponse de James fonctionne pour une dépendance de 1 à 1. Pour un nombre allant de 1 à plusieurs, c’est-à-dire pour s’assurer que le service A commence avant les services B, C et D, vous devez adopter une autre approche. Vous pouvez regarder les scripts portmap actuels à titre de référence, mais voici l'approche générale: créer un script d'attente.

Scénario: vous souhaitez que votre service A soit toujours exécuté avant service-b, service-c et service-d.

Solution: créez un script d’attente pour le service A. Appelez-le "/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

Ce que cela signifie en anglais est que lorsque le service b, c ou d signale qu’ils veulent démarrer, ils doivent attendre de démarrer jusqu’à ce que service-a soit en cours d’exécution. Le travail service-a-wait est conçu pour s'exécuter jusqu'au démarrage de service-a. Une fois le service-a-wait terminé, les services b, c et d sont désormais libres de fonctionner et de s'exécuter.

Cela assurera que le service-a est opérationnel avant que l'une de ses dépendances inverses ne tente de démarrer.

Remarque: la ligne "instance $ JOB" est importante dans ce scénario "démarrer sur ... ou .. ou ..". Dans le cas contraire, vous ne bloquerez réellement que le premier déclenchement de B, C ou D.

(L'instanciation mérite une meilleure explication honnêtement. Pour l'instant, faites-le.;)

    
réponse donnée Mark Russell 19.03.2011 - 04:37
la source
30

La solution consiste à aborder le problème dans l'autre sens: pour satisfaire aux critères de démarrage de Centrify, il n'est pas nécessaire de créer des services existants. dépendre du nouveau service Centrify, au lieu de faire le nouveau service Centrify dépendre des services existants.

Par exemple, un fichier de configuration Upstart /etc/init/centrify.conf pourrait indiquer:

  

démarrer (démarrer cron ou démarrer autofs ou démarrer nis)

Convertir cela en anglais, cela se traduirait par:

  

lancez le service Centrify juste avant , cron, autofs ou nis     commencer (selon le premier début).

L'ordre dans lequel cron, autofs ou nis démarre n'est pas pertinent: Upstart s'assurera que Centrify démarrera avant le premier service, garantissant ainsi que Centrify s'exécute avant que l'un de ces services ne démarre.

Notez également que Upstart bloque le démarrage du premier service qui veut démarrer jusqu’à ce que Centrify ait démarré.

Très élégant et simple une fois que vous avez l'habitude de penser de cette manière.

    
réponse donnée James Hunt 18.01.2011 - 12:40
la source

Lire d'autres questions sur les étiquettes