So führen Sie ein Linux-Programm beim Start mit systemd aus

Veröffentlicht: 2022-01-29
Ein stilisiertes Terminalfenster auf einem Laptop.
Fatmawati Achmad Zaenuri/Shutterstock

Müssen Sie beim Booten ein Linux-Programm starten? Die systemd-Software bietet eine Möglichkeit, dies auf jeder Linux-Distribution mit systemd zu tun – was heutzutage die meisten davon sind, einschließlich Ubuntu. Wir führen Sie durch den Prozess der Erstellung eines integrierten Dienstes – und er kommuniziert sogar mit dem Journal.

Dieses Tutorial zeigt, wie Sie einen Systemdienst einrichten, der gestartet wird, wenn Sie Ihr System starten. Um ein grafisches Programm bei der Anmeldung zu starten, verwenden Sie stattdessen den Startmanager Ihres Desktops.

Ausführen von Programmen beim Start

Manchmal hängt sich die Software, die Sie auf Ihrem Computer installieren, in den Linux-Startvorgang ein, sodass das Programm bei jedem Start des Computers automatisch gestartet wird. Sie können dasselbe Verhalten leicht mit Ihren eigenen Programmen und Skripten oder mit jedem anderen Programm auf Ihrem Computer erreichen.

Die Programme, die beim Start gestartet werden, werden von systemd , dem System- und Dienstmanager, gesteuert. systemd ist der erste Prozess, der beim Start ausgeführt wird. Er hat immer die Prozess-ID (PID) 1. Jeder andere Prozess, der auf Ihrem Computer läuft, wird von systemd oder von einem Prozess gestartet, den systemd bereits gestartet hat.

Programme, die im Hintergrund laufen, werden Daemons oder Dienste genannt. Das „d“ am Ende von systemd steht für Daemon. In diesem Artikel erstellen wir einen Beispieldienst. Um alle Kästchen anzukreuzen, muss unser Service sein:

  • Über eine Service-Unit-Datei in systemd integriert
  • Beim Start gestartet
  • Steuerbar mit systemctl , der Steuerschnittstelle für systemd
  • Kann in das Tagebuch schreiben

Erstellen des Serviceprogramms

Wir brauchen ein Programm, das systemd startet. Wir erstellen ein einfaches Skript namens „htg.sh“. Dieses Tutorial verwendet den Gedit-Texteditor, aber Sie können jeden beliebigen Texteditor verwenden.

 berühre htg.sh
 gedit htg.sh 

Anzeige

Der gedit Editor wird geöffnet. Kopieren Sie den folgenden Text und fügen Sie ihn in den Editor ein.

 #!/bin/bash

echo "htg.service: ## Beginnt mit ##" | systemd-cat -p info

während :
tun
TIMESTAMP=$(Datum '+%Y-%m-%d %H:%M:%S')
echo "htg.service: Zeitstempel ${TIMESTAMP}" | systemd-cat -p info
schlafen 60
fertig

Speichern Sie Ihre Änderungen und schließen Sie den Editor.

htg.sh-Skript im Gedit-Editor

Das Skript macht nicht viel, aber es gibt ein paar erwähnenswerte Punkte.

  • Die beiden echo -Zeilen werden durch systemd-cat geleitet, ein Programm, das die Ausgabe eines Programms entgegennimmt und an das Journal sendet. Einträge in das Journal werden vorrangig behandelt. Wir verwenden die Option -p (Priorität), um anzuzeigen, dass unsere Nachrichten nur zur Information (Info) dienen. Sie sind keine wichtigen Fehler oder Warnungen.
  • Es gibt eine endlose while -Schleife.
  • Die TIMESTAMP Variable wird auf das aktuelle Datum und die aktuelle Uhrzeit gesetzt. Dies wird in eine Nachricht formatiert und an das Journal gesendet.
  • Das Skript schläft dann für 60 Sekunden.
  • Nach 60 Sekunden wird die Schleife wiederholt. Dieses Skript schreibt also einmal pro Minute eine Nachricht mit Zeitstempel in das Journal.

