2

ubuntu16.04.1, systemd

Приложение зависит от mongodb. Приложение и mongodb запускаются при загрузке как службы. app.service содержит следующую строку:

After=network.target mongod.service

К сожалению, приложение перестало работать (с ошибкой подключения к базе данных), я думаю, потому что mongodb требуется некоторое время для запуска и готовности к подключению (если я запусту приложение позже, все в порядке).

Похоже, что Type=notify (в разделе [Service] mongod.service) решит проблему, если mongodb отправит соответствующее уведомление systemd. Но я не нашел никакой документации об этом.

Вопрос в том, как автоматически запустить приложение после того, как mongodb будет готов к входящим соединениям.

2 ответа2

2

Я столкнулся с подобной проблемой ... Я хотел запустить Mongo-Connector, когда MongoDB будет готов принять соединение.

Я нашел исправление после того, как немного погуглил. Исправление заключалось в добавлении следующей строки ExecStartPost после строки ExecStart в файле модуля mongodb.

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'

Это успешно протестировано на моем сервере Ubuntu 16.04.

1

Для дальнейшего использования я нашел, что это решение работает: 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 запускает сервер в разветвленном процессе и возвращает только ПОСЛЕ того, как база данных готова и готова к соединениям. Таким образом, зависимые сервисы вызываются только после того, как БД активна.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .