Como permitir um serviço de dependência de inicialização lenta no systemd

1

Às vezes, um serviço será iniciado e dará a ilusão de que está pronto - mesmo que não tenha terminado o "aquecimento". Nesta instância específica, estou usando o ApacheDS para fornecer serviços LDAP. Quando esta unidade é iniciada, a verificação "apaceados de status do systemctl" mostrará sua execução, juntamente com a única linha de registro:

Apr 04 15:34:33 daisy systemd [1]: Iniciado o Apache Directory Server.

Mas ... ainda não está sendo veiculado. Até que um teste de porta (como "lsof-i: 389" ou "netstat -pan | grep: 389 | grep LISTEN") revele que há um ouvinte ativo, não há LDAP disponível.

Se deve fazê-lo ou não - isso leva cerca de 2 minutos para ser totalmente inicializado. Minha pergunta não é se o ApacheDS está quebrado ou não, ou se deve ser substituído - é como lidar com os serviços de inicialização lenta no systemd.

Existe uma maneira de colocar um teste como esse no systemd, para que ele espere até que seja válido mostrar o serviço do apache como iniciado ou fornecer como uma pré-condição para serviços dependentes, sem que eles simplesmente falhem e ainda se recusar a começar?

Aqui está um script de teste em funcionamento:

#!/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
    
por Daniel Miller 05.04.2018 / 01:04

1 resposta

2

Você pode adicionar um ExecStartPost=foo ao arquivo de unidade, em que foo é um script que verifica (e verifica novamente) até que o serviço esteja disponível.

Editar: talvez você precise aumentar TimeoutStartSec também. O padrão é 90s.

    
por 05.04.2018 / 01:20