Låt systemd ta hand om dina demoner
Här ska vi titta på hur man skapar en systemd-tjänst av en egen demon. Vi kommer
börja med att skapa ett litet skalskript som vi kommer att använda som
exempeldemon. Därefter skapar vi systemd-tjänsten för demonen, samt aktiverar
och startar den med systemctl
.
Exempeldemonen
Exempeldemonen kommer bara vara ett enkelt skalskript som skriver tid och datum till en fil i /tmp-katalogen var 20:e sekund.
Spara nedanstående skript i /usr/sbin/my-own-daemon.sh. Eftersom vi sparar den i /usr/sbin/ måste du göra detta som root.
#!/bin/bash
PATH="/bin:/sbin:/usr/bin:/usr/sbin"
while true
do
echo "Aktuellt klockslag: $(date +'%Y-%m-%d %H:%M:%S')" \
> /tmp/klockan_ar.txt
sleep 20
done
Efter att du sparat filen i /usr/sbin/my-own-daemon.sh behöver vi göra den körbar. Gör detta med:
#> chmod +x /usr/sbin/my-own-daemon.sh
Nu är demonen klar och det är dags att skapa systemd-tjänsten.
Systemd-tjänsten
Att skapa en grundläggande systemd-tjänst är faktiskt mycket enklare än vad man kan tro. På bara sju rader har vi en fullt fungerande tjänst. Spara nedanstående kod i /etc/systemd/system/my-own-daemon.service
[Unit]
Description=Min första exempeldemon
[Service]
ExecStart=/usr/sbin/my-own-daemon.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
Här har vi specificerat en beskrivning för demonen i fältet Description. Vi har också specificerat skriptet som denna tjänsten ska köra med ExecStart. Utöver detta har vi angett att demonen ska startas om ifall den kraschar med Restart=on-failure. Denna raden är inte nödvändig för att få en fungerande tjänst, men är ett bra tillägg – särskilt för viktiga demoner. Och sist men inte minst har vi specificerat vilken runlevel – eller rättare sagt target på systemd-språk – som ska köra denna demonen.
Aktivera och starta tjänsten
Nu har det blivit dags att testköra tjänsten. Om vi vill att demonen ska startas varje gång datorn startas aktiverar vi tjänsten med nedanstående kommando (som root):
#> systemctl enable my-own-daemon
Created symlink /etc/systemd/system/multi-user.target.wants/my-own-daemon.service → /etc/systemd/system/my-own-daemon.service.
Nu testar vi att starta tjänsten.
#> systemctl start my-own-daemon
Nu kan vi passa på att även kontrollera om demonen verkligen körs med
status
-kommandot.
#> systemctl status my-own-daemon
● my-own-daemon.service - Min första exempeldemon
Loaded: loaded (/etc/systemd/system/my-own-daemon.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2019-05-12 04:08:21 CEST; 18s ago
Main PID: 26613 (my-own-daemon.s)
Tasks: 2 (limit: 4915)
CGroup: /system.slice/my-own-daemon.service
├─26613 /bin/bash /usr/sbin/my-own-daemon.sh
└─26615 sleep 20
maj 12 04:08:21 red-dwarf systemd[1]: Started Min första exempeldemon.
För att verifiera att demonen verkligen skriver ut datum och klockslag till
filen /tmp/klockan_ar.txt var 20:e sekund, kan vi skriva ut den med cat
.
#> cat /tmp/klockan_ar.txt
Aktuellt klockslag: 2019-05-12 04:12:21
Och en liten stund senare…
#> cat /tmp/klockan_ar.txt
Aktuellt klockslag: 2019-05-12 04:12:41
Avaktivera och stoppa tjänsten
Om vi vill stoppa tjänsten igen görs detta med systemctl stop
.
#> systemctl stop my-own-daemon
För att verifiera att den verkligen är stoppad kan vi kontrollera detta med
status
-kommandot igen.
#> systemctl status my-own-daemon
● my-own-daemon.service - Min första exempeldemon
Loaded: loaded (/etc/systemd/system/my-own-daemon.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Sun 2019-05-12 04:14:10 CEST; 7s ago
Process: 26613 ExecStart=/usr/sbin/my-own-daemon.sh (code=killed, signal=TERM)
Main PID: 26613 (code=killed, signal=TERM)
maj 12 04:08:21 red-dwarf systemd[1]: Started Min första exempeldemon.
maj 12 04:14:10 red-dwarf systemd[1]: Stopping Min första exempeldemon...
maj 12 04:14:10 red-dwarf systemd[1]: Stopped Min första exempeldemon.
Kom dock ihåg att vi har aktiverat tjänsten – vilket innebär att den startar
automatiskt varje gång datorn startas. För att avaktivera tjänsten använder vi
systemctl disable
.
#> systemctl disable my-own-daemon
Removed /etc/systemd/system/multi-user.target.wants/my-own-daemon.service.
Avslutning
Du har nu skapat en alldeles egen tjänst i systemd! Svårare än så behöver det
faktiskt inte vara. Däremot kan man göra mycket mer än bara det som vi nyss gått
igenom. Det finns dessutom många fler systemctl
-kommandon än dessa. För att
lära dig mer om systemd rekommenderar jag dig att läsa vår
genomgång
Hantera tjänster med systemctl
och Läs loggar med journalctl.
Relaterat
Senaste nyheterna och inläggen
CyberInfo Sverige är ett IT-företag i nordvästra Skåne som tillhandahåller böcker, utbildningar, nyheter och konsulttjänster inom Linux, BSD och programmering.
CyberInfo Sverige är godkänd för F-skatt, är momsregistrerat och innehar
utgivningsbevis för webbplatsen www.cyberinfo.se.