Blynk.cc - Java-Program in Raspbian schließt bei beenden der ssh-Verbindung

Ungesund

Feiner Herr
Registriert
15 Juli 2013
Beiträge
1.851
Ort
Achterbahn
Heyho,

ich dachte ich frage erstmal hier bevor ich mich an das Hersteller-Forum wende. Folgende Situation:

Ich versuche mich an - das ist so eine IoT Platform die ich gerne für die Heimautomatisierung nutzen möchte. Ich würde gerne einen lokalen Server auf einem Raspberry pie (alt, Model B) laufen lassen.

Installiertes Image auf dem Raspberry ist von der Raspberry Seite:

RASPBIAN STRETCH LITE
Minimal image based on Debian Stretch
Version:November 2017
Release date:2017-11-29
Kernel version:4.9

Zu Blynk.cc gibt es eine , die ich, ebenso wie java selbst via putty/ssh installiert habe.

Starte ich diese Anwendung nun via

pi@raspberrypi:~ $ java -jar server-0.29.0-java8.jar -dataFolder /home/pi/Blynk

dann läuft der Server auch.

Blynk Server 0.29.1-SNAPSHOT successfully started.
All server output is stored in folder '/home/pi/logs' file.

Ich kann auf das Webinterface zugreifen und auch per App zum Server Connecten. Aber eben auch nur so lange ich das putty Fenster offen hab. Sobald ich es schließe, wird wohl auch die java app beendet, Webinterface lässt sich nicht mehr aufrufen und auch die app kann nicht connecten.

Füge ich ein "&" hinter dem ersten Befehl ein, um den Server im Hintergrund laufen zu lassen, bekomme ich im putty zwar eine ID(?) zurück, aber der Server wird nicht gestartet. (nicht aufrufbar)

Nun habe ich versucht über die cronjobs den server automatisch nach einem neustart laufen zu lassen. Dazu habe ich über crontab -e die Zeile

@reboot java -jar /home/pi/server-0.29.0.jar -dataFolder /home/pi/Blynk

Hinzugefügt. Habe das auch mal mit "&" dahinter versucht, aber das funktioniert ebenso nicht. Server wird erst gar nicht gestartet.

Nun bin ich leider ziemlicher Linux noob, mache ich irgendetwas grundlegend falsch? Ich habe noch andere raspberrys auf denen ich Dinge wie retropie, Runeaudio etc. laufen lasse, aber das waren bisher immer fertige images die ich dann nur noch configurieren musste. Nun weiß ich nicht ob ich, wenn ich eine java app unter Raspbian (via ssh) dauerhaft laufen lassen möchte, irgendwas beachten muss das für den geübten Nutzer so selbstverständlich ist dass man es nicht erwähnt?

Werde wohl auch mal im blynk Forum nachfragen, aber wollte das erstmal abchecken...
 
@Ungesund: Du brauchst dafür eigentlich nen Systemdienst. Wie man den schreibt, hab ich irgendwo im Forum mal gezeigt (für ne Firewall, wenn mich nicht alles täuscht), alternativ schreib ich dir morgen kurz was zusammen.

Grund: Beendest du deine Sitzung, meldet sich dein Benutzer ab. Der Server SOLL aber gar nicht als dein Benutzer laufen, sondern als eigenständiger Prozess in eigenem Userkontext. Ergo müsstest du dir eigentlich nen User erstellen, der exklusiv nur diesen Server startet und am Laufen hält, und dafür nutzt man Systemdienste (deren User melden sich nämlich auch nie ab).
 
welchen Vorteil bietet das starten als Systemdienst gegenüber screen?

oder anders herum: kann ich bei Systemdiensten auch wieder in den Interaktionsmodus kommen wenn der Server Zur Laufzeit so Befehle annimmt?
Bei screen can ich ja an bestimmte screens reattachen. Da man ja auch problemlos auf Benutzer wechseln kann die sich nicht anmelden können.
 
Vorteil vom starten als Dienst gegenüber Screen dürfte sein, dass im Falle eines Neustarts (übers Kabel stolpern oder so) der Server wieder automatisch läuft. Bin nicht sicher, ob das bei Screen auch der Fall wäre.
 
@alter_Bekannter: Screen startet nicht neu beim Reboot, und Screen läuft in deinem Userkontext, was potentiell ein Problem darstellt (weil damit sudo-Rechte und Zugriff auf Logs, SSH-Keys etc., die ein Systemdienst nie hat).

