ubuntu16.04.1、systemd
アプリケーションはmongodbに依存しています。アプリケーションとmongodbは両方とも、起動時にサービスとして起動します。 app.service
は次の行を含みます:
After=network.target mongod.service
残念ながら、mongodbは起動して接続の準備が整うまで時間がかかるため(アプリケーションを後で起動する場合はすべて問題ありません)、アプリケーションは(データベースへの接続エラーで)失敗します。
Mongodbがsystemdに適切な通知を送信すると、Type=notify
([Service]
のmongod.service
セクション)が問題を解決するようです。しかし、それに関するドキュメントは見つかりませんでした。
問題は、mongodbが着信接続の準備ができた後、アプリケーションを自動起動する方法です。
将来の参考のために、このソリューションが機能することがわかりました: https://Gist.github.com/jwilm/5842956#gistcomment-2706797
そうすることで、mongodbはsystemdが次のサービスを開始する前にデータベースに到達するまでブロックします。
Mongodbに依存するサービスがある場合、データベースがオンラインになる前にデフォルトのmongodbサービスが返されるため、設定は少し難しくなります。これにより、クイックアプリケーションがデータベースへの接続を試行して失敗する可能性があります。これを防ぐには、次を
/etc/mongod.conf
に追加します。processManagement: fork: true
次に、次の内容で
/etc/systemd/system/mongod.service.d/mongod.conf
(既存の/lib/systemd/system/mongod.service
を拡張する)を作成します。[Service] Type=oneshot RemainAfterExit=yes
これにより、
Sudo systemctl start mongod
はフォークされたプロセスでサーバーを起動し、データベースが起動して接続準備が整った後にのみ返されます。このように、依存サービスは、dbが稼働した後にのみ呼び出されます。
この質問への答えは、すでにserverfaultにあると思います。要するに:Requires
の代わりにAfter
を使用すべきでしょう。 Requires
は、サービスが適切に機能するために他のサービスを必要とすることを意味します。「あとで開始する」べきではありません。
https://serverfault.com/questions/812584/in-systemd-whats-the-difference-between-after-and-requires