Wir kopieren das Skript in das Verzeichnis /usr/local/bin .

 sudo cp htg.sh /usr/local/bin 

Und wir müssen es ausführbar machen:

 sudo chmod +x /usr/local/bin/htg.sh 

Erstellen der Service-Unit-Datei

Jedes Programm, das von systemd gestartet wird, hat eine Definitionsdatei, die Service-Unit-Datei genannt wird. Dies enthält bestimmte Attribute, die systemd verwenden kann, um das Programm zu lokalisieren und zu starten und einige seiner Verhaltensweisen zu definieren.

Wir müssen eine Unit-Datei für unseren neuen Dienst erstellen, aber es ist ratsam, sicherzustellen, dass keine der vorhandenen Unit-Dateien den Namen hat, den wir unserem neuen Dienst geben möchten.

 sudo systemctl list-unit-files --type-service 

Sie können durch die Liste der Unit-Dateien scrollen, die alphabetisch sortiert ist, und überprüfen, ob der Name, den Sie verwenden möchten, nicht vergeben ist.

Anzeige

Unser Service wird „htg.service“ heißen. Keine Unit-Dateien haben diesen Namen, also können wir fortfahren und unsere Unit-Datei erstellen.

 sudo gedit /etc/systemd/system/htg.service 

Der gedit Editor wird geöffnet. Kopieren Sie den folgenden Text und fügen Sie ihn in den Editor ein:

 [Einheit]
Description=How-To Geek Service Beispiel

Wants=network.target
After=syslog.target network-online.target

[Service]
Typ=einfach
ExecStart=/usr/local/bin/htg.sh
Neustart=bei Fehler
RestartSec=10
KillMode=Prozess

[Installieren]
WantedBy=multi-user.target

Speichern Sie Ihre Änderungen und schließen Sie den Editor.

htg.service Unit-Datei im Gedit-Editor

Die Einträge haben diese Bedeutungen. Dies sind typische Einträge. Unser einfacher Service benötigt die meisten davon eigentlich nicht, aber wenn wir sie einbeziehen, können wir sie erklären.

  • Beschreibung: Dies ist eine Textbeschreibung Ihres Dienstes.
  • Will: Unser Dienst möchte – aber erfordert nicht – dass das Netzwerk aktiv ist, bevor unser Dienst gestartet wird.
  • After: Eine Liste von Unit-Namen, die gestartet werden sollten, nachdem dieser Dienst erfolgreich gestartet wurde, falls sie nicht bereits laufen.
  • Typ: Einfach. systemd betrachtet diesen Dienst als gestartet, sobald der von ExecStart angegebene Prozess gegabelt wurde.
  • ExecStart: Der Pfad zu dem Prozess, der gestartet werden soll.
  • Neustart: Wann und ob der Dienst neu gestartet werden soll. Wir haben es auf „on-failure“ gesetzt.
  • RestartSec: Wie lange gewartet werden soll, bevor versucht wird, den Dienst neu zu starten. Dieser Wert wird in Sekunden angegeben.
  • KillMode: Definiert, wie systemd den Prozess beenden soll, wenn wir systemctl , den Dienst zu stoppen. Wir haben diese Einstellung auf „Verarbeiten“ gesetzt. Dies bewirkt, dass systemd das SIGTERM -Signal nur für den Hauptprozess verwendet. Wenn unser Dienst ein nicht triviales Programm anstelle eines einfachen Skripts wäre, würden wir dies auf „gemischt“ setzen, um sicherzustellen, dass alle erzeugten Prozesse ebenfalls beendet werden.
  • WantedBy: Wir haben diesen Wert auf „multi-user.target“ gesetzt, was bedeutet, dass der Dienst gestartet werden sollte, solange sich das System in einem Zustand befindet, in dem sich mehrere Benutzer anmelden können, unabhängig davon, ob eine grafische Benutzeroberfläche verfügbar ist oder nicht.

