[geloest] Fragen zu systemd

Warum Debian und/oder eine seiner Spielarten? Was muss ich vorher wissen? Wo geht es nach der Installation weiter?
Antworten
Benutzeravatar
Draal
Beiträge: 527
Registriert: 11.03.2005 14:45:26

[geloest] Fragen zu systemd

Beitrag von Draal » 26.10.2016 23:51:50

Hallo,

ich hoffe meine Fragen sind nicht zu trivial. :?

Wenn ich es richtig verstanden habe, wurden die (SysV) Init Scripte vor einiger Zeit durch systemd abgeloest, zumindest ab stretch.
Die Dokumentationen dazu erscheinen mir ein wenig verwirrend.

Mit systemctl kann ich auch alte Init Scripte starten und beenden, den Status abfragen und sie in den Systemstart mit einbinden, wenn ich damit richtig liege.
Ich moechte nun ein Script in den Systemstart einbinden, welches wiederum 3 Startscripte ausfuehrt, die jeweils einen Minecraftserver in einer screensession starten.

Mit einem Counter Strike Server funktioniert das:

Code: Alles auswählen

user@host:/$ systemctl status hlds1
● hlds1.service - LSB: CS1 Server startscript.
   Loaded: loaded (/etc/init.d/hlds1; generated; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:systemd-sysv-generator(8)
Der hlds wird in einem screen gestartet.
  • Kann ich mein Script, welches die Server starten soll direkt mit einer *.service Datei ansprechen, oder muss dieses in einem bestimmten Verzeichnis liegen?
  • Muss ich in dem Script einen Benutzer definieren unter dem das Script ausgefuehrt wird, oder erlaubt es mir systemd diesen in der *.service Datei zu bestimmen?
  • Gibt es Moeglichkeiten, im Falle von shutdown das Script zuvor mit einem stop Befehl zu 'versorgen'?
Viele Gruesse

Draal, der hofft, dass jemand sein Kauderwelsch versteht :?


-
Zuletzt geändert von Draal am 27.10.2016 10:42:52, insgesamt 1-mal geändert.

Benutzeravatar
Draal
Beiträge: 527
Registriert: 11.03.2005 14:45:26

Re: Fragen zu systemd

Beitrag von Draal » 27.10.2016 10:42:09

Nundenn,

da hier ja supported wird, will ich hier noch schnell meine bisherigen Erkenntnisse hinterlegen. :lol: :roll:
Draal hat geschrieben:
  • Kann ich mein Script, welches die Server starten soll direkt mit einer *.service Datei ansprechen, oder muss dieses in einem bestimmten Verzeichnis liegen?
Wie es scheint ist der 'Ort' nicht von Belang. Allerdings liegt ein Verweis auf das Script bei mir auch im /bin Verzeichnis. :?
Draal hat geschrieben:
  • Muss ich in dem Script einen Benutzer definieren unter dem das Script ausgefuehrt wird, oder erlaubt es mir systemd diesen in der *.service Datei zu bestimmen?
Den Benutzer kann man in der *.service Datei bestimmen

Code: Alles auswählen

  GNU nano 2.7.0        Datei: /etc/systemd/system/mc.service

[Unit]
Description=Startet mehrere Minecraftserver

[Service]
Type=forking
ExecStart=/home/user/mc start
User=user

[Install]
WantedBy=multi-user.target
screen nach einem Reboot:

Code: Alles auswählen

user@host:~$ screen -r
There are several suitable screens on:
        1056.mc1.9      (27.10.2016 10:06:21)   (Detached)
        610.mc1.8       (27.10.2016 10:06:11)   (Detached)
        421.mc1.71      (27.10.2016 10:06:01)   (Detached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.

Code: Alles auswählen

user@host:~$ systemctl status mc
● mc.service - Startet mehrere Minecraftserver
   Loaded: loaded (/etc/systemd/system/mc.service; enabled; vendor preset: enabled)
   Active: active (running) since Do 2016-10-27 10:06:25 CEST; 32min ago
    Tasks: 67 (limit: 4915)
   CGroup: /system.slice/mc.service
           ├─ 421 SCREEN -A -m -d -S mc1.71 java -Xmx1024M -Xms1024M -jar KCauldron.jar
           ├─ 429 java -Xmx1024M -Xms1024M -jar KCauldron.jar
           ├─ 610 SCREEN -A -m -d -S mc1.8 java -Xmx1024M -Xms1024M -jar forge-1.8-11.14.1.1341-universal.jar
           ├─ 612 java -Xmx1024M -Xms1024M -jar forge-1.8-11.14.1.1341-universal.jar
           ├─1056 SCREEN -A -m -d -S mc1.9 java -Xmx1024M -Xms1024M -jar craftbukkit-1.9.jar
           └─1058 java -Xmx1024M -Xms1024M -jar craftbukkit-1.9.jar
Draal hat geschrieben:
  • Gibt es Moeglichkeiten, im Falle von shutdown das Script zuvor mit einem stop Befehl zu 'versorgen'?
Wie es scheint, geschieht so etwas, obwohl in der mc.service Datei nichts dergleichen steht. Nach dem Befehl
systemctl stop mc
vergehen jedenfalls einige Sekunden, bis die Konsole wieder 'frei' ist und die screen sessions sind fort. :?

Viele Gruesse

Draal

wanne
Moderator
Beiträge: 7462
Registriert: 24.05.2010 12:39:42

Re: [geloest] Fragen zu systemd

Beitrag von wanne » 27.10.2016 13:25:49

Draal hat geschrieben:Wie es scheint, geschieht so etwas, obwohl in der mc.service Datei nichts dergleichen steht. Nach dem Befehl
systemctl stop mc
vergehen jedenfalls einige Sekunden, bis die Konsole wieder 'frei' ist und die screen sessions sind fort. :?
Ja. Systemd macht beim stoppen halt reinen Tisch und killt alles ohne Rücksicht auf Verluste. (Und zwar nicht mit SIGTERM sondern der putzt die wirklich auch mitten im Schreibvorgang weg.)
Sinnvoller wäre eher

Code: Alles auswählen

Type=oneshot
RemainAfterExit=yes
ExecStop=exitcommand ; sleep 5
Achtung: Die Systemd parsed das ; nur wenn Leerzeich drum rum sind. Das sleep 5 ist drin weil er wenn nach dem ausführen direkt alles killt.

Defakto will Systemd aber halt eigentlich kein bash scripte mehr und deswege ist das alles rufrikelei.
Was du eigentlich haben willst ist ein service mit 3@ instanzen die je einen Minecraft server starten (verm. Typ simple. Weil Minecraft bis heute wohl nicht kapiert hat was ein Server ist, und dass sowas nicht interaktiv auf der Shell zu laufen hat.) und dann ein target dass die alle auf einmal kommen.
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
Draal
Beiträge: 527
Registriert: 11.03.2005 14:45:26

Re: [geloest] Fragen zu systemd

Beitrag von Draal » 28.10.2016 03:24:15

Hallo wanne,

vielen Dank fuer die Hinweise. Funktioniert einwandfrei. :)
wanne hat geschrieben:
Draal hat geschrieben:Defakto will Systemd aber halt eigentlich kein bash scripte mehr und deswege ist das alles rufrikelei.
Was du eigentlich haben willst ist ein service mit 3@ instanzen die je einen Minecraft server starten
Darauf laeuft es hinaus, eben die einzelnen Startscripte mit systemd auszufuehren.

Viele Gruesse

Draal

wanne
Moderator
Beiträge: 7462
Registriert: 24.05.2010 12:39:42

Re: [geloest] Fragen zu systemd

Beitrag von wanne » 28.10.2016 11:35:55

Draal hat geschrieben:Darauf laeuft es hinaus, eben die einzelnen Startscripte mit systemd auszufuehren.
Nope.
Genau das willst du eigentlich nicht. Systemd will den eigentlichen Serverprozess selbst starten.
d.h. für minecraft java(w) -jar …
Das brauchst du dann 3 mal. Dafür kannst du ein und den selben service mit mehrern konfigurationen starten (jeweils mit service@name.)
Du kannst dann ein Target einrichten, dass alle drei benötigt. Dann brauchst du nur noch das Target statt allen dreien einzeln starten.
Nur dann kann es den "echten" Status herausfinden und darauf reagieren wenn der abkratzt und bestimmen welche ausgaben in welche Logs laufen.
Dein Screen "Hack" tut damit nicht mehr so ohne weiteres. Dafür kannst du auf eine (virtuelle) tty umleiten.
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
Draal
Beiträge: 527
Registriert: 11.03.2005 14:45:26

Re: [geloest] Fragen zu systemd

Beitrag von Draal » 04.11.2016 02:32:15

Hallo wanne,

Danke fuer diese hilfreichen Hinweise. :)
ein interessantes System. :lol:
Hier vielleicht noch einige Nachtraege: Wenn ich einen 'MC Server' unter einem user laufen lasse und auf eine tty(2) umleite

