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!



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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.