Wie man einen benutzerdefinierten Systemd-Dienst in Linux erstellt

Systemd ermöglicht die Erstellung und Verwaltung benutzerdefinierter Dienste unter Linux. Dieser Leitfaden zeigt, wie Sie eine Diensteinheit in Ubuntu einrichten und anpassen.

Systemd ist ein leistungsstarkes und äußerst vielseitiges Init-System für Linux-Distributionen. Es kann Programme ausführen, Systemressourcen verwalten und sogar den Status Ihres Computers steuern. In diesem Artikel zeige ich Ihnen, wie Sie Systemd verwenden können, um Ihre Apps zu steuern, indem Sie eine benutzerdefinierte Diensteinheit in Ubuntu erstellen.

Was ist eine Systemd diensteinheit?

Eine Diensteinheit ist eine reguläre Datei, die Details darüber enthält, wie eine bestimmte App ausgeführt werden soll. Sie umfasst die allgemeinen Metadaten des Programms, wie es gestartet wird und ob Systemd regelmäßig darauf zugreifen kann.

Standardmäßig hat jeder Daemon auf einer Systemd-basierten Maschine eine Form von Dienstdatei. OpenSSH verwendet zum Beispiel die Einheit ssh.service in „/etc/systemd/system/“, um zu bestimmen, wie es auf Debian und Ubuntu ausgeführt wird.

Auf grundlegender Ebene besteht eine Diensteinheit aus drei Teilen: den Kategorien Unit, Service und Install. Der Unit-Abschnitt liefert die Metadaten und Abhängigkeiten der App. Der Service-Abschnitt definiert, wo die App ist und wie Systemd sie ausführt. Schließlich beschreibt der Install-Abschnitt, wann Systemd die App starten kann.

Erstellen eines systemweiten benutzerdefinierten Systemd-dienstes

Eine der häufigsten Anwendungen für einen benutzerdefinierten Dienst ist die Automatisierung von Befehlen, die Root-Rechte erfordern oder von Systemd-Timern profitieren. Ein benutzerdefinierter Dienst hilft beispielsweise sicherzustellen, dass ein Minecraft-Server nach einem Neustart ordnungsgemäß gestartet wird.

Um einen benutzerdefinierten systemweiten Dienst in Linux zu erstellen, beginnen Sie damit, die Systemd-Einheitsdatei im Home-Verzeichnis Ihres Benutzers zu erstellen:

nano ~/meine-system-app.service

Fügen Sie den folgenden Codeblock in Ihre neue Einheit ein. Dies ist die einfachste gültige Konfiguration für einen Systemd-Dienst:

[Unit] Beschreibung=Mein Erster Dienst Nach=network.target [Service] Typ=simple ExecStart=/path/to/bin Restart=always [Install] WantedBy=multi-user.target

Ersetzen Sie die Variable „Beschreibung“ durch die Details Ihres benutzerdefinierten Dienstes.

Ersetzen Sie die Variable „ExecStart“ durch den vollständigen Dateipfad des Programms, das Sie ausführen möchten.

Speichern Sie Ihre neue Datei und kopieren Sie sie in das Dienstverzeichnis Ihres Systems:

sudo cp ./meine-system-app.service /etc/systemd/system/

Führen Sie den folgenden Befehl aus, um den Systemd-Daemon neu zu starten:

sudo systemctl daemon-reload

Testen Sie Ihren neuen systemweiten Dienst, indem Sie den folgenden Befehl ausführen:

sudo systemctl start meine-system-app.service

Überprüfen Sie abschließend, ob Ihr neuer Dienst ordnungsgemäß läuft, indem Sie seinen Status in systemctl prüfen:

systemctl status meine-system-app.service

Erstellen eines benutzerdefinierten Systemd-Dienstes auf benutzer-ebene

Diensteinheiten sind nicht nur auf systemweite Apps oder Superuser beschränkt. Mit Hilfe von Systemd-User ist es möglich, rootlose Dienste zu erstellen. Dies ermöglicht es Nicht-Root-Benutzern, lokale Apps zu verwalten und gleichzeitig die Sicherheit ihres PCs zu verbessern, indem Programme mit Root-Zugriff eingeschränkt werden.

