Node.js App mit Init Script beim Neustart/Reboot automatisch starten – linux raspberry pi daemons

Du möchtest ein Node.js Script, oder einen CMD Befehl bei Hochfahren/Neustart/Reboot automatisch ausführen, dann bist du hier genau richtig.

Nach dem Laden des Linux-Kernels wird als erstes Programm überhaupt das Programm init gestartet. Dieses Programm startet alle weiteren Programme. Welche das sind, wird über die Skripte im Verzeichnis /etc/init.d/ bestimmt.

Der Vorteil gegenüber der /etc/init.d/ Variante ist, das du das Script über die Kommandozeile Neustarten, Stoppen und Starten kannst.

  1. Erstell ein Init Script für “dasher” (dasher ist nur ein Beispielname, du kannst ihn nach belieben verändern).
    sudo nano /etc/init.d/dasher
  2. Kopiere den Inhalt dieses Init Script Templates. Mehr Informationen über diese Template findest du hier.
  3. Füge hinter Provides: den Scriptnamen ein und pass diese 3 Variablen (dir, cmd und user) am Anfang des Script an. Bei cmd kannst du jeden beliebigen Befehl eintragen den du auch im Terminal ausführen kannst. So kannst du beim Neustart einen beliebigen Befehlt ausführen lassen.
    #!/bin/sh
    ### BEGIN INIT INFO
    # Provides: dasher
    # Required-Start:    $network $remote_fs $syslog
    # Required-Stop:     $remote_fs $syslog
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: Start daemon at boot time
    # Description:       Enable service provided by daemon.
    ### END INIT INFO
    
    dir="/home/pi/dasher"
    cmd="node app.js"
    user="root"

    … beende den Nano Texteditor mit ctrl+x am Mac, oder strg+x bei Windows und speichere die Änderung mit y.

  4. Ändere die Rechte des Init Script, um es ausführbar zu machen.
    sudo chmod 755 /etc/init.d/dasher
  5. Aktiviere den dasher Dienst/Service (ersetze den Namen “dasher” mit dem Namen den du in Schritt 3 hinter Provides: geschrieben hast)
    sudo update-rc.d dasher defaults
  6. Beim nächsten Neustart/Reboot wird das Script mit ausgeführt. Um es manuell zu starten kannst du folgenden Befehl verwenden.
    sudo /etc/init.d/dasher start

    Script stoppen

    sudo /etc/init.d/dasher stop

    Script neustarten

    sudo /etc/init.d/dasher restart
    Anstatt sudo /etc/init.d/dasher restart kannst du auch sudo service dasher restart schreiben.

    linux-autostart-node-js-init-script

  7. Um zu prüfen ob das Script läuft gib diesen Befehl ein
    
    /etc/init.d/dasher status
    
  8. Die Logdateien kannst du dir wie folgt live ausgeben lassen.
    
    tail -f /var/log/dasher.log
    tail -f /var/log/dasher.err
    

Gib deine Stimme ab!

42 Likes
Upvote Downvote

Total votes: 35

Upvotes: 35

Upvotes percentage: 100.000000%

Downvotes: 0

Downvotes percentage: 0.000000%

Geschrieben von Ben

#Blogger #Designer #RaspeberryFan #Self-Employed #Developer #Javascript
TwitterGithubThingiverse

12 Kommentare

