Sådan kører du et Linux-program ved opstart med systemd

Har du brug for at starte et Linux-program ved opstart? Systemd-softwaren giver mulighed for at gøre det på enhver Linux-distro med systemd – hvilket er de fleste af dem i disse dage, inklusive Ubuntu. Vi guider dig gennem processen med at skabe en integreret tjeneste – og den taler endda til journalen.

Denne vejledning viser, hvordan du opsætter en systemtjeneste, der starter, når du starter dit system. For at starte et grafisk program, når du logger på, skal du bruge dit skrivebords startmanager i stedet.

Kører programmer ved opstart

Nogle gange kobler den software, du installerer på din computer sig ind i Linux-startprocessen, så programmet automatisk startes, hver gang computeren startes. Du kan nemt opnå den samme adfærd med dine egne programmer og scripts, eller faktisk ethvert andet program, der er på din computer.

De programmer, der startes ved opstart, styres af systemd, den system og service Manager. systemd er den første proces, der kører ved opstart. Det har den altid gjort proces-id (PID) 1. Hver anden proces, der kører på din computer, startes af systemd eller af en proces, som systemd allerede er startet.

Programmer, der kører i baggrunden, kaldes dæmoner eller tjenester. “D” i slutningen af ​​systemd står for dæmon. I denne artikel opretter vi en eksempeltjeneste. For at afkrydse alle felterne skal vores service være:

Integreret med systemd gennem en serviceenhedsfil
Lanceret ved opstart
Kan kontrolleres ved hjælp af systemctl, den kontrol interface til systemd
Kan skrive til journalen

Oprettelse af serviceprogrammet

Vi skal have et program, som systemd vil starte. Vi laver et simpelt script, kaldet “htg.sh”. Denne vejledning bruger Gedit-teksteditoren, men du kan bruge den teksteditor, du foretrækker.

touch htg.sh
gedit htg.sh

Gedit-editoren åbnes. Kopier og indsæt følgende tekst i editoren.

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

Gem dine ændringer og luk editoren.

  Sådan hoster du en Mumble-server på Linux

Manuskriptet gør ikke så meget, men der er et par punkter, der er værd at bemærke.

De to ekkolinjer føres gennem systemd-cat, et program, der tager output fra et program og sender det til journalen. Indlæg i journalen prioriteres. Vi bruger muligheden -p (prioritet) til at angive, at vores beskeder kun er til information (info). De er ikke vigtige fejl eller advarsler.
Der er en uendelig mens-løkke.
Variablen TIMESTAMP er indstillet til den aktuelle dato og klokkeslæt. Denne formateres til en besked og sendes til journalen.
Scriptet sover derefter i 60 sekunder.
Efter 60 sekunder gentages løkken. Så dette script skriver en tidsstemplet besked til journalen én gang i minuttet.

Vi kopierer scriptet til mappen /usr/local/bin.

sudo cp htg.sh /usr/local/bin

Og vi skal gøre det eksekverbart:

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

Oprettelse af serviceenhedsfilen

Hvert program, der startes af systemd, har en definitionsfil, kaldet en serviceenhedsfil. Dette har visse attributter, som systemd kan bruge til at lokalisere og starte programmet og til at definere noget af dets adfærd.

Vi skal oprette en enhedsfil til vores nye tjeneste, men det er klogt at sikre, at ingen af ​​de eksisterende enhedsfiler har det navn, vi ønsker at give vores nye tjeneste.

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

Du kan rulle gennem listen over enhedsfiler, som er sorteret alfabetisk, og kontrollere, at det navn, du vil bruge, ikke er taget.

Vores service kommer til at hedde “htg.service”. Ingen enhedsfiler har det navn, så vi kan fortsætte og oprette vores enhedsfil.

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

Gedit-editoren åbnes. Kopier og indsæt følgende tekst i editoren:

