Voraussetzungen und Informationen zum Erstellen eigener Unit-Files: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(35 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 3: Zeile 3:
 
*Dieses generiert aus der Datei eine Service-Unit, die mittels systemctl verwaltet werden kann.
 
*Dieses generiert aus der Datei eine Service-Unit, die mittels systemctl verwaltet werden kann.
 
*Das Verhalten wird von journald geloggt und kann über journalctl eingesehen werden.
 
*Das Verhalten wird von journald geloggt und kann über journalctl eingesehen werden.
 +
=Lage der Unit Files=
 +
;Lokale Konfiguration
 +
/etc/systemd/system
 +
;Dynamisch erzeugte Unit Dateien
 +
/run/systemd/system
 +
;Dateien für Distributionspakete
 +
/lib/systemd/system Unit
 +
 
=Beispiel=
 
=Beispiel=
 
*Im folgenden wird anhand eines Beispiels gezeigt, wie man eine eigene Service Unit für systemd anlegt und aktiviert.
 
*Im folgenden wird anhand eines Beispiels gezeigt, wie man eine eigene Service Unit für systemd anlegt und aktiviert.
 
*Das Programm, welches ausgeführt werden soll, ist ein simpler, in Python geschriebener Webserver.
 
*Das Programm, welches ausgeführt werden soll, ist ein simpler, in Python geschriebener Webserver.
 
*Dieser machtnichts anderes, als auf localhost und Port 8000 zu lauschen und beim Zugriff "Hello World" und die aktuelle Uhrzeit auszugeben.
 
*Dieser machtnichts anderes, als auf localhost und Port 8000 zu lauschen und beim Zugriff "Hello World" und die aktuelle Uhrzeit auszugeben.
 +
 
=Python Script=
 
=Python Script=
 
*/usr/local/bin/webserver.py
 
*/usr/local/bin/webserver.py
 
<pre>
 
<pre>
#!/usr/bin/env python3
+
#!/usr/bin/python3
 
+
import os
 +
import sys
 
from wsgiref.simple_server import make_server
 
from wsgiref.simple_server import make_server
 
from datetime import datetime
 
from datetime import datetime
 
+
pid = os.getpid()
 +
print(pid)
 +
try: 
 +
  port = sys.argv[1]
 +
except:
 +
  port = 8000
 
def hello_world_app(environ, start_response):
 
def hello_world_app(environ, start_response):
 
     status = '200 OK'
 
     status = '200 OK'
Zeile 22: Zeile 37:
 
     return [text.encode('utf-8')]
 
     return [text.encode('utf-8')]
  
httpd = make_serve('0.0.0.0', 8000, hello_world_app)
+
httpd = make_server('0.0.0.0', int(port), hello_world_app)
httpd.server_forever()
+
httpd.serve_forever()            
 
</pre>
 
</pre>
 
;Diese müssen wir nun ausführbar  machen.
 
;Diese müssen wir nun ausführbar  machen.
Zeile 39: Zeile 54:
 
[Service]
 
[Service]
 
Type=simple
 
Type=simple
ExecStart=/usr/local/bin/webserver.py
+
ExecStart=/usr/local/bin/webserver.py 8000
 
ExecStartPost=/bin/echo "Server gestartet"
 
ExecStartPost=/bin/echo "Server gestartet"
 
User=www-data
 
User=www-data
Zeile 46: Zeile 61:
 
WantedBy=multi-user.target
 
WantedBy=multi-user.target
 
</pre>
 
</pre>
 +
 
=Erkärung=
 
=Erkärung=
 
*Es gibt 3 Bereiche
 
*Es gibt 3 Bereiche
 
==Unit==
 
==Unit==
 
*Diese Sektion kommt in der Regel zum Einsatz, um Metadaten für die Einheit zu definieren und die Beziehung der Unit zu anderen Einheiten zu konfigurieren.
 
*Diese Sektion kommt in der Regel zum Einsatz, um Metadaten für die Einheit zu definieren und die Beziehung der Unit zu anderen Einheiten zu konfigurieren.
===[Unit]
+
===Description===
 +
*Beschreibt den Dienst der gestartet werden soll.
 +
*Den Wert dazu dürfen Sie frei wählen
 +
*Er sollte aber den Zweck des Dienstes deutlich offenbaren.
 +
 
 +
==Service==
 +
*Die Service Sektion definierte alles rund um das Programm das gestartet werden soll.
 +
===Type===
 +
*Als Erstes definieren Sie dort den Service-Typ.
 +
*Als Standard gilt hier Type=simple, den Systemd bei Fehlen einer expliziten Angabe annimmt.
 +
*Er bedeutet, dass der fragliche Dienst nach dem Start nicht verzweigt.
 +
===ExecStart===
 +
*Programm welches gestartet werden soll.
 +
 
 +
===ExecStartPost===
 +
*Programm welches nach dem normalen Programm gestartet wird.
 +
 
 +
===User===
 +
*Die Benutzerkennung unter der der Prozess laufen soll.
 +
 
 +
==Install==
 +
===WantedBy===
 +
*Das Ziel in dem dieser Dienst gestartet werden soll-
 +
 
 +
=Handling=
 +
*[[systemctl kurz und knapp]]
 +
=Erweiterung des Service File=
 +
;Environment Datei befüllen
 +
*echo PORT=7777 >/etc/default/webserver
 +
*cat /etc/systemd/system/webserver.service
 +
<pre>
 +
[Unit]
 
Description=Simple WSGI Server
 
Description=Simple WSGI Server
 +
After=network-online.target
 +
Documentation=https://xinux.net/index.php/Voraussetzungen_und_Informationen_zum_Erstellen_eigener_Unit-Files
  
 
[Service]
 
[Service]
 
Type=simple
 
Type=simple
ExecStart=/usr/local/bin/webserver.py
+
EnvironmentFile=/etc/default/webserver
 +
ExecStart=/usr/local/bin/webserver.py $PORT
 
ExecStartPost=/bin/echo "Server gestartet"
 
ExecStartPost=/bin/echo "Server gestartet"
 
User=www-data
 
User=www-data
Zeile 61: Zeile 111:
 
[Install]
 
[Install]
 
WantedBy=multi-user.target
 
WantedBy=multi-user.target
Der Schlüssel Description beschreibt den Dienst. Den Wert dazu dürfen Sie frei wählen; er sollte aber den Zweck des Dienstes deutlich offenbaren. Der Schlüssel After enthält die Services und Targets, die dieser Dienst erwartet. Dabei sind Targets in Gruppen zusammengefasste Dienste (Abbildung 5). Dass die in unserem Fall allesamt Funktionen des Netzwerks betreffen, erklärt sich von selbst – schließlich kommen Sie ohne Netzwerk nirgendwo hin, um entfernte Laufwerke einzuhängen.
 
  
==Service==
+
</pre>
==Install==
+
 
 +
=Erklärung=
 +
;Der Dienst soll nach dem Netzwerktarget gestartet werden
 +
After=network-online.target
 +
;Dokumentationshinweis
 +
Documentation=https://xinux.net/index.php/Voraussetzungen_und_Informationen_zum_Erstellen_eigener_Unit-Files;:;
 +
;Setzen von Umgebungsvariablen
 +
EnvironmentFile=/etc/default/webserver
 +
=Ein Daemon starten=
 +
*cat /usr/local/bin/webserver-background
 +
#!/bin/bash
 +
exec /usr/local/bin/webserver.py $1 &
 +
*chmod +x /usr/local/bin/webserver-background
 +
 
 +
*cat /etc/systemd/system/webserver.service
 +
<pre>
 +
[Unit]
 +
Description=Simple WSGI Server
 +
After=network-online.target
 +
Documentation=https://xinux.net/index.php/Voraussetzungen_und_Informationen_zum_Erstellen_eigener_Unit-Files
 +
 
 +
[Service]
 +
Type=forking
 +
EnvironmentFile=/etc/default/webserver
 +
ExecStart=/usr/local/bin/webserver-background $PORT
 +
ExecStop=/bin/kill -STOP $MAINPID
 +
ExecStartPost=/bin/echo $MAINPID
 +
 
 +
[Install]
 +
WantedBy=multi-user.target
 +
 
 +
</pre>
  
=Handling=
+
=links=
;Aktivieren
+
*https://www.linux-community.de/ausgaben/linuxuser/2018/07/handarbeit-2/
*systemctl enable webserver.service
 
;Starten
 
*systemctl start webserver.service
 
;Stoppen
 
*systemctl stop webserver.service
 
;Status
 
*systemctl status webserver.service
 
;Deaktivieren
 
*systemctl disable webserver.service
 

Aktuelle Version vom 18. Januar 2023, 12:07 Uhr

Eigener Service

  • Eigene Services werden in /etc/systemd/system abgelegt, und sind einfache INI-Dateien, in denen die Anweisungen für systemd stehen.
  • Dieses generiert aus der Datei eine Service-Unit, die mittels systemctl verwaltet werden kann.
  • Das Verhalten wird von journald geloggt und kann über journalctl eingesehen werden.

Lage der Unit Files

Lokale Konfiguration
/etc/systemd/system 
Dynamisch erzeugte Unit Dateien
/run/systemd/system 
Dateien für Distributionspakete
/lib/systemd/system Unit

Beispiel

  • Im folgenden wird anhand eines Beispiels gezeigt, wie man eine eigene Service Unit für systemd anlegt und aktiviert.
  • Das Programm, welches ausgeführt werden soll, ist ein simpler, in Python geschriebener Webserver.
  • Dieser machtnichts anderes, als auf localhost und Port 8000 zu lauschen und beim Zugriff "Hello World" und die aktuelle Uhrzeit auszugeben.

Python Script

  • /usr/local/bin/webserver.py
#!/usr/bin/python3
import os
import sys
from wsgiref.simple_server import make_server
from datetime import datetime
pid = os.getpid()
print(pid)
try:  
   port = sys.argv[1]
except:
   port = 8000
def hello_world_app(environ, start_response):
    status = '200 OK'
    headers = [('Content-type', 'text/plain; charset=utf-8')]
    start_response(status, headers)
    text = 'Hello World @ {}'.format(datetime.now())
    return [text.encode('utf-8')]

httpd = make_server('0.0.0.0', int(port), hello_world_app)
httpd.serve_forever()             
Diese müssen wir nun ausführbar machen.
  • chmod +x /usr/local/bin/webserver.py

Service File

  • .service Datei anlegen
  • Man muss nun eine .service Datei unter /etc/systemd/system anlegen.
  • cat /etc/systemd/system/webserver.service
[Unit]
Description=Simple WSGI Server

[Service]
Type=simple
ExecStart=/usr/local/bin/webserver.py 8000
ExecStartPost=/bin/echo "Server gestartet"
User=www-data

[Install]
WantedBy=multi-user.target

Erkärung

  • Es gibt 3 Bereiche

Unit

  • Diese Sektion kommt in der Regel zum Einsatz, um Metadaten für die Einheit zu definieren und die Beziehung der Unit zu anderen Einheiten zu konfigurieren.

Description

  • Beschreibt den Dienst der gestartet werden soll.
  • Den Wert dazu dürfen Sie frei wählen
  • Er sollte aber den Zweck des Dienstes deutlich offenbaren.

Service

  • Die Service Sektion definierte alles rund um das Programm das gestartet werden soll.

Type

  • Als Erstes definieren Sie dort den Service-Typ.
  • Als Standard gilt hier Type=simple, den Systemd bei Fehlen einer expliziten Angabe annimmt.
  • Er bedeutet, dass der fragliche Dienst nach dem Start nicht verzweigt.

ExecStart

  • Programm welches gestartet werden soll.

ExecStartPost

  • Programm welches nach dem normalen Programm gestartet wird.

User

  • Die Benutzerkennung unter der der Prozess laufen soll.

Install

WantedBy

  • Das Ziel in dem dieser Dienst gestartet werden soll-

Handling

Erweiterung des Service File

Environment Datei befüllen
  • echo PORT=7777 >/etc/default/webserver
  • cat /etc/systemd/system/webserver.service
[Unit]
Description=Simple WSGI Server
After=network-online.target 
Documentation=https://xinux.net/index.php/Voraussetzungen_und_Informationen_zum_Erstellen_eigener_Unit-Files

[Service]
Type=simple
EnvironmentFile=/etc/default/webserver
ExecStart=/usr/local/bin/webserver.py $PORT
ExecStartPost=/bin/echo "Server gestartet"
User=www-data

[Install]
WantedBy=multi-user.target

Erklärung

Der Dienst soll nach dem Netzwerktarget gestartet werden
After=network-online.target 
Dokumentationshinweis
Documentation=https://xinux.net/index.php/Voraussetzungen_und_Informationen_zum_Erstellen_eigener_Unit-Files;:;
Setzen von Umgebungsvariablen
EnvironmentFile=/etc/default/webserver

Ein Daemon starten

  • cat /usr/local/bin/webserver-background
#!/bin/bash
exec /usr/local/bin/webserver.py $1 & 
  • chmod +x /usr/local/bin/webserver-background
  • cat /etc/systemd/system/webserver.service
[Unit]
Description=Simple WSGI Server
After=network-online.target
Documentation=https://xinux.net/index.php/Voraussetzungen_und_Informationen_zum_Erstellen_eigener_Unit-Files

[Service]
Type=forking
EnvironmentFile=/etc/default/webserver
ExecStart=/usr/local/bin/webserver-background $PORT
ExecStop=/bin/kill -STOP $MAINPID
ExecStartPost=/bin/echo $MAINPID

[Install]
WantedBy=multi-user.target

links