it-swarm-ja.com

Systemd:mongodb後の自動開始サービス

ubuntu16.04.1、systemd

アプリケーションはmongodbに依存します。アプリケーションとmongodbはどちらも、サービスとしての起動時に起動します。 app.serviceには次の行が含まれます:

After=network.target mongod.service

残念ながら、アプリケーションは(データベースへの接続エラーで)失敗します。mongodbが起動して接続の準備ができるまでに時間がかかるためです(後でアプリを起動しても、すべて問題ありません)。

Mongodbがsystemdに適切な通知を送信すると、Type=notify[Service]mongod.serviceセクション内)で問題が解決するようです。しかし、それに関するドキュメントは見つかりませんでした。

問題は、mongodbが着信接続の準備ができた後、アプリケーションを自動起動する方法です。

2

同様の問題が発生しました... MongoDBが接続を受け入れる準備ができたら、Mongo-Connectorを起動したいと思いました。

少しグーグルした後、修正を見つけました。修正は、mongodbユニットファイルのExecStart行の後に次のExecStartPost行を追加することでした。

ExecStart=/usr/bin/mongod --quiet --config /etc/mongod.conf
ExecStartPost=/bin/sh -c 'while ! /usr/bin/mongo --eval "db.version()" > /dev/null 2>&1; do sleep 0.1; done'

これは私のUbuntu16.04サーバーで正常にテストされています。

2
Alex Batbold

今後の参考のために、このソリューションが機能することを発見しました: https://Gist.github.com/jwilm/5842956#gistcomment-2706797 そうすれば、systemdが次のサービスを開始する前に、データベースに到達できるまでmongodbがブロックされます。 。そしてそれは睡眠を含みません。

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はフォークされたプロセスでサーバーを起動し、データベースが起動して接続の準備ができた後にのみ戻ります。このように、依存サービスは、データベースが稼働した後にのみ呼び出されます。