Como eu configuro meus scripts Upstart para ter dependências em consideração?

7

Instalei o PostgreSQL, o Atlassian JIRA, o Stash, o Confluence e o Crowd em um único servidor Ubuntu 12.04. Eles estão integrados e funcionando de acordo com a documentação da Atlassian.

Uma coisa que notei é que o pacote de produtos não tolera que os componentes dependentes estejam inativos. Por exemplo, se o Crowd for interrompido, os usuários não poderão mais efetuar login. Se o PostgreSQL estiver sendo interrompido por motivos de manutenção, os aplicativos dependentes talvez nunca se recuperem.

Todas as noites, o sistema passa por uma janela de manutenção, durante a qual o sistema operacional e o software podem ser corrigidos. O DNS externo está configurado para exibir uma página de manutenção se houver um erro com os aplicativos.

De vez em quando, o PostgreSQL pode ser parado, corrigido e iniciado. Como eu configuro meus scripts Upstart para ter dependências em conta? Eu configurei o "start on", mas não tem efeito.

Sinto-me à vontade para escrever serviços do Windows e configurar suas dependências durante a instalação (por exemplo, o instalador do Windows ou o PowerShell).

Testcases:

  • Parei todos os serviços. Eu então comecei o Confluence, esperando que falha (já que o PostgreSQL e o Crowd são interrompidos) ou automaticamente tenta iniciar o PostgreSQL e o Crowd. Nem aconteceu.

  • Eu iniciei todos os serviços. Então eu parei Crowd, esperando que Confluence, JIRA e Stash serão parados. Só parou Crowd e todos os outros serviços continuaram funcionando, mas não funcionaram corretamente.

Dependências:

  • Multidão : PostgreSQL, Rede
  • Confluence : PostgreSQL, Rede, Multidão
  • JIRA : PostgreSQL, Rede, Multidão
  • Stash : PostgreSQL, Rede, Multidão

Confluência

# confluence

description "Atlassian Confluence"

start on (net-device-up and local-filesystems and postgresql and runlevel [2345] and crowd)
stop on runlevel [!2345]

respawn

kill timeout 30

env RUN_AS_USER=confluence
env BASEDIR=/usr/local/bin/confluence

script
    LOGFILE=/var/log/confluence/confluence.'date +%Y-%m-%d'.log
    exec su - $RUN_AS_USER -c "$BASEDIR/bin/catalina.sh run" >> $LOGFILE 2>&1
end script

JIRA

description "Atlassian JIRA"

start on (net-device-up and local-filesystems and postgresql and runlevel [2345] and crowd)
stop on runlevel [!2345]

respawn

kill timeout 30

env RUN_AS_USER=jira
env BASEDIR=/usr/local/bin/jira

script
    LOGFILE=/var/log/jira/jira.'date +%Y-%m-%d'.log
    exec su - $RUN_AS_USER -c "$BASEDIR/bin/catalina.sh run" >> $LOGFILE 2>&1
end script

Stash

description "Atlassian Stash"

start on (net-device-up and local-filesystems and postgresql and runlevel [2345] and crowd)
stop on runlevel [!2345]

respawn

kill timeout 30

env RUN_AS_USER=stash
env BASEDIR=/usr/local/bin/stash
env STASH_HOME="/var/local/lib/stash"

script
    LOGFILE=/var/log/stash/stash.'date +%Y-%m-%d'.log
    exec su - $RUN_AS_USER -c "$BASEDIR/bin/start-stash.sh -fg" >> $LOGFILE 2>&1
end script

Multidão

# crowd

description "Atlassian Crowd - Single Sign-On (SSO) and Identity Management"

start on (net-device-up and local-filesystems and postgresql and runlevel [2345])
stop on runlevel [!2345]

respawn

kill timeout 30

env RUN_AS_USER=crowd
env BASEDIR=/usr/local/bin/crowd/apache-tomcat

script
    LOGFILE=/var/log/crowd/crowd.'date +%Y-%m-%d'.log
    exec su - $RUN_AS_USER -c "$BASEDIR/bin/catalina.sh run" >> $LOGFILE 2>&1
end script

O PostgreSQL foi instalado via APT e inicializa automaticamente durante a inicialização.

    
por bloudraak 12.04.2014 / 22:17

2 respostas

9

Tente:

  • Multidão

    start on (net-device-up and started postgresql)
    stop on stopping postgresql
    
  • Confluência

    start on started crowd
    stop on stopping crowd
    
  • Stash

    start on started crowd
    stop on stopping crowd
    
  • JIRA

    start on started crowd
    stop on stopping crowd
    

Referência: link

  • 6.32.2 Iniciar depende de outro serviço
  • 6.33.2 Parar antes do serviço de dependência
por user.dz 19.04.2014 / 23:51
5

Isso vai ser um pouco difícil, porque o postgresql não é um trabalho inicial nativo. Você precisa fazer o seguinte:

  1. Adicione a linha initctl emit -n started JOB=postgresql no final da parte inicial de /etc/init.d/postgresql
  2. Adicione a linha initctl emit stopping JOB=postgresql ao BEGINNING da parte de parada de /etc/init.d/postgresql
  3. Mude a multidão para:

    start on started postgresql
    stop on stopping postgresql
    

Deve ser isso. Se você precisar de ajuda para as etapas 1 e 2, basta perguntar.

    
por CameronNemo 02.06.2014 / 06:41