Назад | Перейти на главную страницу

Как разрешить медленный запуск службы зависимостей в systemd

Иногда служба запускается и разветвляется, создавая у systemd иллюзию, что она готова, даже если она еще не завершила «прогрев». В этом конкретном случае я использую ApacheDS для предоставления услуг LDAP. Когда этот модуль запущен, проверка "systemctl status apacheds" покажет, что он запущен, вместе с единственной строкой журнала:

04 апреля, 15:34:33 daisy systemd [1]: запущен сервер каталогов Apache.

Но ... он еще не работает. Пока проверка порта (например, «lsof -i: 389» или «netstat -pan | grep: 389 | grep LISTEN») не покажет, что есть активный слушатель, доступного LDAP нет.

Должен он это сделать или нет - для полного запуска требуется около 2 минут. Мой вопрос не в том, сломан ли ApacheDS или его следует заменить, а в том, как справиться с медленной инициализацией служб в systemd.

Есть ли способ поместить такой тест в systemd, либо сказать ему, чтобы он дождался, пока он не будет действителен, чтобы показать службу apacheds как запущенную, либо предоставить его в качестве предварительного условия для зависимых служб, не позволяя им просто терпеть неудачу и все равно отказываться запускаться ?

Вот рабочий тестовый сценарий:

#!/bin/bash
TRIES=30
WAIT=10

while /bin/netstat -an | /bin/grep \:10389 | /bin/grep LISTEN ; [ $? -ne 0 ]; do
    let TRIES-=1
    if [ $TRIES -gt 1 ]; then
            sleep $WAIT
    fi
done

Вы можете добавить ExecStartPost=foo в файл модуля, где foo это сценарий, который проверяет (и перепроверяет), пока служба не станет доступной.

Изменить: вам может потребоваться увеличить TimeoutStartSec также. По умолчанию 90 секунд.