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 voorsystemd
- 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
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.
Het script doet niet veel, maar er zijn een paar punten die het vermelden waard zijn.
- De twee
echo
lijnen worden doorgesluisdsystemd-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
En we moeten het uitvoerbaar maken:
sudo chmod +x /usr/local/bin/htg.sh
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
U kunt door de lijst met apparaatbestanden bladeren, die alfabetisch is gesorteerd, en controleren of de naam die u wilt gebruiken niet bezet is.
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
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.
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 doorExecStart
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 vragensystemctl
om de service te stoppen. We hebben dit ingesteld op ‘verwerken’. Dit veroorzaaktsystemd
om deSIGTERM
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
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
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
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
De status van de dienst wordt voor ons weergegeven.
- 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 desleep
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
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
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.