In Debian gibt es seit einigen Jahren für die Diensteverwaltung systemctl oder systemd. Das Kommandozeilentool systemctl gibt dir dabei die Möglichkeit einen Dienst einzurichten bzw. zu starten, stoppen, bei Konfigurations-änderungen zu reloaden oder zu restarten. Ausserdem kannst die dir auch jederzeit mit status den Zustand deines Dienstes anschauen. Auch systemctl greift dabei auf einen Dienst zu, das ist der Dienst systemd(Daemon). In diesem Howto will ich zeigen, wie du einen eigenen Dienst mit systemctl in einem Debian System einrichtest.

Die Umgebung

Ich führe das ganze Howto auf einem Armbian durch, also ein Debian das für den ARM Prozessor A20 von AllwinnerTech ausgerichtet ist. Es ist ganz genau ein Cubietruck 3, also ein Einplatinencomputer. Das Armbian basiert auf ein Debian 8.

Der Dienst

Mein Dienst besteht aus einen Java Programm mit dem schönen sprechenden Namen MultiUserChatServer.jar. Das Programm zeigt auf einfache Weise wie einfach man mit Java Netzwerverbindungen erstellen kannst. Die Java Programmierung steht hier aber nicht auf dem Plan. Der Dienst

Der Client

Um meinen Dienst nach dem einrichten zu testen, existiert auch noch ein Client mit dem Namen MultiUserNetworkClient.jar.

Die Vorbereitung

Das es sich bei meinen Diensten um ein Java Programm handelt, muss ein Java auf dem Zielsystem eingerichtet sein. Mein MultiUserChatServer ist mit dem JDK 8 compiliert worden. Das bedeutet, das auf meinem Zielsystem auch ein Java 8 installiert sein muss. Mit apt installiert man das benötigt Java wie hier:

sudo apt install openjdk-8-jre

Nach der erfolgreichen Installation, benötige ich ein Heimatverzeichniss. Grundsätzlich handhabe ich das so , das ich eigene Programme im Linuxsystem immer unter /opt ablege. Dort erstelle ich mir ein Verzeichniss in das ich meine MultiUserChatServer.jar ablege. Ich nenne das Verzeichniss chatserver.

mkdir /opt/chatserver

Nachdem ich die Datei MultiUserChatServer.jar dorthin kopiert habe, benötige ich noch einen User der sämtlich berechtigungen für das ausführen der MultiChatServer „funktionen“ hat. Dafür lege ich mir ersteinmal eine Gruppe appmanager an:

sudo groupadd -r appmanager

und einen User chatserveruser:

sudo useradd -r -s /bin/false -g appmanager chatserveruser

der parameter -r erstellt einen Systemuser, also einen User der sich nicht einloggen kann, -s sorgt dafür das er keine Shell bekommt (/bin/false). Die Gruppe sollte klar sein und dann der eigentliche Username. Ich schau mir nochmals das Produkt meiner Arbeit an, dabei Sieht man folgendes:

id chatserveruser
uid=998(chatserveruser) gid=997(appmanager) groups=997(appmanager)

mein User benötigt noch rechte auf dem /opt/chatserver Verzeichniss:

sudo chown -R jvmapps:appmgr /opt/chatserver

Die Usereinrichtung ist fertig.

Erstellen der systemd Servicedatei

mit dem Befehl:

 sudo nano /etc/systemd/system/multichat.service

erstelle ich mir eine Textdatei im mitgegebene Verzeichniss /etc/systemd/system. Dort trage ich folgende Infos ein:

[Unit]
Description=Java MultiChatServer


[Service]
WorkingDirectory=/opt/chatserver
ExecStart=/usr/lib/jvm/java-8-openjdk-armhf/bin/java -jar /opt/chatserver/MultiUserChatServer.jar
User=chatserveruser
Type=simple
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

Die oben aufgeführten Einstellungen habe ich auf dieser Kurzübersicht nochmals zusammengefasst und erklärt. Nachdem ich die oben dargestellt Datei abgespeichert habe, benötigt mein systemd ein reload:

sudo systemctl daemon-reload

Nun kann ich den Dienst starten mit:

sudo systemctl start multichat.service