Die Unit-Datei muss nicht ausführbar sein, aber die Berechtigungen für die Unit-Datei sollten einschränken, wer sie bearbeiten kann. Sie möchten nicht, dass ein böswilliger oder schelmischer Benutzer die Unit-Datei ändert, sodass sie ein ganz anderes Programm ausführt.

Dieser Befehl erteilt dem Eigentümer Lese- und Schreibberechtigungen sowie Leseberechtigungen für die Gruppe. Andere haben keine Berechtigungen.

 sudo chmod 640 /etc/systemd/system/htg.service 

Wir können systemctl die Syntax unserer Unit-Datei für uns überprüfen lassen, auch wenn der Dienst noch nicht läuft. Etwaige Fehler werden gemeldet. (Eigentlich ist der Teil „.service“ für die meisten Befehle optional.)

 systemctl-Status htg.service 

Anzeige

Es werden keine Fehler hervorgehoben, was bedeutet, dass unsere Unit-Datei syntaktisch korrekt ist.

Starten des Dienstes

Wenn Sie eine neue Unit-Datei hinzufügen oder eine vorhandene bearbeiten, müssen Sie systemd anweisen, die Unit-Dateidefinitionen neu zu laden.

 sudo systemctl daemon-reload

Wenn Sie möchten, dass ein Dienst beim Start gestartet wird, müssen Sie ihn aktivieren :

 sudo systemctl enable htg

Das Aktivieren eines Dienstes startet ihn nicht, sondern legt ihn nur so fest, dass er beim Booten gestartet wird. Um den Dienst jetzt zu starten, müssen Sie systemctl mit der start verwenden.

 sudo systemctl start htg 

Überprüfung des Dienstes

Nach dem manuellen Starten des Dienstes oder nach dem Neustart des Computers können wir überprüfen, ob unser Dienst ordnungsgemäß ausgeführt wird.

 sudo systemctl status htg.service 

Der Status des Dienstes wird uns angezeigt.

Status von htg.service in einem Terminalfenster

  • Der grüne Punkt bedeutet, dass unser Service reibungslos läuft.
  • Der Name des Dienstes ist „htg.service“, und die lange Beschreibung ist diejenige, die wir in der Unit-Datei bereitgestellt haben.
  • Uns wird angezeigt, welche Unit-Datei geladen wurde „/etc/systemd/system/htg.service“.
  • Der Dienst ist aktiv und die Zeit, zu der der Dienst gestartet wurde, wird für uns aufgelistet.
  • Seine PID ist 7762.
  • Dem Dienst sind zwei Aufgaben zugeordnet.
  • Insgesamt werden 928 Kibibyte Speicher vom Dienst verwendet.
  • Die Kontrollgruppe umfasst das „htg.sh“-Skript und den sleep -Befehl, der von „htg.sh“ gestartet wurde. Meistens erledigt der sleep -Befehl die Arbeit für diesen Dienst.

Außerdem werden uns die letzten 10 Journaleinträge angezeigt, die von diesem Dienst erstellt wurden. Es überrascht nicht, dass sie alle eine Minute voneinander entfernt sind.

Anhalten und Deaktivieren des Dienstes

Wenn Sie den Dienst stoppen müssen, können Sie dies mit diesem Befehl tun:

 sudo systemctl stop htg.service 

Anzeige

Dadurch wird der Dienst beendet, aber es verhindert nicht, dass er beim nächsten Neustart des Computers neu gestartet wird. Um zu verhindern, dass der Dienst beim Start gestartet wird, müssen Sie ihn deaktivieren :

 sudo systemctl deaktiviert htg.service 

Wenn der Dienst ausgeführt wird, stoppt dieser Befehl ihn nicht. Es weist systemd einfach an, den Dienst beim nächsten Neustart nicht zu starten.

Wenn Sie den Dienst stoppen und verhindern möchten, dass er beim Start gestartet wird, verwenden Sie beide Befehle.

Service-Tipp

Stellen Sie sicher, dass Ihr Programm wie erwartet ausgeführt wird, bevor Sie versuchen, es als Dienst zu starten.

RELATED: Beste Linux-Laptops für Entwickler und Enthusiasten