Systemd: служба автозапуска после mongodb
ubuntu16.04.1, systemd
Приложение зависит от mongodb. Приложение и mongodb запускаются при загрузке как службы. app.service
содержит следующую строку:
After=network.target mongod.service
К сожалению, приложение перестает работать (с ошибкой подключения к базе данных), я полагаю, потому что mongodb требуется некоторое время для запуска и готовности к подключению (если я запусту приложение позже, все в порядке).
Это выглядит как Type=notify
(в [Service]
раздел mongod.service
) решит проблему, если mongodb отправит соответствующее уведомление systemd. Но я не нашел никакой документации по этому поводу.
Задача состоит в том, как автоматически запустить приложение, после того как mongodb будет готов к входящим соединениям.
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.
Для дальнейшего использования я нашел, что это решение работает: https://gist.github.com/jwilm/5842956 Таким образом, 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 запускает сервер в разветвленном процессе и возвращает только ПОСЛЕ того, как база данных готова и готова к соединениям. Таким образом, зависимые сервисы вызываются только после того, как БД активна.
Как видно из другого ответа, хорошее решение:
- скажите серверу mongodb форк. "Таким образом, mongodb блокируется до тех пор, пока база данных не станет доступной"
- скажите systemd дождаться вилки
Именно это и делается по умолчанию для RedHat (cf mongodb.conf & mongodb.service)
Итак, сделаем то же самое в debian/ubuntu:
- создать каталог для файла pid:
install -d -o mongodb /run/mongodb
- добавить в /etc/mongod.conf:
processManagement:
fork: true
pidFilePath: /run/mongodb/mongod.pid
- добавить файл /etc/systemd/system/mongod.service.d/processManagement-fork.conf
[Service]
PIDFile=/run/mongodb/mongod.pid
Type=forking
(NB: я создал другой ответ, поскольку PIDFILE + Type=forking лучше, чем RemainAfterExit + Type=oneshot)