Voraussetzungen und Informationen zum Erstellen eigener Unit-Files: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
(→Type) |
|||
| (29 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/ | + | #!/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 = | + | httpd = make_server('0.0.0.0', int(port), hello_world_app) |
| − | httpd. | + | 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 | ||
| Zeile 62: | Zeile 78: | ||
*Er bedeutet, dass der fragliche Dienst nach dem Start nicht verzweigt. | *Er bedeutet, dass der fragliche Dienst nach dem Start nicht verzweigt. | ||
===ExecStart=== | ===ExecStart=== | ||
| − | === | + | *Programm welches gestartet werden soll. |
| + | |||
| + | ===ExecStartPost=== | ||
| + | *Programm welches nach dem normalen Programm gestartet wird. | ||
| + | |||
===User=== | ===User=== | ||
| + | *Die Benutzerkennung unter der der Prozess laufen soll. | ||
==Install== | ==Install== | ||
| + | ===WantedBy=== | ||
| + | *Das Ziel in dem dieser Dienst gestartet werden soll- | ||
=Handling= | =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