Como posso informar ao upstart para reiniciar um serviço quando um serviço diferente for reiniciado?

5

Eu tenho um servidor OpenERP em execução em um dos meus servidores. É iniciado por um script tradicional /etc/init.d/ . Ele usa um banco de dados PostgreSQL e precisa de uma reinicialização manual toda vez que o PostgreSQL é reiniciado.

Toda vez que o Ubuntu lança uma atualização de segurança para o PostgreSQL, meu servidor OpenERP se torna não funcional até que eu ssh para o servidor e execute manualmente sudo /etc/init.d/my-openerp restart . Eu costumo esquecer de fazer isso depois de fazer o sudo apt-get upgrade .

Posso configurar o upstart para fazer isso para mim, sempre que o postgresql for reiniciado pelo apt?

    
por Marius Gedminas 13.02.2013 / 16:12

3 respostas

4

Como o servidor postgresql ainda está usando o script de inicialização do System-V obsoleto, há duas opções:

  • Emite eventos do script de inicialização do System-V existente
  • Portar o script de inicialização do System-V existente para o trabalho do upstart

Em ambos os casos, você pode usar start on started-postgresql e stop on stopping-postgresql em seu trabalho. Como mencionado no comentário, my-openerp irá iniciar / parar sempre no início / parada postgresql e não apenas após a atualização.

Se você optar por emitir eventos a partir do script de init System-V existente, será necessário adicionar /etc/init.d/postgresql:

# just before the service is started
initctl emit starting-postgresql
# just after the service is started
initctl emit started-postgresql 
# just before stopping the service
initctl emit stopping-postgresql
# just after the service is stopped
initctl emit stopped-postgresql

Para obter detalhes, consulte Dicas úteis na seção Serviços de escrita na página Howto de inicialização do Ubuntu.

Caso você opte por criar o trabalho do Upstart, a configuração mais simples pode ser assim:

start on runlevel [2345]
stop on runlevel [016]
respawn

exec su -c "/etc/postgresql/bin/postgres -D /usr/local/pgsql/data" postgres

A configuração Upstart mais elaborada pode ser encontrada aqui .

Gostaria de brincar e, em vez de iniciar o postgresql no runlevel [2345], talvez diga

start on filesystem and net-device-up IFACE!=lo

ou

start on started networking

Você também pode considerar adicionar uma estrofe de tempo limite para matar

kill timeout 300
    
por Goran Miskovic 14.02.2013 / 12:12
3

Para elaborar a primeira opção de schkovich , aqui está uma simples modificação no script System V /etc/init.d/postgresql .

Portanto, sempre que postgres for enviado "start / restart" / "reload" / "force-restart", eu envio o evento "starting-postgresql" antes que o comando seja emitido, e o "started-postgresql" após o seu término. Da mesma forma, com "stop", eu envio o evento "stopping-postgresql" antes do comando e "stopped-postgresql" após sua emissão.

Estou mostrando apenas o bloco final do caso ( case "$1" in [...] esac na parte inferior do script. Para tornar as alterações mais claras (caso versões futuras do postgres modifiquem o script do sistema-V, eu destaquei as linhas que precisam para ser inserido colocando-os entre #### BEGIN emit-upstart-event e #### END emit-upstart-event .

case "$1" in
    start|stop|restart|reload)
        if [ -z "'pg_lsclusters -h'" ]; then
            log_warning_msg 'No PostgreSQL clusters exist; see "man pg_createcluster"'
            exit 0
        fi
        #### BEGIN emit-upstart-event
        case "$1" in
            start|restart|reload)
                initctl emit starting-postgresql
            ;;
            stop)
                initctl emit stopping-postgresql
            ;;
        esac
        #### END emit-upstart-event
        for v in $versions; do
            $1 $v || EXIT=$?
        done
        #### BEGIN emit-upstart-event
        case "$1" in
            start|restart|reload)
                initctl emit started-postgresql
            ;;
            stop)
                initctl emit stopped-postgresql
            ;;
        esac
        #### END emit-upstart-event
        exit ${EXIT:-0}
        ;;
    status)
        LS='pg_lsclusters -h'
        # no clusters -> unknown status                                                                                                                                                                                                                  
        [ -n "$LS" ] || exit 4
        echo "$LS" | awk 'BEGIN {rc=0} {if (match($4, "down")) rc=3; printf ("%s/%s (port %s): %s\n", $1, $2, $3, $4)}; END {exit rc}'
        ;;
    force-reload)
        #### BEGIN emit-upstart-event
        initctl emit starting-postgresql
        #### END emit-upstart-event
        for v in $versions; do
            reload $v
    done
        #### BEGIN emit-upstart-event
        initctl emit started-postgresql
        #### END emit-upstart-event
    ;;
    *)
        echo "Usage: $0 {start|stop|restart|reload|force-reload|status} [version ..]"
    exit 1
    ;;
esac

Se você quiser manipular o reinício com todos os sinais apropriados (dividindo a reinicialização em um comando stop e start), você pode fazer:

case "$1" in
    restart)
        ### HANDLING restart as a stop event and then a start event.
        if [ -z "'pg_lsclusters -h'" ]; then
            log_warning_msg 'No PostgreSQL clusters exist; see "man pg_createcluster"'
            exit 0
        fi
        initctl emit stopping-postgresql
        for v in $versions; do
            stop $v || EXIT=$?
        done
        initctl emit stopped-postgresql
        initctl emit starting-postgresql
        for v in $versions; do
            start $v || EXIT=$?
        done
        initctl emit started-postgresql
        ### END HANDLING restart separately
    start|stop|reload)
        if [ -z "'pg_lsclusters -h'" ]; then
            log_warning_msg 'No PostgreSQL clusters exist; see "man pg_createcluster"'
            exit 0
        fi
        #### BEGIN emit-upstart-event
        case "$1" in
            start|reload)
                initctl emit starting-postgresql
            ;;
            stop)
                initctl emit stopping-postgresql
            ;;
        esac
        #### END emit-upstart-event
        for v in $versions; do
            $1 $v || EXIT=$?
        done
        #### BEGIN emit-upstart-event
        case "$1" in
            start|reload)
                initctl emit started-postgresql
            ;;
            stop)
                initctl emit stopped-postgresql
            ;;
        esac
        #### END emit-upstart-event
        exit ${EXIT:-0}
        ;;
    status)
        LS='pg_lsclusters -h'
        # no clusters -> unknown status                                                                                                                                                                                                                  
        [ -n "$LS" ] || exit 4
        echo "$LS" | awk 'BEGIN {rc=0} {if (match($4, "down")) rc=3; printf ("%s/%s (port %s): %s\n", $1, $2, $3, $4)}; END {exit rc}'
        ;;
    force-reload)
        #### BEGIN emit-upstart-event
        initctl emit starting-postgresql
        #### END emit-upstart-event
        for v in $versions; do
            reload $v
    done
        #### BEGIN emit-upstart-event
        initctl emit started-postgresql
        #### END emit-upstart-event
    ;;
    *)
        echo "Usage: $0 {start|stop|restart|reload|force-reload|status} [version ..]"
    exit 1
    ;;
esac
    
por dr jimbob 13.03.2014 / 23:26
0

Eu escrevi um script no qual fiz uma função -system-update, que interrompe o openerp, atualiza o sistema pelo apt-get upgrade, depois inicia o openerp, depois reinicia o web-client em caso de versão < 6.1. O problema é que requer que você use o script para atualizar seu servidor. Eu não usei um apelido.

    
por SISalp 14.02.2013 / 09:26

Tags