Wie konfiguriere ich meine Upstart-Skripte so, dass Abhängigkeiten berücksichtigt werden?

7

Ich habe PostgreSQL, Atlassian JIRA, Stash, Confluence und Crowd auf einem einzigen Ubuntu 12.04-Server installiert. Sie sind integriert und funktionieren gemäß der Atlassian-Dokumentation.

Eine Sache, die mir aufgefallen ist, ist, dass die Produktsuite nicht toleriert, dass abhängige Komponenten ausfallen. Wenn beispielsweise Crowd gestoppt wird, können sich Benutzer nicht mehr anmelden. Wenn PostgreSQL aus Wartungsgründen gestoppt wird, werden die abhängigen Anwendungen möglicherweise nie wiederhergestellt.

Jede Nacht durchläuft das System ein Wartungsfenster, in dem das Betriebssystem und die Software gepatcht werden können. Das externe DNS ist so konfiguriert, dass eine Wartungsseite ordnungsgemäß angezeigt wird, wenn bei den Anwendungen ein Fehler auftritt.

Von Zeit zu Zeit kann PostgreSQL gestoppt, gepatcht und dann gestartet werden. Wie konfiguriere ich meine Upstart-Skripte so, dass Abhängigkeiten berücksichtigt werden? Ich habe den "Start ein" konfiguriert, aber er hat keine Auswirkung.

Ich schreibe gerne Windows-Dienste und konfiguriere ihre Abhängigkeiten während der Installation (z. B. Windows Installer oder PowerShell).

Testfälle:

  • Ich habe alle Dienste eingestellt. Ich habe dann Confluence gestartet und erwartet, dass es entweder fehlschlägt (da PostgreSQL und Crowd gestoppt sind) oder automatisch versucht, PostgreSQL und Crowd zu starten. Beides ist nicht passiert.

  • Ich habe alle Dienste gestartet. Ich habe dann Crowd gestoppt und erwartet, dass Confluence, JIRA und Stash gestoppt werden. Es hat nur Crowd gestoppt und alle anderen Dienste wurden weiter ausgeführt, funktionierten jedoch nicht richtig.

Abhängigkeiten:

  • Menge : PostgreSQL, Networking
  • Zusammenfluss : PostgreSQL, Networking, Crowd
  • JIRA : PostgreSQL, Networking, Crowd
  • Stash : PostgreSQL, Networking, Crowd

Zusammenfluss

# 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

Verstecken

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

Menge

# 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

PostgreSQL wurde über APT installiert und startet beim Start automatisch.

Bloudraak
quelle
Haben Sie einen Weg gefunden, um die Menge zu starten, nachdem postgresql gestartet wurde?
Mevin Babu

Antworten:

9

Versuchen:

  • Menge

    start on (net-device-up and started postgresql)
    stop on stopping postgresql
    
  • Zusammenfluss

    start on started crowd
    stop on stopping crowd
    
  • Verstecken

    start on started crowd
    stop on stopping crowd
    
  • JIRA

    start on started crowd
    stop on stopping crowd
    

Referenz: http://upstart.ubuntu.com/cookbook/

  • 6.32.2 Der Start hängt von einem anderen Dienst ab
  • 6.33.2 Vor dem abhängigen Service anhalten
user.dz
quelle
Nach einer Weile stellte ich fest, dass Dienste beim Start nach dem Start von postgresql nicht automatisch gestartet werden. Im Wesentlichen sind nach automatischen Updates alle Dienste tot.
Bloudraak
Könnten Sie überprüfen sudo service postgresql statusundsudo service crowd status
user.dz
postgresql ist "Running Cluster: 9.1 / main" und Crowd ist "Crowd Stop / Waiting".
Bloudraak
Versuchen Sie, start on (net-device-up and started postgresql)zustart on started postgresql
user.dz
"start on gestartet postgresql" führt zu den gleichen Ergebnissen. PostgreSQL startet nach dem Neustart, nicht jedoch Crowd.
Bloudraak
6

Dies wird ein wenig schwierig, da postgresql kein nativer Emporkömmling ist. Sie müssen Folgendes tun:

  1. Fügen Sie die Zeile initctl emit -n started JOB=postgresqlam Ende des Startabschnitts von /etc/init.d/postgresql hinzu
  2. Fügen Sie die Zeile initctl emit stopping JOB=postgresqlzum ANFANG des Stoppabschnitts von /etc/init.d/postgresql hinzu
  3. Ändern Sie die Menge zu:

    start on started postgresql
    stop on stopping postgresql
    

Das sollte es sein. Wenn Sie Hilfe für die Schritte 1 und 2 benötigen, fragen Sie einfach.

CameronNemo
quelle
Vielen Dank, das löst das Problem für mich (nicht sicher, warum @bloudraak die andere Antwort akzeptiert hat), da das Postgresql-Skript einen gemeinsamen Abschnitt für Start / Stopp / Neustart / Neuladen hat. 1. und 2. sollten eingefügt if [ "$1" = start -o "$1" = restart ]; then ...; fibzw. if [ "$1" = stop -o "$1" = restart ]; then ...; fiblockiert werden. Genau genommen sollte Ersteres auch die EXITVariable überprüfen .
user686249