Connect with us

Wie man

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

So verwenden Sie Curl zum Herunterladen von Dateien über die Linux-Befehlszeile

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 von ihnen sind, einschließlich Ubuntu. Wir führen Sie durch den Prozess der Erstellung eines integrierten Dienstes – und er spricht sogar mit dem Journal.

Dieses Tutorial zeigt, wie Sie einen Systemdienst einrichten, der beim Starten Ihres Systems gestartet wird. Um bei der Anmeldung ein grafisches Programm 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-Startprozess ein, sodass das Programm bei jedem Start des Computers automatisch gestartet wird. Sie können das gleiche Verhalten leicht mit Ihren eigenen Programmen und Skripten erreichen oder sogar mit jedem anderen Programm, das sich auf Ihrem Computer befindet.

Die Programme, die beim Start gestartet werden, werden gesteuert von systemd, das System und Service Manager. systemd ist der erste Prozess, der beim Start ausgeführt wird. Es hat immer Prozess ID (PID) 1. Jeder andere auf Ihrem Computer ausgeführte Prozess wird gestartet von systemd, oder durch einen Prozess, der systemd hat schon angefangen.

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

  • Integriert mit systemd über eine Service-Unit-Datei
  • Gestartet beim Start
  • Steuerbar mit systemctl, das Steuerschnittstelle Pro systemd
  • Kann ins Tagebuch schreiben

Erstellen des Serviceprogramms

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

touch htg.sh
gedit htg.sh

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: ## Starting ##" | systemd-cat -p info

while :
do
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "htg.service: timestamp ${TIMESTAMP}" | systemd-cat -p info
sleep 60
done

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 Punkte, die es wert sind, erwähnt zu werden.

  • Die Zwei echo Leitungen sind durchgefädelt systemd-cat, ein Programm, das die Ausgabe von einem Programm und sendet sie an das Journal. Einträge in das Journal werden vorrangig behandelt. Wir verwenden die -p (Priorität) Option, um anzugeben, dass unsere Nachrichten nur zur Information (Info) dienen. Sie sind keine wichtigen Fehler oder Warnungen.
  • Es gibt ein endloses while Schleife.
  • Der TIMESTAMP Variable wird auf das aktuelle Datum und die aktuelle Uhrzeit gesetzt. Diese wird zu einer Nachricht formatiert und an das Journal gesendet.
  • Das Skript schläft dann 60 Sekunden lang.
  • 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 die /usr/local/bin Verzeichnis.

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 gestartet wird von systemd verfügt über eine Definitionsdatei, die als Service-Unit-Datei bezeichnet wird. Dies enthält bestimmte Attribute, die systemd verwenden können, um das Programm zu lokalisieren und zu starten und um einen Teil seines Verhaltens 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 alphabetisch sortierte Liste der Unit-Dateien blättern und überprüfen, ob der gewünschte Name nicht vergeben ist.

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:

[Unit]
Description=How-To Geek Service Example

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

[Service]
Type=simple
ExecStart=/usr/local/bin/htg.sh
Restart=on-failure
RestartSec=10
KillMode=process

[Install]
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 braucht die meisten nicht wirklich, aber sie einzubeziehen ermöglicht es uns, sie zu 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.
  • Nach: Eine Liste von Unit-Namen, die gestartet werden sollen, nachdem dieser Dienst erfolgreich gestartet wurde, falls sie noch nicht ausgeführt werden.
  • Typ: Einfach. systemd wird diesen Dienst als gestartet betrachten, sobald der von ExecStart wurde gegabelt.
  • AusführenStart: Der Pfad zu dem Prozess, der gestartet werden soll.
  • Neustart: Wann und ob der Dienst neu gestartet werden soll. Wir haben es auf «bei Fehler» gesetzt.
  • NeustartSek: Wie lange muss gewartet werden, bevor versucht wird, den Dienst neu zu starten. Dieser Wert wird in Sekunden angegeben.
  • KillModus: Definiert wie systemd sollte den Prozess beenden, wenn wir fragen systemctl um den Dienst zu stoppen. Wir haben dies auf «Verarbeiten» gesetzt. Dies bewirkt systemd um die zu benutzen SIGTERM Signal nur auf dem Hauptprozess. Wenn unser Dienst ein nicht triviales Programm anstelle eines einfachen Skripts wäre, würden wir dies auf „gemischt“ setzen, um sicherzustellen, dass auch alle erzeugten Prozesse beendet werden.
  • Gesucht von: Wir haben dies 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 so ändert, dass sie ein ganz anderes Programm ausführt.

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

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

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

systemctl status htg.service

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

Starten des Dienstes

Wenn Sie eine neue Einheitendatei hinzufügen oder eine vorhandene bearbeiten, müssen Sie dies mitteilen systemd um 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:

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 zu starten, müssen Sie systemctl mit dem start Möglichkeit.

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 funktioniert.
  • Der Name des Dienstes ist „htg.service“, und die lange Beschreibung ist die, 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.
  • Mit dem Dienst sind zwei Aufgaben verbunden.
  • Insgesamt 928 Kibibyte Speicher werden vom Dienst verwendet.
  • Die Kontrollgruppe umfasst das Skript „htg.sh“ und die sleep Befehl, der von „htg.sh“ gestartet wurde. Meistens ist die sleep Befehl wird die Arbeit für diesen Dienst erledigen.

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

Stoppen und Deaktivieren des Dienstes

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

sudo systemctl stop htg.service

Dies stoppt den Dienst, verhindert jedoch 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 Folgendes tun:

sudo systemctl disable htg.service

Wenn der Dienst ausgeführt wird, wird er durch diesen Befehl nicht gestoppt. Es erzählt einfach systemd 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.

Continue Reading
Click to comment

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Tendencia