web-dev-qa-db-fra.com

Systemd: service de démarrage automatique après mongodb

ubuntu16.04.1, systemd

Une application dépend de mongodb. L'application et mongodb démarrent tous deux au démarrage en tant que services. app.service contient la ligne suivante:

After=network.target mongod.service

Malheureusement, l'application échoue (avec une erreur de connexion à la base de données), je suppose, car le mongodb a besoin de temps pour démarrer et être prêt pour les connexions (si je démarre l'application plus tard, tout va bien).

On dirait Type=notify (dans [Service] section de mongod.service) résoudra le problème si mongodb envoie une notification appropriée à systemd. Mais je n'ai trouvé aucune documentation à ce sujet.

Le queston est, comment démarrer automatiquement l'application, après que mongodb sera prêt pour les connexions entrantes.

1
Vladimir Gamalyan

Pour référence future, j'ai trouvé que cette solution fonctionnait: https://Gist.github.com/jwilm/5842956#gistcomment-2706797

De cette façon, mongodb se bloque jusqu'à ce que la base de données soit accessible avant que systemd ne démarre le service suivant.

Si vous avez des services qui dépendent de mongodb, la configuration est légèrement plus difficile car le service mongodb par défaut revient avant que la base de données ne soit en ligne. Cela peut amener des applications rapides à essayer de ne pas se connecter à la base de données. Pour éviter cela, ajoutez ce qui suit à /etc/mongod.conf:

processManagement:
    fork: true

Ensuite, créez /etc/systemd/system/mongod.service.d/mongod.conf (qui étend l'existant /lib/systemd/system/mongod.service) avec le contenu suivant:

[Service]
Type=oneshot
RemainAfterExit=yes

Ça cause Sudo systemctl start mongod pour démarrer le serveur dans un processus fourchu et retourner uniquement APRÈS que la base de données est en place et prête pour les connexions. De cette façon, les services dépendants ne sont invoqués qu'une fois la base de données active.

2

Je suppose que la réponse à cette question est déjà à défaut de serveur. En bref: vous devriez peut-être utiliser Requires au lieu de After. Requires signifie que votre service nécessite que l'autre fonctionne correctement, et non "devrait juste être démarré après".

https://serverfault.com/questions/812584/in-systemd-whats-the-difference-between-after-and-requires

0
Piohen