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

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(42 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_server('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.
 +
*chmod +x  /usr/local/bin/webserver.py
  
 
=Service File=
 
=Service File=
cat /etc/systemd/system/webserver.service
+
*.service Datei anlegen
 +
*Man muss nun eine .service Datei unter /etc/systemd/system anlegen.
 +
 
 +
*cat /etc/systemd/system/webserver.service
 
<pre>
 
<pre>
 
[Unit]
 
[Unit]
Zeile 34: 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 41: Zeile 61:
 
WantedBy=multi-user.target
 
WantedBy=multi-user.target
 
</pre>
 
</pre>
 +
 +
=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=
 +
*[[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
 +
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
 +
 +
</pre>
 +
 +
=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>
 +
 +
=links=
 +
*https://www.linux-community.de/ausgaben/linuxuser/2018/07/handarbeit-2/

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