Een Linux-programma uitvoeren bij het opstarten met systemd

Een gestileerd terminalvenster op een laptop.
Fatmawati Achmad Zaenuri / Shutterstock

Moet u bij het opstarten een Linux-programma starten? De systemd-software biedt een manier om het te doen op elke Linux-distro met systemd – en dat zijn de meeste tegenwoordig, inclusief Ubuntu. We zullen u door het proces leiden om een ​​geïntegreerde service te creëren – en hij praat zelfs met het tijdschrift.

Deze tutorial laat zien hoe u een systeemservice instelt die wordt gestart wanneer u uw systeem opstart. Gebruik in plaats daarvan de opstartmanager van uw bureaublad om een ​​grafisch programma te starten wanneer u zich aanmeldt.

Programma’s uitvoeren bij het opstarten

Soms haakt de software die u op uw computer installeert zichzelf in het opstartproces van Linux, zodat het programma automatisch wordt gestart telkens wanneer de computer wordt opgestart. U kunt hetzelfde gedrag gemakkelijk bereiken met uw eigen programma’s en scripts, of in feite elk ander programma dat op uw computer staat.

De programma’s die bij het opstarten worden gestart, worden bestuurd door systemd, de systeem- en servicemanager. systemd is het eerste proces dat wordt uitgevoerd bij het opstarten. Het heeft altijd proces-ID (PID) 1. Elk ander proces dat op uw computer wordt uitgevoerd, wordt gestart door systemd, of door een proces dat systemd is al begonnen.

Programma’s die op de achtergrond worden uitgevoerd, worden daemons of services genoemd. De “d” aan het einde van systemd staat voor daemon. In dit artikel maken we een voorbeeldservice. Om alle vakjes aan te vinken, moet onze service zijn:

  • Geïntegreerd met systemd via een service unit-bestand
  • Gelanceerd bij het opstarten
  • Bestuurbaar met systemctl, de besturingsinterface voor systemd
  • In staat om naar het dagboek te schrijven

Het serviceprogramma maken

We hebben een programma nodig dat systemd zal lanceren. We zullen een eenvoudig script maken, genaamd “htg.sh”. Deze tutorial gebruikt de Gedit-teksteditor, maar je kunt elke gewenste teksteditor gebruiken.

touch htg.sh
gedit htg.sh

raak htg.sh aan in een terminalvenster

De gedit editor wordt geopend. Kopieer en plak de volgende tekst in de editor.

#!/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

Sla uw wijzigingen op en sluit de editor.

htg.sh script in de gedit-editor

Het script doet niet veel, maar er zijn een paar punten die het vermelden waard zijn.

  • De twee echo lijnen worden doorgesluisd systemd-cat, een programma dat de output van een programma overneemt en naar het tijdschrift stuurt. Inzendingen in het journaal krijgen prioriteit. We gebruiken de -p (prioriteit) optie om aan te geven dat onze berichten alleen ter informatie (info) zijn. Het zijn geen belangrijke fouten of waarschuwingen.
  • Er is een eindeloos while lus.
  • De TIMESTAMP variabele is ingesteld op de huidige datum en tijd. Dit wordt opgemaakt in een bericht en naar het dagboek gestuurd.
  • Het script slaapt vervolgens 60 seconden.
  • Na 60 seconden wordt de lus herhaald. Dit script schrijft dus eenmaal per minuut een bericht met tijdstempel naar het dagboek.

We kopiëren het script naar het /usr/local/bin directory.

sudo cp htg.sh /usr/local/bin

sudo cp htg.sh / usr / local / bin in een terminalvenster

En we moeten het uitvoerbaar maken:

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

sudo chmod + x /usr/local/bin/htg.sh in een terminalvenster

Het Service Unit-bestand maken

Elk programma dat wordt gestart door systemd heeft een definitiebestand, een zogenaamde service unit-bestand. Dit heeft bepaalde attributen die systemd kan gebruiken om het programma te lokaliseren en te starten, en om een ​​deel van zijn gedrag te definiëren.

We moeten een unit-bestand maken voor onze nieuwe service, maar het is verstandig om ervoor te zorgen dat geen van de bestaande unit-bestanden de naam heeft die we onze nieuwe service willen geven.

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

sudo systemctl list-unit-files --type-service in een terminalvenster

U kunt door de lijst met apparaatbestanden bladeren, die alfabetisch is gesorteerd, en controleren of de naam die u wilt gebruiken niet bezet is.

Lijst met systeembestanden in een terminalvenster

Onze service gaat “htg.service” heten. Geen enkele eenheidsbestanden hebben die naam, dus we kunnen doorgaan en ons eenheidsbestand maken.

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

sudo gedit /etc/systemd/system/htg.service in een terminalvenster

De gedit editor wordt geopend. Kopieer en plak de volgende tekst in de editor:

[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

Sla uw wijzigingen op en sluit de editor.

htg.service unit-bestand in de gedit-editor

De inzendingen hebben deze betekenissen. Dit zijn typische inzendingen. Onze eenvoudige service heeft de meeste niet nodig, maar door ze op te nemen, kunnen we ze uitleggen.

  • Omschrijving: Dit is een tekstbeschrijving van uw dienst.
  • Wil: Onze service wil – maar vereist niet – dat het netwerk actief is voordat onze service wordt gestart.
  • Na: Een lijst met namen van eenheden die moeten worden gestart nadat deze service met succes is gestart, als ze nog niet actief zijn.
  • Type: Gemakkelijk. systemd zal deze service als gestart beschouwen zodra het proces gespecificeerd door ExecStart is gevorkt.
  • ExecStart: Het pad naar het proces dat moet worden gestart.
  • Herstarten: Wanneer en of de service opnieuw moet worden gestart. We hebben het ingesteld op “on-failure”.
  • HerstartSec: Hoelang moet worden gewacht voordat wordt geprobeerd de service opnieuw te starten. Deze waarde is in seconden.
  • KillMode: Bepaalt hoe systemd zou het proces moeten beëindigen als we daarom vragen systemctl om de service te stoppen. We hebben dit ingesteld op ‘verwerken’. Dit veroorzaakt systemd om de SIGTERM signaal alleen op het hoofdproces. Als onze service een niet-triviaal programma was in plaats van een eenvoudig script, zouden we dit op “gemengd” zetten om ervoor te zorgen dat alle voortgebrachte processen ook werden beëindigd.
  • Gezocht door: We hebben dit ingesteld op “multi-user.target”, wat betekent dat de service moet worden gestart zolang het systeem zich in een staat bevindt waarin meerdere gebruikers kunnen inloggen, ongeacht of er een grafische gebruikersinterface beschikbaar is.

Het eenheidsbestand hoeft niet uitvoerbaar te zijn, maar de machtigingen voor het eenheidsbestand moeten beperken wie het kan bewerken. U wilt niet dat een kwaadwillende of ondeugende gebruiker het eenheidsbestand wijzigt zodat het een geheel ander programma uitvoert.

Deze opdracht geeft de eigenaar lees- en schrijfrechten en leesrechten voor de groep. Anderen hebben geen toestemming.

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

sudo chmod 640 /etc/systemd/system/htg.service in een terminalvenster

We kunnen hebben systemctl controleer de syntaxis van ons eenheidsbestand voor ons, zelfs als de service nog niet actief is. Eventuele fouten worden gerapporteerd. (Eigenlijk is het “.service” -gedeelte optioneel voor de meeste opdrachten.)

systemctl status htg.service

systemctl status htg.service in een terminalvenster

Er worden geen fouten gemarkeerd, wat betekent dat ons eenheidsbestand syntactisch correct is.

De service starten

Wanneer u een nieuw eenheidsbestand toevoegt of een bestaand bestand bewerkt, moet u dit aangeven systemd om de bestandsdefinities van de eenheid opnieuw te laden.

sudo systemctl daemon-reload

Als u wilt dat een service wordt gestart bij het opstarten, moet u dit doen inschakelen het:

sudo systemctl enable htg

Als u een service inschakelt, wordt deze niet gestart, maar wordt deze alleen ingesteld om tijdens het opstarten te worden gestart. Om de service te starten nu, je moet gebruiken systemctl met de start optie.

sudo systemctl start htg

sudo systemctl daemon-reload in een terminalvenster

De service verifiëren

Nadat we de service handmatig hebben gestart of nadat de computer opnieuw is opgestart, kunnen we controleren of onze service correct werkt.

sudo systemctl status htg.service

sudo systemctl status htg.service in een terminalvenster

De status van de dienst wordt voor ons weergegeven.

Status van htg.service in een terminal widnow

  • De groene stip betekent dat onze service probleemloos werkt.
  • De naam van de service is “htg.service”, en de lange beschrijving is degene die we in het unit-bestand hebben opgegeven.
  • We laten zien welk eenheidsbestand is geladen “/etc/systemd/system/htg.service”.
  • De service is actief en de tijd waarop de service is gestart, wordt voor ons vermeld.
  • De PID is 7762.
  • Er zijn twee taken verbonden aan de service.
  • In totaal wordt 928 Kibibytes aan geheugen gebruikt door de dienst.
  • De stuurgroep bevat het script “htg.sh” en het sleep commando, dat is gestart door “htg.sh.” Meestal is de sleep commando zal het werk voor deze service doen.

We krijgen ook de laatste 10 journaalboekingen te zien die door deze service zijn geproduceerd. Het is niet verwonderlijk dat ze allemaal een minuut uit elkaar liggen.

De service stoppen en uitschakelen

Als u de service moet stoppen, kunt u dit doen met deze opdracht:

sudo systemctl stop htg.service

sudo systemctl stop htg.service in een terminalvenster

Hierdoor wordt de service gestopt, maar het belet niet dat deze de volgende keer dat de computer opnieuw wordt opgestart, opnieuw wordt opgestart. Om te voorkomen dat de service wordt gestart bij het opstarten, moet u uitschakelen het:

sudo systemctl disable htg.service

sudo systemtctl schakel htg.service uit in een terminalvenster

Als de service actief is, stopt deze opdracht deze niet. Het vertelt gewoon systemd om de service niet te starten bij de volgende herstart.

Als u de service wilt stoppen en wilt voorkomen dat deze bij het opstarten wordt gestart, gebruikt u beide opdrachten.

Servicetip

Zorg ervoor dat uw programma werkt zoals verwacht voordat u het als een service probeert te starten.

Nieuwste artikelen

Gerelateerde artikelen