Um Ihren benutzerdefinierten Dienst auf Benutzer-Ebene in Linux zu erstellen, erstellen Sie eine neue Systemd-Einheitsdatei im Home-Verzeichnis Ihres Benutzers:

nano ~/meine-benutzer-app.service

Fügen Sie den folgenden Codeblock in Ihre neue Einheit ein:

[Unit] Beschreibung=Mein Erster Benutzerdienst Nach=graphical-session.target [Service] Typ=simple ExecStart=/path/to/bin [Install] WantedBy=default.target

Ersetzen Sie den Wert der Variable „ExecStart“ durch den Pfad des Programms, das Sie ausführen möchten. Da dies ein Dienst auf Benutzer-Ebene ist, stellen Sie sicher, dass Ihr Benutzerkonto ordnungsgemäßen Zugriff auf die Binärdatei hat.

Speichern Sie Ihre neue Dienstdatei auf Benutzer-Ebene und erstellen Sie das lokale Systemd-Verzeichnis für Ihren Benutzer:

mkdir -p ~/.config/systemd/user/

Kopieren Sie Ihre neue Dienstdatei auf Benutzer-Ebene in das lokale Systemd-Verzeichnis für Ihren Benutzer:

cp ./meine-benutzer-app.service ~/.config/systemd/user/

Stellen Sie sicher, dass Systemd Ihr Benutzerverzeichnis nach neuen Diensteinheiten überprüft:

systemctl daemon-reload --user

Überprüfen Sie abschließend, ob Ihr neuer Dienst ordnungsgemäß läuft, indem Sie seinen Status in systemctl prüfen:

systemctl --user status meine-benutzer-app.service

Gut zu wissen: Systemd ist mehr als nur ein Init-System. Erfahren Sie, wie das Schwesterprogramm Systemd-boot gegen das beliebte GRUB antritt.

Anpassen ihres benutzerdefinierten Systemd-dienstes

Eine der Kernstärken von Systemd ist, dass es Ihnen ermöglicht, vollständig anzupassen, wie Programme ausgeführt und verwaltet werden.

Hinzufügen von umgebungsvariablen zu einem benutzerdefinierten dienst

Umgebungsvariablen...

Variablen sind ein wichtiger Bestandteil jedes Linux-Systems. Sie bieten zusätzliche Daten für ein Programm, ohne die Konfigurationsdateien bearbeiten zu müssen. Mit Systemd ist es möglich, Umgebungsvariablen zu verwenden, indem man sie in die Diensteinheiten integriert.

Beginnen Sie, indem Sie den Dienst deaktivieren, den Sie ändern möchten:

systemctl --user disable --now my-user-app.service

Öffnen Sie Ihre benutzerdefinierte Dienstdatei mit Ihrem bevorzugten Texteditor:

sudo nano ~/.config/systemd/user/my-user-app.service

Scrollen Sie zum Abschnitt “[Service]” und fügen Sie die folgende Zeile direkt unter der “Type=”-Variablen hinzu:

Environment=""

Fügen Sie die Umgebungsvariable hinzu, die Sie zu Ihrem benutzerdefinierten Dienst hinzufügen möchten. In meinem Fall möchte ich eine EDITOR-Variablen hinzufügen, um sicherzustellen, dass mein Dienst meine Vim-Instanz erkennt.

Speichern Sie Ihre modifizierte Dienstdatei und laden Sie dann Ihren Systemd-Daemon neu, um Ihre Änderungen anzuwenden.

Starten Sie Ihren neuen Systemd-Dienst, um Ihre neue Umgebungsvariable zu nutzen:

systemd --user start my-user-app.service

Einschränkung des benutzerdefinierten dienstes auf einen bestimmten benutzer

Neben den benutzerspezifischen Einheitendateien können Sie auch einen Systemdienst so anpassen, dass er unter einem bestimmten Benutzer ausgeführt wird. Dies ist hilfreich, wenn Sie eine Anwendung unter einem nutzerlosen und shelllosen Benutzerkonto ausführen möchten.

Um einen Systemd-Dienst an einen Benutzer zu binden, deaktivieren Sie zunächst Ihre benutzerdefinierte Einheit vollständig.

Stellen Sie sicher, dass das Zielbenutzerkonto bereits auf Ihrem Computer existiert.

