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.