FreeBSD: Iniciando o PostgreSQL antes de outros serviços

1

Eu rodei uma aplicação python no FreeBSD que usa PostgreSQL, Nginx e UWSGI. UWSGI eu gerencio com SupervisorD . Meu /etc/rc.conf é assim:

...
postgresql_enable="YES"
nginx_enable="YES"
supervisord_enable="YES"

O SupervisorD inicia um par de diferentes processos UWSGI, mas seus arquivos de configuração são mais ou menos assim:

[program:uwsgi]
command=/usr/local/bin/uwsgi --ini /opt/site/uwsgi/site.ini
autostart=True
autorestart=True
user=example
stopsignal=INT
redirect_stderr=True
stdout_logfile=/opt/site/log/uwsgi.log
stdout_logfile_maxbyte=5MB
stdout_logfile_backups=10
priority=300

Tudo começa corretamente. No entanto, me deparei com um problema em que, quando o servidor foi reinicializado, o SupervisorD iniciou o UWSGI antes do início do PostgreSQL, o que causou um erro.

Existe uma maneira de garantir que meus processos UWSGI não sejam iniciados até que o PostgreSQL seja totalmente atualizado?

Se for mais fácil ignorar o UWSGI e de alguma forma dizer ao FreeBSD para nem iniciar o SupervisorD até que o PostgreSQL esteja pronto, estou bem com isso. Ou eu deveria de alguma forma começar a gerenciar o PostgreSQL com o SupervisorD, e lidar com tudo dentro disso?

    
por rainsurf 20.08.2016 / 19:01

2 respostas

2

Dê uma olhada:

# rcorder /etc/rc.d/* /usr/local/etc/rc.d/*

Isso mostrará a ordem em que os scripts são executados. Como entendi, todos os scripts são iniciados em paralelo. Suas dependências são iniciadas com antecedência.

A palavra chave que inicia um Serviço antes de outro (por exemplo, no script rc do inetd) é

# PROVIDE: inetd
# REQUIRE: DAEMON LOGIN FILESYSTEMS

(ou no script rc do samba)

# PROVIDE: samba_server
# REQUIRE: NETWORKING SERVERS DAEMON ldconfig resolv ntpd
# BEFORE: LOGIN

Basta colocar em todos os scripts rc necessários que precisam ser iniciados antes do seu serviço.

Do manual:

Keep in mind that putting a service name in the REQUIRE: line does not guarantee that the service will actually be running by the time our script starts. The required service may fail to start or just be disabled in rc.conf(5). Obviously, rcorder(8) cannot track such details, and rc(8) will not do that either. Consequently, the application started by our script should be able to cope with any required services being unavailable. In certain cases, we can help it as discussed below.

Finlay o link para o capítulo de manuais do FreeBSD sobre esse tópico: link

    
por 20.08.2016 / 20:14
0

Como mencionado por Daywalker, você precisa adicionar um script especial em rc.d :

# PROVIDE: MYORDER001
# REQUIRE: postgresql
# BEFORE: nginx supervisord exim dovecot ...

Quando rc inicia o sistema, todos os scripts rc são analisados para criar a sequência de lançamento não conflitante. Você pode listar essa sequência por

# rcorder /etc/rc.d/* /usr/local/etc/rc.d/*

Tenha em mente que esta não é uma sequência definitiva, mas apenas a primeira não conflitante foi encontrada. Quando você adiciona MYORDER001 , rcorder pode criar outra sequência apropriada que garanta que postgresql seja iniciado antes de MYORDER001 e listado como BEFORE - após ele.

Você pode adicionar quantos scripts de solicitação desejar, por exemplo, você pode forçar o dovecot a ser iniciado antes de exim se você usou dovecot-auth do exim :

# PROVIDE: MYORDER002
# REQUIRE: dovecot
# BEFORE: exim 

Depois, você pode ter certeza de que postgresql precederá tanto dovecot como exim e dovecot preceder exim .

O único requisito é executar

# rcorder /etc/rc.d/* /usr/local/etc/rc.d/*

sempre que você tiver modificado seus scripts rc para garantir que não haja conflitos na precedência e rcorder poderá criar a sequência adequada.

P.S. Por favor, aceite a solução de Daywalker não minha.

    
por 23.08.2016 / 16:44