Öffnen Sie Ihre systemweite Dienstdatei mit Ihrem bevorzugten Texteditor:

sudo nano /etc/systemd/system/my-system-app.service

Scrollen Sie zum Abschnitt “[Service]” und fügen Sie die “User=”-Variable hinzu, gefolgt vom Namen Ihres Benutzerkontos.

Hinweis: Sie können auch die Gruppe für Ihren Dienst angeben, indem Sie “Group=” unterhalb der Benutzer-Variable hinzufügen.

Speichern Sie die Änderungen an Ihrer Einheitdatei und starten Sie den Dienst neu:

sudo systemctl start my-system-app.service

Bestätigen Sie, dass Ihr Dienst jetzt als Ihr Benutzer ausgeführt wird, indem Sie den folgenden Befehl ausführen:

ps -o user= -p $(systemctl show my-system-app.service -p MainPID | awk -F= '{print $2}')

Begrenzung des ressourcenverbrauchs einer diensteinheit

Zusätzlich zur Anpassung von Umgebungsvariablen und Benutzern kann Systemd den Ressourcenverbrauch einer Anwendung während ihrer Laufzeit begrenzen. Während dies nicht standardmäßig erfolgt, ist es möglich, zentrale Aspekte wie CPU-Nutzung und die Gesamtanzahl der Prozesse zu steuern.

Beginnen Sie, indem Sie den Dienst, den Sie anpassen möchten, vollständig deaktivieren.

Öffnen Sie die Diensteinheitsdatei mit Ihrem bevorzugten Texteditor:

sudo nano /etc/systemd/system/my-system-app.service

Scrollen Sie zum Abschnitt “[Service]” und fügen Sie den Variablennamen für die Ressource hinzu, die Sie begrenzen möchten. Beispielsweise ermöglicht das Hinzufügen der “MemoryHigh=” -Variable, eine weiche Speichermarke für diesen Dienst festzulegen.

Tipp: Sie können eine Liste gültiger Variablen finden, indem Sie man systemd.resource-control in einer Terminal-Sitzung ausführen.

Speichern Sie Ihre Einheitdatei und laden Sie dann Ihren Systemd-Dienst neu:

sudo systemctl enable --now my-system-app.service

Zuletzt können Sie Ihre laufenden Dienste überwachen, indem Sie systemd-cgtop ausführen.

Zu lernen, wie man benutzerdefinierte Systemd-Dienste erstellt und sie nach Bedürfnissen anpasst, ist nur der erste Schritt, um dieses äußerst vielseitige Werkzeug zu verstehen. Erforschen Sie mehr über Systemd und was sein umfassendes Ökosystem leisten kann, indem Sie überprüfen, wie Run0 im Vergleich zu Sudo abschneidet.

Häufig gestellte Fragen

Wie starte ich einen systemd-Dienst?

Um einen systemd-Dienst zu starten, befolgen Sie diese Schritte:

 

  • Öffnen Sie das Terminal: Stellen Sie sicher, dass Sie über die notwendige Berechtigung verfügen.
  • Verwenden Sie den Startbefehl: Um einen Dienst zu starten, tippen Sie den folgenden Befehl ein: sudo systemctl start .service Ersetzen Sie <name> durch den Namen des Dienstes, den Sie starten möchten.
  • Überprüfen Sie den Status: Um sicherzustellen, dass der Dienst korrekt gestartet wurde, können Sie den Status mit folgendem Befehl überprüfen: sudo systemctl status .service
  • Aktivieren (optional): Wenn Sie möchten, dass der Dienst beim Systemstart automatisch startet, verwenden Sie: sudo systemctl enable .service Damit haben Sie den Dienst erfolgreich gestartet und konfiguriert.

 

Was ist systemctl in Linux?

Systemctl ist ein leistungsstarkes Kommandozeilen-Tool für die Verwaltung von systemd, dem Standard-System

    - und Dienstmanager unter Linux. Es bietet eine Benutzeroberfläche zur Kontrolle von Systemdiensten und -einheiten. Mit systemctl können Administratoren:

  • Dienste starten, stoppen oder neustarten
  • Den Status von Diensten und Einheiten überprüfen
  • Dienste so einrichten, dass sie beim Systemstart automatisch starten
  • Logs und Protokolle für bestimmte Dienste abrufen Es ist ein zentrales Werkzeug für die Systemadministration in modernen Linux-Distributionen.