Kommentar verfassen
  1. Hallo,
    irgendwie bekommt ich das Script nicht zu laufen bzw alle Pfade sind richtig die Berechtigungen passen, eine PID wird vergeben wenn ich das Script starte aber die PID kann ich im Taskmanager nicht sehen denn wenn ich den status Abfrage ist das Script immer GESTOPPT.
    Die beiden Dateien error und log sind leer.
    Gehe ich, ohne Script, in mein Verzeichnis und starte mit node index.js funkt alles perfekt.
    Ach ja den User habe ich auf PI gesetzt da ich mit ROOT den node sonst nicht starten kann.
    Ist nicht so das ich mich gar nicht auskenne aber im Moment weiss ich nicht mehr weiter.
    Für einen Tipp wäre ich dankbar

  2. Hallo,
    nach Kopieren des Templates, Anpassen und Starten (sudo /etc/init.d/dasher start) des Scriptes bekomme ich folgende Meldung:

    /etc/init.d/dasher: 26: /etc/init.d/dasher: Syntax error: "&" unexpected

    Ich kenne mich leider mit der Syntax nicht aus. Ehrlich gesagt bin ich nicht mal sicher, welches Zeile 26 ist. Im Notepad++ wäre das diese Zeile:

    [ -f "$pid_file" ] && ps get_pid > /dev/null 2>&1

    Ist hier irgendwas falsch oder was ist das Problem?

  3. Hallo,
    ich habe ein Problem das Skript zum Laufen zu bringen.
    Wenn ich „/etc/init.d/dasher status“ eingebe, wird mir angezeigt das das Script gestoppt ist.
    Unter „tail -f /var/log/dasher.err“ steht folgendes:

    SyntaxError: /home/pi/dasher/config/config.json: Unexpected token
    in JSON at position 265
    at Object.parse (native)
    at Object.Module._extensions..json (module.js:573:27)
    at Module.load (module.js:473:32)
    at tryModuleLoad (module.js:432:12)
    at Function.Module._load (module.js:424:3)
    at Module.require (module.js:483:17)
    at require (internal/module.js:20:19)
    at Object. (/home/pi/dasher/app.js:2:14)
    at Module._compile (module.js:556:32)
    at Object.Module._extensions..js (module.js:565:10)

    Ich habe nachgesehen, die Datei config.json existiert mit folgendem Inhalt:
    {„buttons“:[
    {
    „name“: „Dash1“,
    „address“: „20:6E:9C:E6:AD:1F“,
    „url“: „http://192.168.178.22:8083/fhem?cmd=set%20Steckdose%20on“,
    „method“: „POST“,
    „json“: true,
    „body“: {„value1“: „any value“, „value2“: „another value“, „value3“: „wow, $
    }
    ]}
    Unter „tail -f /var/log/dasher.log“ erscheint kein Eintrag
    Was ich ja eigentlich nur will ist, den Dash Button zum Ein- und Ausschalten einer Steckdose zu benutzen.
    Aber irgendwo muss ich einen Bock gebaut haben!

    • Der Fehler liegt irgendwo in deiner config.json Datei.
      Lösch mal die Zeile body: {…} da ist eine Klammer zu wenig und ein $ Zeichen. Wichtig ist auch das alle Anführungszeichen ” sind und nicht „“ sind.

    • Hier der Inhalt einer config.json

      {"buttons":[
      {
      "name": "Dash1",
      "address": "ac:61:b3:e1:fa:fe",
      "url": "http://127.0.0.1:8083/fhem?cmd=set%20Licht%20on",
      "method": "POST",
      "json": true,
      "body": {"value1": "any value", "value2": "another value"}
      }
      ]}

    • Hallo Ben,

      das Skript scheint jetzt zu laufen.
      Im Log file erscheint: “Dash1 added.”
      Das Err file zeigt nichts mehr an. 🙂

      Meine config.json sieht jetzt so aus:

      {“buttons”:[
      {
      “name”: “Dash1”,
      “address”: “20:6E:9C:E6:AD:1F”,
      “url”: “http://192.168.178.22:8083/fhem?cmd=set%20Steckdose%20on”,
      “method”: “POST”,
      “json”: true,
      “body”: {“value1”: “any value”, “value2”: “another value”}
      }
      ]}

      Bis dahin vielen Dank für Deine Hilfe.

      Ich bin jetzt ein wenig verunsichert, welcher Schritt muss jetzt folgen, damit ich den Dash Button ins FHEM einbinden kann, um damit meine Steckdose (ein/aus) schalten kann.

      Danke und noch einen schönen Abend!

      Gruß
      Jörg

      • Bei diesem Artikel 3. Schritt die URL anpasssen. IP des FHEM Servers und den Namen welches Fhem-Gerät du schalten willst. In deiner config heisst es Steckdose.
        Dann die Anleitung für Fhem weiter befolgen.

    • Hallo Ben,

      ich bin glaube ich total mit der Reihenfolge der Installationen durcheinander gekommen.

      Muss ich in der Anleitung
      “http://www.benjaminroesner.com/blog/ifttt-aktionen-mit-amazon-dash-button-ausloesen/”
      auch eine “IFTTT Recipe mit IFTTT Maker Chanel” erstellen?

      Oder “springe ich gleich zu
      “http://www.benjaminroesner.com/blog/node-js-init-script-neustart-reboot-automatisch-starten-linux-raspberry-pi/”?

      Und dann zu
      “http://www.benjaminroesner.com/blog/fhem-geraete-mit-amazon-dash-button-schaltensteuern-raspberry-pi-home-automation/”

      Und wenn dem so ist, ist mein FHEM toggle so richtig?

      define DashButton1 dummy
      attr DashButton1 webCmd toggle

      define n_DashButton1 notify DashButton1.* IF (Steckdose eq “on”) (set Steckdose off) ELSE (set Steckdose on)

      Danke Dir!
      Und noch einen schönen Abend

      • Wie deine Steckdose in FHEM heisst weiss ich ja nicht, aber sonst sieht das richtig heisst.
        Die Reihenfolge ist so wie du sie im Kommentar geschrieben hast.
        Dash Button iffft, dann node.js script autostart und dann dash button fhem.

2 Pings & Trackbacks

  1. Pingback:

  2. Pingback:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.