Dependência do sistema persistente do usuário no PostgreSQL

1

Eu tenho uma conta de usuário no Ubuntu Server 17.10 com a persistência do usuário ativada para systemd , que é, na minha opinião, uma ótima função. No entanto, é mal documentado. Embora eu tenha conseguido iniciar meu serviço como esse usuário usando manualmente os comandos systemctl --user ... , tenho um problema com dependências.

No meu ~/.config/systemd/user/foobar.service , tenho a dependência definida desta forma:

[Unit]
Decription=StackExchange Foo Bar
After=network.target
# Some non-relevant stuff removed
[Install]
WantedBy=default.target

Quando coloco posgresql.service , ele falha dizendo que não sabe. Eu descobri em outras respostas, que o systemd persistente não vê serviços em todo o sistema. Apenas alvos systemd genéricos, portanto, WantedBy deve ser definido como default.target . Mas com essa configuração, o serviço (aplicativo real) falha ao iniciar a inicialização, pois não pode se conectar ao Postgresql [no tempo?] Do sistema.

Então, a verdadeira questão aqui é : Como configurar tudo isso no modo persistente, para ter a dependência do PosgreSQL a cada inicialização? Qualquer maneira de configurar dummy postgreql.service que ligaria ao sistema de alguma forma? Existem outros métodos? Qualquer dica seria bem vinda.

EDIT: O Postgresql está sendo executado como um aplicativo de todo o sistema, não um serviço por meio de uma conta de usuário.

    
por Michał F 09.12.2017 / 13:39

1 resposta

1

Você define um alvo que requer o PostgreSQL da seguinte forma:

$ cat postgresql.target
[Unit]
Description=Emergency Mode with Networking
Requires=network.target postgreql.service
After=postgreql.service
AllowIsolate=yes

Isso você adiciona ao seu serviço:

[Unit]
Decription=StackExchange Foo Bar
After=network.target postgresql.target
# Some non-relevant stuff removed
[Install]
WantedBy=default.target

EDIT (Após comentário):

O acima está incorreto, eu supus que o systemd no espaço do usuário poderia ver qualquer alvo.

Após a investigação, parece que apenas conhece estes alvos:

default.target, shutdown.target, sockets.target, timers.target,   paths.target, bluetooth.target, printer.target, smartcard.target,   sound.target.

Isso significa que você teria que adicionar o postgresql.service a qualquer um dos destinos acima que fizesse sentido, eu o adicionaria a sockets.target e teria seu foobar.service start AFTER default.target , que é atingido DEPOIS sockets.target .

Para adicionar o postgresql.service ao sockets.target , adicione sockets.target a WantedBy= de postgresql.service e, em seguida, atualize a configuração do systemd.

Outra opção exigiria netcat, nc -z <host> <port> retornará 0 se a porta estiver aberta ... no script, seu serviço executa apenas o loop enquanto a porta do PostgreSQL está fechada ... assim que a porta abrir, aguarde outra segundo ou dois (ou o que quer que seja prático) e depois faça o seu serviço fazer o que é suposto.

    
por 14.12.2017 / 08:59

Tags