Wie funktioniert systemd?

systemd ist ein modernes Init-System für Linux, das verschiedene Funktionen zur Verwaltung von Systemdiensten und Prozessen bietet. Hier sind die wichtigsten Aspekte, wie es funktioniert:

    • -

Prozessmanagement

    : systemd wird als erster Prozess beim Booten des Systems gestartet (PID 1) und ist für das Starten und Stoppen von Diensten verantwortlich.

  • Einheiten (Units): systemd verwendet das Konzept der „Einheiten“, um Ressourcen wie Dienste, Sockets, Geräte und Mount-Punkte zu verwalten. Jede Einheit hat eine spezifische Konfigurationsdatei.
  • Abhängigkeitsmanagement: systemd analysiert Abhängigkeiten zwischen Diensten und startet sie in optimaler Reihenfolge. Dies verbessert die Bootgeschwindigkeit.
  • Paralleler Start: Es ermöglicht einen parallelen Start von Diensten, was die Systembootzeiten erheblich reduziert.
  • Zustandsüberwachung: systemd überwacht die laufenden Dienste und kann sie bei Bedarf neu starten, um sicherzustellen, dass sie stabil bleiben.
  • Logging: Es integriert sich mit dem journald, einem Logging-System, das systemd ereignisgesteuerte Protokolle zentral verwaltet und bei Bedarf abruft. Durch diese Funktionen optimiert systemd den Boot-Prozess und verbessert die allgemeine Systemverwaltung, was es zu einem essentiellen Bestandteil moderner Linux-Distributionen macht.

Warum ist systemd umstritten?

Systemd ist umstritten, weil es die folgende Kritikpunkte auf sich zieht:

    • -

Komplexität

    : Im Gegensatz zu SysVinit, das eine einfache Struktur aufweist, integriert systemd viele verschiedene Funktionen. Diese Vielzahl an Aufgaben kann zu Verwirrung und einer höheren Fehleranfälligkeit führen.

  • Verletzung der Unix-Philosophie: Kritiker argumentieren, dass systemd von der traditionelleren Unix-Philosophie abweicht, die besagt, dass ein Programm eine spezifische Aufgabe gut erledigen sollte. Systemd versucht, mehrere Aufgaben mit einer einzigen Lösung zu kopieren, was als ineffizient angesehen wird.
  • Monolithische Architektur: Systemd wird häufig als monolithisch bezeichnet, was bedeutet, dass es als großes Ganzes betrachtet wird, anstatt aus mehreren kleinen, modularen Komponenten zu bestehen. Dies macht die Wartung und Anpassung schwieriger.
  • Eingeschränkte Flexibilität: Die Entscheidungen und Standards, die mit systemd einhergehen, können die Wahlmöglichkeiten für Administratoren und Entwickler einschränken, da sie an das systemd-Framework gebunden sind.
  • Kontroversen in der Community: Die Einführung von systemd provozierte Debatten innerhalb der Linux-Community, wobei einige Benutzer die Veränderungen begrüßen und andere vehement ablehnen. Insgesamt stehen die Vorteile von systemd, wie verbesserte Verwaltung und schnellere Startzeiten, im Spannungsfeld zu den Bedenken hinsichtlich Komplexität und Philosophie.

Index
  1. Was ist eine Systemd diensteinheit?
  2. Erstellen eines systemweiten benutzerdefinierten Systemd-dienstes
  3. Erstellen eines benutzerdefinierten Systemd-Dienstes auf benutzer-ebene
  4. Anpassen ihres benutzerdefinierten Systemd-dienstes
    1. Hinzufügen von umgebungsvariablen zu einem benutzerdefinierten dienst
    2. Einschränkung des benutzerdefinierten dienstes auf einen bestimmten benutzer
    3. Begrenzung des ressourcenverbrauchs einer diensteinheit
  5. Häufig gestellte Fragen
    1. Wie starte ich einen systemd-Dienst?
    2. Was ist systemctl in Linux?
    3. Wie funktioniert systemd?
    4. Warum ist systemd umstritten?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Go up