Linux-program futtatása indításkor a systemd segítségével

El kell indítani egy Linux programot rendszerindításkor? A systemd szoftver lehetőséget biztosít arra, hogy ezt bármely systemd-t használó Linux disztribúción megtegye – ez manapság a legtöbb, beleértve az Ubuntut is. Végigvezetjük az integrált szolgáltatás létrehozásának folyamatán – és még a folyóirattal is beszél.

Ez az oktatóanyag bemutatja, hogyan állíthat be egy rendszerszolgáltatást, amely a rendszer indításakor indul el. Grafikus program elindításához bejelentkezéskor használja inkább az asztali indításkezelőt.

Programok futtatása indításkor

Néha a számítógépére telepített szoftver bekapcsolódik a Linux indítási folyamatába, így a program a számítógép minden indításakor automatikusan elindul. Könnyen elérheti ugyanezt a viselkedést saját programjaival és szkriptjeivel, vagy tulajdonképpen bármely más programmal, amely a számítógépén található.

Az indításkor elindított programokat a systemd, a rendszer és szolgáltatás menedzser. A systemd az első folyamat, amely indításkor fut. Mindig van folyamatazonosító (PID) 1. A számítógépén futó minden más folyamatot a systemd elindítja, vagy egy olyan folyamat, amelyet a systemd már elindított.

A háttérben futó programokat hívják démonok vagy szolgáltatások. A systemd végén található „d” a démont jelenti. Ebben a cikkben egy példaszolgáltatást hozunk létre. Az összes négyzet kipipálásához szolgáltatásunknak a következőnek kell lennie:

Integrálva a systemd-vel egy szervizegység fájlon keresztül
Indításkor elindítva
A systemctl segítségével vezérelhető, a vezérlő interfész a systemd számára
Képes a naplóba írni

Szolgáltatási program létrehozása

Szükségünk van egy programra, amelyet a systemd elindít. Létrehozunk egy egyszerű szkriptet, „htg.sh” néven. Ez az oktatóanyag a Gedit szövegszerkesztőt használja, de bármilyen szövegszerkesztőt használhat.

touch htg.sh
gedit htg.sh

Megnyílik a gedit szerkesztő. Másolja ki és illessze be a következő szöveget a szerkesztőbe.

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

Mentse el a változtatásokat, és zárja be a szerkesztőt.

  Miért van még mindig megosztó a Linux rendszere ennyi év után?

A forgatókönyv nem tesz sokat, de van néhány szempont, amit érdemes megjegyezni.

A két echo-vonal a systemd-cat-en keresztül van átvezetve, egy programon keresztül, amely a kimenetet egy programból, és elküldi a naplóba. A naplóbejegyzések elsőbbséget élveznek. A -p (priority) opciót használjuk annak jelzésére, hogy üzeneteink csak tájékoztató jellegűek. Ezek nem fontos hibák vagy figyelmeztetések.
Van egy végtelen while ciklus.
A TIMESTAMP változó az aktuális dátumra és időre van állítva. Ezt üzenetté formázzák és elküldik a naplónak.
A szkript ezután 60 másodpercig alszik.
60 másodperc elteltével a hurok megismétlődik. Tehát ez a szkript percenként egyszer ír időbélyegzett üzenetet a naplóba.

A szkriptet a /usr/local/bin könyvtárba másoljuk.

sudo cp htg.sh /usr/local/bin

És végrehajthatóvá kell tennünk:

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

A szolgáltatási egység fájl létrehozása

Minden systemd által elindított programnak van egy definíciós fájlja, az úgynevezett szolgáltatási egység fájl. Ez tartalmaz bizonyos attribútumokat, amelyeket a systemd használhat a program megkeresésére és elindítására, valamint bizonyos viselkedésének meghatározására.

Létre kell hoznunk egy egységfájlt az új szolgáltatásunkhoz, de célszerű megbizonyosodnunk arról, hogy a meglévő egységfájlok egyike sem rendelkezik azzal a névvel, amelyet új szolgáltatásunknak szeretnénk adni.

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

Görgetheti az egységfájlok ábécé sorrendben rendezett listáját, és ellenőrizheti, hogy a használni kívánt név nincs-e elfoglalva.

Szolgáltatásunk neve „htg.service” lesz. Egyetlen egységfájlnak sincs ilyen neve, így folytathatjuk és létrehozhatjuk egységfájlunkat.

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

Megnyílik a gedit szerkesztő. Másolja ki és illessze be a következő szöveget a szerkesztőbe:

