Иногда служба запускается и разветвляется, создавая у 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 секунд.