systemd vários arquivos unitários para um único serviço

0

Estou tendo um banco de dados postgresql no sistema SLES 12 SP3 cujo serviço é gerenciado pelo systemd por meio do arquivo de unidade padrão. Eu queria reiniciar automaticamente o serviço em caso de falha, então crie o diretório /etc/systemd/system/postgresql.service.d/psql.conf com o seguinte conteúdo.

[Service]
Restart=on-failure

Isso funciona bem e eu fiquei feliz. Agora existe um requisito para configurar o sistema de alta disponibilidade com um escravo em espera no caso de falha do mestre. A equipe que está trabalhando no HA solicitou a desativação do sinalizador Reiniciar serviço quando o cluster é configurado, pois eles monitorarão o serviço e farão o failover para o escravo quando o postgresql for interrompido. Então criei um arquivo /etc/systemd/system/potgresqlHA.service que é a cópia do arquivo de unidade existente e a equipe de alta disponibilidade começou a usar esse arquivo.

systemctl start/stop/restart/status postgresqlHA

Agora, há um script que faz um backup do banco de dados quando solicitado. Esse script verifica o status do postgresql antes do backup para garantir que o serviço esteja em execução.

systemctl status postgresql

Isso funciona bem quando o cluster não está configurado. Mas quando o cluster está configurado, o status do serviço é interrompido porque postgresqlHA é o serviço que é iniciado.

Como fazer o script de backup funcionar independentemente do serviço de banco de dados que está sendo executado? Existe algo que eu possa configurar em um dos arquivos de unidade para facilitar o gerenciamento?

Eu tenho o mesmo problema verificando o status de alguns outros serviços (apache2, tomcat etc) em outros scripts.

Obrigado Abhishek

    
por Abhishek Kumar 21.03.2018 / 07:36

1 resposta

0

Por que não alterar o teste systemctl status postgresql no script de backup para algo assim?

...
if systemctl is-active postgresql
then
    echo "PostgreSQL is active in non-clustered mode"
    # add here any pre-backup commands specific to non-clustered mode
elif systemctl is-active postgresqlHA
then
    echo "PostgreSQL is active in HA mode"
    # add here any pre-backup command specific to HA mode
else
    echo "PostgreSQL backup FAILURE: PostgreSQL is not running." >&2
    # add any commands to send a backup failure alert here if necessary
    exit 69 # EX_UNAVAILABLE
fi
# commands to run the backup here
...

Observe que systemctl status <service...> foi projetado principalmente para uso interativo. para scripts, systemctl is-active <service...> ou systemctl is-failed <service> pode ser mais conveniente. Se você listar vários serviços, os comandos retornarão um código de resultado 0 se pelo menos um serviço satisfizer a condição.

Se você não precisa se preocupar com qual versão do serviço está sendo executada, você pode testá-los ao mesmo tempo:

...
if ! systemctl is-active postgresql postgresqlHA
then
    echo "PostgreSQL backup FAILURE: neither clustered or non-clustered service is running." >&2
    exit 69 # EX_UNAVAILABLE
fi
# commands to run the backup here
...
    
por 21.03.2018 / 10:43