Nein, man kann dann nicht reatachen, aber das will man auch nicht. Üblicherweise ist die Kommandozeile auch nicht Übergabepunkt für weitere Serverkommandos, dafür gibt es eigentlich immer andere Schnittstellen (einzige mir bekannte Ausnahme: Minecraft-Server, aber auch den kann man eigentlich vollständig über den Login als Admin und Nutzung des Chatsystems steuern). Man kann (für diese speziellen Fälle) aber natürlich nen Systemdienst so einrichten, dass man ihn über screen laufen lässt, aber in nem eigenen Userkontext, in den man Loginberechtigung hat. Hab ich beim Minecraftserver so gemacht.
 
Füge ich ein "&" hinter dem ersten Befehl ein, um den Server im Hintergrund laufen zu lassen, bekomme ich im putty zwar eine ID(?) zurück, aber der Server wird nicht gestartet. (nicht aufrufbar)
Was logisch ist.

Das Beenden der SSH-Session schließt auch die Shell. Das kommt noch aus der Zeit der Modems. Das Signal heißt SIGHUP (HUP=Hang up). Beim Schließen der SSH-Verbindung wurde bildlich der Modemhörer aufgelegt. Dein Java-Programm ist ein Childprozess Deiner Shell. Schließt du die Shell, beendest du damit auch die Kindprozesse.

Hinzugefügt. Habe das auch mal mit "&" dahinter versucht, aber das funktioniert ebenso nicht. Server wird erst gar nicht gestartet.
Was auch wiederum logisch ist. Du müsstest Dein Java-Programm "dämonisieren", d.h. dass es eigenständig im Hintergrund läuft.

Deine Möglichkeiten:
1. Nohup

Damit wird das o.g. HUP-Signal ignoriert. Der damit gestartete Prozess wird von der Shell gelöst. Beim Beenden der SSH-Verbindung wird die Shell geschlossen. Der mit nohup gestartete Prozess läuft aber unabhängig davon weiter.

2. Screen /Tmux


Machen beides dasselbe.

Sowohl Tmux als auch Screen sind Windowmanager, d.h. grafische Oberflächen - allerdings ohne Grafik. Alles, was darin gestartet wird, läuft auch weiter, wenn die SSH-Verbindung getrennt wird, da die Ausgabe von Tmux/Screen halt einfach nur die Ausgabe und nicht die Shell selbst ist.

Screen oder Tmux solltest du dann verwenden, wenn du interaktiv irgendwelche Menüs über die Konsole bedienen kannst und willst.

Nachteil: Ist Screen/Tmux weg, ist auch Dein Prozess weg. Damit ist ein automatischer Restart des Prozesses beim Rechnerreboot ausgeschlossen.

3. Dienst
Das ist der sauberste Weg. Das Programm wird sauber als Daemon gestartet und läuft als Serverprozess. Irgendwelche Eingaben kannst du da interaktiv natürlich nicht vornehmen.
 

Nicht nur der Minecraft Server, bei Gameservern ist das bedauerlich oft der Fall. Die werden scheinbar oft für Windows Remotedesktop Admins entwickelt.

Welchen Setup würdest du konkret für solche Sachen empfehlen?
 
@alter_Bekannter:

1. Erstell dir nen User, nenne ihn nach dem Service. Kann ein normaler User mit Home-Verzeichnis sein, sinnvollerweise wäre sein Home aber zum Beispiel /srv/DIENSTNAME
2. Richte den Service so ein, dass er direkt von dem User aus startet. Alle Skripte/Konfigurationsdateien/Binaries gehören Root und sind auch nur durch Root schreibbar.
3. Schreibe einen Systemd-Dienst, der das Startscript ausführt, das die Screen-Session startet. Der Systemd-Dienst muss so eingerichtet sein, dass er als Running zählt, selbst wenn das Script beendet ist (weil Screen dann noch läuft)
4. Richte den Systemd-Dienst so ein, dass er nach dem Boot startet, bzw. dann, wann er halt starten kann (wahrscheinlich nach mount, networking und evtl. firewall)
5. Richte dir einen SSH-Login auf den User ein, der den Service hostet. Dann kannst du fleißig screen nutzen, um direkt untendrin mit dem Server zu reden.
 
  • Thread Starter Thread Starter
  • #9
Schon mal danke für die gut nachvollziehbare Erklärung, das macht das Verhalten ja logisch.

Nun zu dem starten als Dienst: Metal_Warrior, wie mache ich das? Ich habe die Threads hier im Linux-Forum mal nach "Dienst" und "Firewall" durchsucht, aber bin mir unschlüssig welchen Thread du meinst, in dem du das mal erklärt hast. Habe das auch mal gegoogelt, habe auch gefunden, aber wenn man so gut wie keine Befehle kennt ist das unglaublich frustrierend, weil man einfach zu wenig weiß um was anpassen zu können...

Wenn du da evtl. ne Anleitung oder ähnliches weißt die man als non-linux Mensch versteht wäre das prächtig.
 
Zurück
Oben