Code: Alles auswählen

[Service]
ExecStart=/usr/bin/java -Xmx1024M -Xms1024M -jar /home/user/bukkit-1.7.11/KCauldron.jar >/dev/tty2
bekomme ich bei der Statusabfrage:

Code: Alles auswählen

ERROR Unable to create Appender of type RollingRandomAccessFile
.
Der Prozess wird nicht weitergefuehrt.
Wenn ich ihn so als root starte funktioniert es aber.
Ich denke, das liesse sich aber loesen. :cool:

Mein Problem ist jedoch, dass ich nicht mehr an den Prozess herankomme und den Server killen muss. Unter screen ergibt sich die Moeglichkeit mit:

Code: Alles auswählen

screen -S $SERVER -p 0 -X stuff "stop$(printf \\r)"
anzuhalten und so ein ordentliches Herunterfahren zu bewirken.

Eine Kontrolle habe ich aber mit screen nicht wirklich, denn der screen laeuft ja auch weiter, wenn der MC Server nicht mehr ordnungsgemaess funktioniert.

Das von Dir vorgeschlagene

Code: Alles auswählen

 ; sleep 5
kann man auch durch

Code: Alles auswählen

TimeoutStopSec=5s
ersetzen. Es bewirkt zwar das gleiche, aber es gibt weniger Gemaule von systemd. :?