[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

Gem dine ændringer og luk editoren.

Indtastningerne har disse betydninger. Disse er typiske poster. Vores simple service har faktisk ikke brug for de fleste af dem, men at inkludere dem giver os mulighed for at forklare dem.

  Sådan installeres Irssi og bruge IRC fra Linux-terminalen

Beskrivelse: Dette er en tekstbeskrivelse af din tjeneste.
Ønsker: Vores service ønsker – men kræver ikke – at netværket er oppe, før vores service startes.
Efter: En liste over enhedsnavne, der skal startes, efter at denne tjeneste er blevet startet, hvis de ikke allerede kører.
Type: Enkel. systemd vil betragte denne service som startet, så snart den proces, der er specificeret af ExecStart, er blevet splittet.
ExecStart: Stien til den proces, der skal startes.
Genstart: Hvornår og hvis tjenesten skal genstartes. Vi har sat det til “on-failure”.
RestartSec: Hvor længe skal man vente, før man forsøger at genstarte tjenesten. Denne værdi er i sekunder.
KillMode: Definerer, hvordan systemd skal dræbe processen, hvis vi beder systemctl om at stoppe tjenesten. Vi har dette indstillet til “behandle”. Dette får systemd til kun at bruge SIGTERM-signalet på hovedprocessen. Hvis vores tjeneste var et ikke-trivielt program i stedet for et simpelt script, ville vi indstille dette til “blandet” for at sikre, at alle afledte processer også blev afsluttet.
WantedBy: Vi har dette indstillet til “multi-user.target”, hvilket betyder, at tjenesten skal startes, så længe systemet er i en tilstand, hvor flere brugere kan logge ind, uanset om en grafisk brugergrænseflade er tilgængelig eller ej.

Enhedsfilen behøver ikke at være eksekverbar, men tilladelserne på enhedsfilen bør begrænse, hvem der kan redigere den. Du ønsker ikke, at en ondsindet eller drilsk bruger ændrer enhedsfilen, så den kører et helt andet program.

Denne kommando vil give ejeren læse- og skrivetilladelser og læsetilladelser til gruppen. Andre vil ikke have nogen tilladelser.

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

Vi kan få systemctl til at tjekke syntaksen for vores enhedsfil for os, selvom tjenesten ikke kører endnu. Eventuelle fejl vil blive rapporteret. (Faktisk er “.service”-delen valgfri for de fleste kommandoer.)

systemctl status htg.service

Ingen fejl er fremhævet, hvilket betyder, at vores enhedsfil er syntaktisk korrekt.

  Sådan får du den seneste Linux Kernel-version i Ubuntu

Start af tjenesten

Når du tilføjer en ny enhedsfil eller redigerer en eksisterende, skal du bede systemd om at genindlæse enhedsfildefinitionerne.

sudo systemctl daemon-reload

Hvis du vil have en tjeneste lanceret ved opstart, skal du aktivere den:

sudo systemctl enable htg

Aktivering af en tjeneste starter den ikke, den indstiller den kun til at blive lanceret ved opstart. For at starte tjenesten nu skal du bruge systemctl med startmuligheden.

sudo systemctl start htg

Bekræftelse af tjenesten

Efter manuel start af tjenesten eller efter genstart af computeren, kan vi bekræfte, at vores tjeneste kører korrekt.

sudo systemctl status htg.service

Status for tjenesten vises for os.

Den grønne prik betyder, at vores service kører problemfrit.
Navnet på tjenesten er “htg.service”, og den lange beskrivelse er den, vi har angivet i enhedsfilen.
Vi får vist, hvilken enhedsfil der er blevet indlæst “/etc/systemd/system/htg.service”.
Tjenesten er aktiv, og det tidspunkt, tjenesten blev lanceret, er angivet for os.
Dens PID er 7762.
Der er to opgaver knyttet til tjenesten.
I alt 928 Kibibyte hukommelse bliver brugt af tjenesten.
Kontrolgruppen inkluderer “htg.sh”-scriptet og sleep-kommandoen, som er blevet lanceret af “htg.sh.” Det meste af tiden vil sleep-kommandoen udføre arbejdet for denne tjeneste.

Vi får også vist de sidste 10 journalposter produceret af denne tjeneste. Ikke overraskende er de alle med et minuts mellemrum.

Stop og deaktivering af tjenesten

Hvis du har brug for at stoppe tjenesten, kan du gøre det med denne kommando:

sudo systemctl stop htg.service

Dette stopper tjenesten, men det forhindrer den ikke i at genstarte næste gang computeren genstartes. For at stoppe tjenesten, der lanceres ved opstart, skal du deaktivere den:

sudo systemctl disable htg.service

Hvis tjenesten kører, stopper denne kommando den ikke. Det fortæller simpelthen systemd ikke at starte tjenesten ved næste genstart.

Hvis du vil stoppe tjenesten og forhindre den i at starte ved opstart, skal du bruge begge kommandoer.

Service tip

Sørg for, at dit program kører som forventet, før du prøver at starte det som en tjeneste.