Systemd: служба автозапуска после mongodb

1089
Vladimir Gamalyan

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
Alex Batbold

Я столкнулся с подобной проблемой ... Я хотел запустить 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
WilbaltSlayerOfGargoyles

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

Добро пожаловать в Супер пользователя! Можете ли вы включить соответствующие шаги из решения здесь? :) bertieb 5 лет назад 1
@bertieb Я добавил контент по ссылке в виде цитаты: thumbsup: WilbaltSlayerOfGargoyles 5 лет назад 0

Похожие вопросы