viele Gruesse

Draal

wanne
Moderator
Beiträge: 7462
Registriert: 24.05.2010 12:39:42

Re: [geloest] Fragen zu systemd

Beitrag von wanne » 12.11.2016 18:21:36

Wie schon mehrfach erwähnt, will Systemd eigentlich, dass man alle daemons an Systemd anpasst.
Wie schon angemerkt gibt es als workaround diese Parameter.

Code: Alles auswählen

TYPath=
StandardInput=tty
Aber Minecraft hat wohl mittlerweile nachgelegt:
Hier ein fertiger Unit file.
https://teilgedanken.de/Blog/post/setti ... g-systemd/
Wichtig darin:
EnvironmentFile: Wenn du das statt unit.conf %i.conf nennst kannst du damit dann mehrere verschiedene Instanzen starten du legst dann einen file z.B. s1.conf an und kannst den Server dann mit den dort gespeicherten Variablen (Port usw.) mit systemctl start mincraf@s1 starten.
ExecStart enthällt ein noconsole, damit kannst du Minecraft ohne command-line bedienen.
ExecStop nutzt ein von Minecraft mitgebrachtes Tool zur netzwerkkommunikation.
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
Draal
Beiträge: 527
Registriert: 11.03.2005 14:45:26

Re: [geloest] Fragen zu systemd

Beitrag von Draal » 18.12.2016 15:41:23

Hallo,

zunaechst einmal vielen Dank fuer die Geduld und auch fuer die Recherche.

Es war noch einiges an "Gefummele" noetig, aber es laeuft jetzt so, wie gewuenscht.

Ich bin vielleicht spaet dran, aber hier vielleicht noch einige Anmerkungen, um jemandem, der in einer aehnlichen Situation agiert, einige Arbeit zu ersparen:

Die von wanne verlinkte Anleitung bezieht sich auf einen Spigot Server, der immer auf dem aktuellen Stand gehalten werden soll und kann eigentlich unveraendert uebernommen werden.

Die von mir angestrebte Konfiguration startet MC Versionen, die etwas aelter sind, was vor allem an den sogenannten Mods liegt, die es fuer neuere Versionen noch nicht gibt, aber von den Spielern geliebt werden.

Ich startete die Server also in einem Verzeichnis eines vorhandenen users. Ein Punkt der in der jeweiligen .service bzw. .conf Datei beachtet werden sollte:

Code: Alles auswählen

ProtectHome=true
funktioniert nicht, wenn man in dem Verzeichnis, in dem der jeweilige Daemon gestartet wird, ein symbolischer Link vorhanden ist.

Code: Alles auswählen

noconsole
wirkt ab der Minecraft Version 1.8

Da ich einen Minecraft Server der Version 1.7.10 starte setze ich, unter anderen, in die .service bzw. .conf Datei diese Anweisungen:

Code: Alles auswählen

[Service]

TTYPath=/dev/tty5
StandardInput=tty
StandardOutput=journal
ReadWriteDirectories=/home/user/bukkit-1.7.10
WorkingDirectory=/home/user/bukkit-1.7.10
ExecStart=/usr/bin/java -Xmx1024M -Xms1024M -jar KCauldron.jar
ExecStop=/home/user/mcrcon -H localhost -P 255xx -p xxxxxxxx stop
viele Gruesse

Draal

Antworten