Wir entwickeln auf Basis von Mojolicious eine Webanwendung NAME
und möchten, dass diese
- in ihrer vorgegebenen Entwicklungsumgebung abläuft
- beim Booten automatisch gestartet wird
- permanent läuft
- sich bei Codeänderungen automatisch neu lädt
- fürs Debugging eine eigene Logdatei schreibt
- interaktiv gestoppt und gestartet werden kann
- wenn nicht benötigt, auf unbestimmte Zeit deaktiviert werden kann
Diese Anforderungen lassen sich leicht mit morbo als Webserver
in Kombination mit der Prozesssteuerung systemd
realisieren. Hierbei ist morbo der Entwicklungs-Webserver von
Mojolicious und systemd die fundamentale Prozesssteuerung vieler
Linux-Systeme (ein moderner Ersatz für init). Ein zusätzlicher
Webserver wie nginx oder apache wird nicht benötigt.
Die Unit-Datei NAME.service, mit der wir den Service gegenüber systemd
definieren, ist recht einfach (Erläuterungen zur einzig
interessanten Zeile ExecStart siehe im Folgenden):
[Unit]
Description=DESCRIPTION
After=network.target
[Service]
Type=simple
User=USER
ExecStart=bash -lc "morbo PROGRAM --listen http://*:PORT --watch SOURCEDIR --verbose >LOGFILE.log 2>&1"
[Install]
WantedBy=multi-user.target
Hierbei ist:
- DESCRIPTION
-
Eine kurze, einzeilige Beschreibung des Service.
- USER
-
Der Name des Unix-Users, unter dessen Rechten der Prozess ausgeführt wird,
denn wir möchten, dass der Prozess im Kontext eines bestimmten Users
läuft. Wenn nicht angegeben, ist root der User.
- PROGRAM
-
Pfad/Name des Programms, das die Webanwendung ausführt. Wir rufen die
Anwendung nicht direkt auf, sondern via bash -lc "...", damit sie
in der Umgebung des Users USER läuft.
- PORT
-
Port, auf dem die Anwendung läuft. Wegen * ist sie auf allen Interfaces
erreichbar, d.h. sie ist zugreifbar via localhost:PORT oder
HOSTNAME:PORT.
- SOURCEDIR
-
Wurzelverzeichnis, im dem sich die Quellen der Anwendung befinden.
Dieses Verzeichnis überwacht morbo in Bezug auf Änderungen.
Verteilen sich die Quellen über mehrere Verzeichnisse, kann die
Option --watch mehrfach angegeben werden.
- LOGFILE
-
Pfad/Name der Logdatei, in die der Webserver (morbo) die Zugriffe
und Fehlermeldungen protokolliert. Die Logdatei wird beim Booten
neu begonnen, womit auf einfache Weise vermieden wird, dass sie unbegrenzt
wächst, historische Information wird in der Entwicklungsumgebung ja
nicht benötigt.
Die systemd Unit-Datei kopieren wir in das Verzeichnis /etc/systemd/system.
Mit folgender Kommandofolge machen wir die Anwendung dauerhaft und
sofort verfügbar:
# systemctl daemon-reload # Konfigurationsänderung systemd bekannt machen
# systemctl enable NAME # Service aktivieren, so dass die Anwendung beim Booten gestartet wird
# systemctl start NAME # Service sofort verfügbar machen (ohne Rebooten zu müssen)
Den Status überprüfen wir mit:
Die Anwendung kann jederzeit gestoppt und gestartet werden mit:
# systemctl stop NAME
# systemctl start NAME
Der automatische Start beim Booten lässt sich ab- und anschalten mit:
# systemctl disable NAME
# systemctl enable NAME
Die Liste aller vorhandenen Unit-Files und ihres jeweiligen Status:
# systemctl list-unit-files
Vorschlag für eine Verzeichnisstruktur im Homeverzeichnis von USER:
~/etc/systemd/NAME.service # Unit-Datei, per Symlink referenziert von /etc/systemd/system aus, Qwner ist USER
~/var/log/NAME.log # Logdatei
~/opt/NAME/... # Projektverzeichnis
Die konkrete Kommandozeile zum Starten der Anwendung lautet dann:
morbo ~/opt/NAME/bin/PROGRAM --listen http://*:PORT --watch ~/opt/NAME --verbose >~/var/log/NAME.log 2>&1
nohup
nohup morbo ~/opt/NAME/bin/PROGRAM --listen http://*:PORT --watch ~/opt/NAME --verbose >~/var/log/NAME.log 2>&1 &
Links