Mit dem Befehl:

systemctl status multichat

Aus dem o.g. Befehl erfolgt folgende Ausgabe:

root@aquatruck:/# systemctl status multichat
● multichat.service - Java MultiChatServer
   Loaded: loaded (/etc/systemd/system/multichat.service; enabled)
   Active: active (running) since Thu 2020-07-02 07:05:22 CEST; 8s ago
 Main PID: 21008 (java)
   CGroup: /system.slice/multichat.service
           └─21008 /usr/lib/jvm/java-8-openjdk-armhf/bin/java -jar /opt/prod/MultiUserChatServer.jar

Jul 02 07:05:22 aquatruck systemd[1]: Started Java MultiChatServer.
Jul 02 07:05:23 aquatruck java[21008]: Server horcht......

Also mein Server horcht und wartet nun auf den Test.

Der Test

Beim testen sollte natürlich klar sein was das oben eingerichtet Programm macht. In der Einleitung hatte ich bereits grob beschrieben worum es bei dem MultiUserChatServer geht. Der Server horcht, ganz genau auf dem Port 4445, und wartet auf eine Anfrage auf einem Client. Wenn ich nun den Client starte, an der Kommandozeile werde ich aufgefordert etwas zum Server zu senden. Danach schaue ich mir den Status an, dort sollte das eingegebene auftauchen. Ich start den Client mit:

franz@aquatruck:~$ java -jar MultiUserNetworkClient.jar
Client Address : aquatruck/192.168.178.113
Geben Sie ihre Nachricht ein und betätigen Sie ENTER ( Enter QUIT für beenden):

Und gebe dort die Nachricht systemd ist cool ein.

franz@aquatruck:~$ java -jar MultiUserNetworkClient.jar
Client Address : aquatruck/192.168.178.113
Geben Sie ihre Nachricht ein und betätigen Sie ENTER ( Enter QUIT für beenden):
systemd ist cool
Server Antwort : systemd ist cool 2020-07-02T07:07:20.680

Der Server Antwortet mit dem Inhalt der Nachricht und der Uhrzeit. In dem Status meines Services erscheint nach absenden des Befehls:

sudo systemctl status multichat

Die Ausgabe:

root@aquatruck:/# systemctl status multichat
● multichat.service - Java MultiChatServer
   Loaded: loaded (/etc/systemd/system/multichat.service; enabled)
   Active: active (running) since Thu 2020-07-02 07:05:22 CEST; 6min ago
 Main PID: 21008 (java)
   CGroup: /system.slice/multichat.service
           └─21008 /usr/lib/jvm/java-8-openjdk-armhf/bin/java -jar /opt/prod/MultiUserChatServer.jar

Jul 02 07:05:22 aquatruck systemd[1]: Started Java MultiChatServer.
Jul 02 07:05:23 aquatruck java[21008]: Server horcht......
Jul 02 07:06:14 aquatruck java[21008]: Verbindung zum clint aufgebaut
Jul 02 07:07:20 aquatruck java[21008]: Response to Client  :  systemd ist cool 2020-07-02T07:07:20.680

Der Test war also erfolgreich.

Zusammenfassung

  1. Servicevorbereitungen bestehend aus:
    • Welcher User ist Verantwortlich
    • Welche Zugriffsrechte benötigt der User
    • Welche Umgebungsbedingungen benötigt mein Dienst
  2. Erstellen der Service Datei unter /etc/systemd/system/
    • Die unter Punkt 1 gewonnen Erkenntnisse wandern in diese Datei. Das abspeichern der Datei nicht vergessen.
  3. Dienste reloaden mit sudo systemctl daemon-reload
  4. Testen
    • Falls die Tests nicht erfolgreich sind, das Gesamtkunstwerk nochmals überprüfen.

Damit Ihr das ganze auch ausprobieren könnt, habe ich die beiden Dateien für den Chat auch als Download hier.

Kategorien: AllgemeinJava

0 Kommentare

Schreibe einen Kommentar

Avatar-Platzhalter

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese  Website nutzt Cookys. Wenn Du Sie nicht haben willst, klicke hier. Hier klicken um dich auszutragen.