Upstart-Skript, das von init.d-Skripten abhängt?

8

Ich habe ein Startskript, um eine benutzerdefinierte NodeJS-App zu starten. Die App hängt von Couchdb und Elasticsearch ab. couchdb und elasticsearch bieten init.d-Skripte zum Starten / Stoppen. Kann ich meinem Upstart-Skript mitteilen, dass Couchdb und Elasticsearch Abhängigkeiten sind? Ich habe dies in meinem Upstart-Skript versucht, aber es scheint nicht zu funktionieren:

start on (hat couchdb gestartet und elasticsearch gestartet)

Vielen Dank!

Troy
quelle
Ich habe Folgendes versucht: Start auf gestartet rc RUNLEVEL = [2345], aber es hilft nicht. Elasticsearch wurde nicht gestartet, als meine App gestartet wurde. Es scheint also, dass mein Upstart-Skript nicht wissen kann, ob die von Init-Skripten gestarteten Dienste bereits gestartet wurden.
Troy
Nun, das einzige, von dem ich weiß, dass es funktionieren würde, ist, Upstart-Skripte sowohl für elasticsearch als auch für couchdb zu erstellen (oder zu suchen und zu installieren), damit Sie die Option "Start on" verwenden können.
Rinzwind
Sehen Sie, ob diese Antwort hilfreich ist! Ich habe ein Upstart-Skript für beide gefunden: D Ungetesteter Code, sodass Sie ihn möglicherweise an Ihre Situation anpassen müssen.
Rinzwind

Antworten:

3

Ich weiß nur, dass dies funktionieren würde, wenn Sie Upstart-Skripte für elasticsearch und couchdb erstellen (oder suchen und installieren), damit Sie die Option "Start on" verwenden können.

Upstart-Skript für couchdb

# couchdb v1.2.0
#
# Benutzerdefinierte Installation von CouchDB

Beschreibung "CouchDB v1.2.0, lokal"
Konsolenausgabe

# Starten Sie, nachdem alle Dateisysteme und Netzwerkschnittstellen verfügbar sind
start on (lokale Dateisysteme und Net-Device-up IFACE! = lo)
auf Runlevel anhalten [! 2345]

# Arbeitsverzeichnis einstellen
env COUCHDB_WD = "/ path / to / build-couchdb / build / bin"
export COUCHDB_WD

# erforderlich für erlang
env HOME = "/ home / user"
HOME exportieren

Skript
  # Ändern Sie PATH so, dass zuerst das Arbeitsverzeichnis der lokalen Couchdb aufgerufen wird
  PATH = "$ COUCHDB_WD: $ PATH"
  #export PATH # im Skriptblock nicht erforderlich
  #logger -t $ 0 "HOME = '$ HOME'"
  #logger -t $ 0 "PATH = '$ PATH'"
  # Couchdb-Protokolle an benutzerdefinierten Speicherort ausgeben
  #exec >> / home / user / couchdb_local.log 2> & 1
  exec couchdb
Skript beenden

Emporkömmling für Elasticsearch

# ElasticSearch Service

Beschreibung "ElasticSearch"

Starten Sie am (Net-Device-Up
          und lokale Dateisysteme
          und Runlevel [2345])

Stopp auf Runlevel [016]

Respawn-Limit 10 5

env ES_HOME = / usr / share / elasticsearch / home
env ES_MIN_MEM = 256 m
env ES_MAX_MEM = 2g
env DAEMON = "$ {ES_HOME} / bin / elasticsearch"
env DATA_DIR = / data / elasticsearch / data
env CONFIG_DIR = / etc / elasticsearch

Konsolenausgabe

Skript
  if [-f / etc / default / elasticsearch]; dann
    . / etc / default / elasticsearch
  fi

  su -s / bin / dash -c "/ usr / bin / elasticsearch -f -Des.path.conf = $ CONFIG_DIR -Des.path.home = $ ES_HOME -Des.path.logs = $ LOG_DIR -Des.path. data = $ DATA_DIR -Des.path.work = $ WORK_DIR "elasticsearch
Skript beenden
Rinzwind
quelle
Am Ende habe ich stattdessen nur ein init.d-Skript erstellt. Vielen Dank für Ihre Hilfe.
Troy
Ich denke, Sie haben Recht ... Ich habe gerade das Skript init.d aus Zeitgründen als Pflaster erstellt.
Troy
Das wird auch funktionieren, ist aber eine Regression;) Da 12.10 den Start begünstigt, habe ich erwartet, dass der Start die bessere Option ist. Aber wenn Sie es mit Init-Skript zum
Laufen gebracht haben, machen Sie
7

Ich hatte die gleiche Frage und fand auch eine andere Antwort . Der Autor listet 4 Optionen auf, um dies zu erreichen, von denen mir die erste am besten gefällt:

Verwenden Sie initclt emit myservice-starteddiese Option , um den Abschluss des Startvorgangs Ihres abhängigen Dienstes zu signalisieren. In der verknüpften Antwort wird empfohlen, diese Zeile am Ende des init.dSkripts des Abhängigkeitsdienstes hinzuzufügen , aber ich bevorzuge eine andere Methode. Ich möchte ein neues inid.dSkript mit dem Namen erstellen myservice-started, das nur einen startAbschnitt enthält . Unter Verwendung des entsprechenden Kommentarstils im Header der Datei erkläre ich, dass es davon abhängt $myservice, gestartet zu werden. In diesem startAbschnitt erzähle ich Emporkömmling über myserviceden Start. Sie können es mit installieren update-rc.d.

Ich mag diese Lösung, weil sie nicht aufdringlich ist. Wenn ein Update eines der vorhandenen init.dSkripte ändert , hat dies keine Auswirkungen auf diese zusätzlichen Skripte. Aber denken Sie daran , dass Änderungen an dem Emporkömmling Skripte sind erforderlich.

Es könnte so aussehen:

#!/bin/sh -e

### BEGIN INIT INFO
# Provides:          myservice-started
# Required-Start:    $myservice
# Default-Start:     2 3 4 5
# Short-Description: send upstart signal after starting myservice
# Description:       myservice needs to run before some upstart services can run
### END INIT INFO

. /lib/lsb/init-functions

case "$1" in
    start)
        log_daemon_msg "Signaling myservice started..." "myservice-started"
        initctl emit myservice-started --no-wait
    ;;

    *)
        log_action_msg "Usage: /etc/init.d/myservice-started start"
        exit 1
    ;;
esac

exit 0

Ihr Startskript, das auf myservice wartet, kann auf das myservice-startedEreignis warten :

start on myservice-started
derabbink
quelle