[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

Mentse el a változtatásokat, és zárja be a szerkesztőt.

A bejegyzéseknek ez a jelentése. Ezek tipikus bejegyzések. Egyszerű szolgáltatásunknak valójában nincs is szüksége ezekre a legtöbbre, de beépítésük lehetővé teszi számunkra, hogy elmagyarázzuk őket.

  Hogyan frissítsünk Linux Mint 20.2-re

Leírás: Ez a szolgáltatás szöveges leírása.
Akar: Szolgáltatásunk azt akarja – de nem igényli –, hogy a hálózat üzemeljen a szolgáltatásunk elindítása előtt.
Utána: Azon egységnevek listája, amelyeket a szolgáltatás sikeres elindítása után el kell indítani, ha még nem futnak.
Típus: Egyszerű. A systemd ezt a szolgáltatást elindítottnak tekinti, amint az ExecStart által meghatározott folyamat elágazódik.
ExecStart: Az elindítandó folyamat elérési útja.
Újraindítás: Mikor és mikor kell újraindítani a szolgáltatást. Beállítottuk „kudarc esetén”.
RestartSec: Mennyi ideig kell várni a szolgáltatás újraindítása előtt. Ez az érték másodpercben értendő.
KillMode: Meghatározza, hogy a systemd hogyan állítsa le a folyamatot, ha megkérjük a systemctl-t a szolgáltatás leállítására. Ezt „feldolgozásra” állítottuk be. Ez azt eredményezi, hogy a systemd csak a fő folyamaton használja a SIGTERM jelet. Ha a szolgáltatásunk egy nem triviális program lenne egy egyszerű szkript helyett, akkor ezt „vegyesre” állítanánk, hogy biztosítsuk, hogy az esetlegesen létrehozott folyamatok is leálljanak.
WantedBy: Ezt a „multi-user.target” értékre állítjuk, ami azt jelenti, hogy a szolgáltatást addig kell elindítani, amíg a rendszer olyan állapotban van, ahol több felhasználó is bejelentkezhet, függetlenül attól, hogy elérhető-e grafikus felhasználói felület vagy sem.

Az egységfájlnak nem kell futtathatónak lennie, de az egységfájl engedélyeinek korlátozniuk kell, hogy ki szerkesztheti. Nem akarja, hogy egy rosszindulatú vagy huncut felhasználó úgy módosítsa az egységfájlt, hogy az teljesen más programot hajtson végre.

Ez a parancs olvasási és írási, valamint olvasási jogosultságot ad a tulajdonosnak a csoport számára. Másoknak nem lesz engedélyük.

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

A systemctl ellenőrizheti az egységfájlunk szintaxisát, még akkor is, ha a szolgáltatás még nem fut. Az esetleges hibákat jelentjük. (Valójában a „.service” rész nem kötelező a legtöbb parancshoz.)

systemctl status htg.service

Nincsenek kiemelve hibák, ami azt jelenti, hogy az egységfájlunk szintaktikailag helyes.

  Szoftverek keresése homályos Linux disztribúciókon

A szolgáltatás elindítása

Amikor új egységfájlt ad hozzá vagy szerkeszt egy meglévőt, meg kell mondania a systemd-nek, hogy töltse be újra az egységfájl definícióit.

sudo systemctl daemon-reload

Ha azt szeretné, hogy egy szolgáltatás indításkor elinduljon, engedélyeznie kell:

sudo systemctl enable htg

Egy szolgáltatás engedélyezése nem indítja el, csak beállítja, hogy a rendszerindításkor induljon el. A szolgáltatás most elindításához a systemctl parancsot kell használnia a start opcióval.

sudo systemctl start htg

A szolgáltatás ellenőrzése

A szolgáltatás kézi elindítása vagy a számítógép újraindítása után ellenőrizhetjük, hogy szolgáltatásunk megfelelően működik-e.

sudo systemctl status htg.service

A szolgáltatás állapota megjelenik számunkra.

A zöld pont azt jelenti, hogy szolgáltatásunk zökkenőmentesen működik.
A szolgáltatás neve „htg.service”, a hosszú leírás pedig az, amelyet az egységfájlban adtunk meg.
Megjelenik, hogy melyik egységfájl lett betöltve „/etc/systemd/system/htg.service”.
A szolgáltatás aktív, és a szolgáltatás indulásának időpontja szerepel számunkra.
PID-je 7762.
A szolgáltatáshoz két feladat kapcsolódik.
Összesen 928 Kibibájt memória a szolgáltatás használja.
A vezérlőcsoport tartalmazza a „htg.sh” szkriptet és az alvás parancsot, amelyet a „htg.sh” indított el. Az idő nagy részében az alvás parancs végzi a munkát ehhez a szolgáltatáshoz.

Megjelenik a szolgáltatás által készített utolsó 10 naplóbejegyzés is. Nem meglepő módon mind egy percre van egymástól.

A szolgáltatás leállítása és letiltása

Ha le kell állítania a szolgáltatást, ezt a következő paranccsal teheti meg:

sudo systemctl stop htg.service

Ez leállítja a szolgáltatást, de nem akadályozza meg az újraindítást a számítógép következő újraindításakor. A szolgáltatás indításakor történő leállításához le kell tiltania:

sudo systemctl disable htg.service

Ha a szolgáltatás fut, ez a parancs nem állítja le. Egyszerűen azt mondja a systemd-nek, hogy ne indítsa el a szolgáltatást a következő újraindításkor.

Ha le szeretné állítani a szolgáltatást, és meg szeretné akadályozni, hogy az indításkor elinduljon, használja mindkét parancsot.

Szerviz tipp

Győződjön meg arról, hogy a program a várt módon fut, mielőtt megpróbálja elindítani szolgáltatásként.