Service, Daemon, Startup ... Was ist der richtige Weg?

368
poor_red_neck

Ich glaube, ich habe ein Teil-Terminologieproblem, ein Teil nur ein einfaches Newb-Problem und ein Teil des Leseproblems.

Ich habe es bei meinem Energiemonitor-Projekt zu Hause so weit gebracht, dass ich mein SDR-Radio zum Laufen gebracht habe, die Daten entschlüsselt, Json zu InfluxDB schiebe, Grafana betreibe und Grafiken bekomme! Während des Googlings habe ich weniger als 2 Monate Erfahrung mit Linux (nur mit Raspberry Pi / OrangePi spielend).

Mein OrangePi läuft mit Armbian Ubuntu 16.04

Ich brauche einen sehr einfachen "Befehl", um ihn beim Booten auszuführen. Es läuft die ganze Zeit im Hintergrund. Ich denke, das macht es zu einem Dämon? Der Befehl lautet

/home/jonboy545/GoCode/bin/rtlamr -filterid=62059972 -format=json -msgtype=idm unique=true | rtlamr-collect 

Das ist es. Ich habe ein einfaches Skript namens log_energy.sh erstellt und ausführbar gemacht. Es ist nur:

#!/bin/bashr /home/jonboy545/GoCode/bin/rtlamr -filterid=62059972 -format=json -msgtype=idm unique=true | rtlamr-collect; 

Wenn ich in ein Terminalfenster ./log_energy.sh eingebe, funktioniert alles großartig. Ich muss eine SCREEN-Instanz öffnen, damit ich sie trennen kann, damit ich das Terminal nicht offen lassen muss. Offensichtlich ist dies nicht die beste Lösung.

Mache ich das also in rc.local? Ich hatte einige Probleme, ich glaube, es wird zu früh ausgeführt, also habe ich versucht, einen Schlaf zu machen, aber es war immer noch sporadisch. Manchmal hat es funktioniert, manchmal nicht. Also habe ich darüber nachgedacht, Crontab zu benutzen und es einfach @reboot ausführen zu lassen. Wieder wahrscheinlich nicht die beste Lösung. Es gibt auch Umgebungsvariablen, die deklariert werden müssen und in ~ / .profile festgelegt sind (ich denke, sie könnten irgendwo hingehen), und ich bin nicht sicher, dass Crontab diese Umgebungsvariablen "liest". Zumindest habe ich das gelesen.

Was ist also die "richtige" Möglichkeit, dieses Skript beim Booten ausführen zu lassen (vielleicht am Ende, wenn sich alles "beruhigt" hat)?

Letztendlich möchte ich es als "Dienst" namens "Energylog" haben, damit ich einen Sudo-Dienst starten kann, Energylog Start / Stop / Restart.

Ich habe mir /etc/init.d/skeleton sowie einige bereits vorhandene Dateien in /etc/init.d angesehen, bin mir aber nicht sicher, was ich mir anschaue.

Kann mich jemand in die richtige Richtung lenken?

Danke vielmals!

-1

1 Antwort auf die Frage

3
Journeyman Geek

Ich denke, ein Teil des Problems ist, dass es einige Möglichkeiten gibt, eine Anwendung beim Start auszuführen.

Ein Daemon ist so etwas wie die alten DOS-TSRs - es ist eine Anwendung, die gestartet wird und im Hintergrund ausgeführt wird.

Die "klassischen" Möglichkeiten, dies mit einem Init-Skript zu tun (das ist in der Regel etwas kompliziert zu schreiben) - aber diese wurden etwas veraltet oder Crontab - was buchstäblich nur dazu gedacht ist, bestimmte Aufgaben gleichzeitig auszuführen.

Der Dienstbefehl bezieht sich auf upstart, der die Ausführung der Init-Skripte ausführt, aber mit 16.04 durch systemd ersetzt. Es wird für systemd für Leute verwendet, die von upstart wechseln, aber es lohnt sich, "service" durch "systemctl" zu ersetzen - was dasselbe tut und mehr.

Schreiben Sie Ihr Skript für systemd.

Warum? Es wird unterstützt und wird auf lange Sicht sein. Es hat eine ziemlich sinnvolle Syntax. Die Dokumentation ist auch ziemlich anständig.

Es gibt auch Umgebungsvariablen, die deklariert werden müssen und in ~ / .profile festgelegt sind (ich denke, sie könnten irgendwo hingehen), und ich bin nicht sicher, dass Crontab diese Umgebungsvariablen "liest". Zumindest habe ich das gelesen.

Wie in den systemd docs (und zum weiteren Lesen - diese AU-Frage und die Dokumentation von Ubuntu )

Sie können eine Zeile mit den Umgebungsvariablen mit einer Zeile wie hinzufügen

Umgebung = "EINS = Eins" 'ZWEI = Zwei Zwei'

Sie können es auch als bestimmter Benutzer oder zu einem bestimmten Zeitpunkt starten. Sie können es sogar trivial neu starten