Jak spustit linuxový program při spuštění s systemd

Potřebujete spustit linuxový program při bootování? Software systemd poskytuje způsob, jak to udělat v jakékoli distribuci Linuxu se systemd – což je dnes většina, včetně Ubuntu. Provedeme vás procesem vytváření integrované služby – a dokonce komunikuje s deníkem.

Tento kurz ukazuje, jak nastavit systémovou službu, která se spouští při spuštění systému. Chcete-li po přihlášení spustit grafický program, použijte místo toho správce spouštění na ploše.

Spouštění programů při spuštění

Někdy se software, který nainstalujete do počítače, sám zapojí do procesu spouštění Linuxu, takže program se automaticky spustí při každém spuštění počítače. Stejného chování můžete snadno dosáhnout svými vlastními programy a skripty nebo vlastně jakýmkoli jiným programem, který je na vašem počítači.

Programy, které se spouštějí při spuštění, jsou řízeny systemd, the systém a servis manažer. systemd je první proces, který se spustí při spuštění. To bylo vždycky ID procesu (PID) 1. Každý další proces spuštěný ve vašem počítači je spuštěn systémem systemd nebo procesem, který již byl spuštěn.

Volají se programy, které běží na pozadí démoni nebo služby. „D“ na konci systemd znamená démona. V tomto článku vytvoříme ukázkovou službu. Chcete-li zaškrtnout všechna políčka, naše služba musí být:

Integrováno se systemd prostřednictvím souboru servisní jednotky
Spuštěno při spuštění
Ovladatelné pomocí systemctl, the ovládací rozhraní pro systemd
Umí psát do deníku

Vytvoření servisního programu

Potřebujeme mít program, který systemd spustí. Vytvoříme jednoduchý skript s názvem „htg.sh“. Tento tutoriál používá textový editor Gedit, ale můžete použít jakýkoli textový editor, který preferujete.

touch htg.sh
gedit htg.sh

Otevře se editor gedit. Zkopírujte a vložte následující text do editoru.

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

Uložte změny a zavřete editor.

  Jak těžit kryptoměnu Bitcoin Gold (BTG) na Linuxu pomocí Minergate

Scénář toho moc nedělá, ale je tu pár bodů, které stojí za zmínku.

Dvě echo linky jsou vedeny přes systemd-cat, program, který přebírá výstup z programu a odešle jej do deníku. Příspěvky do deníku mají přednost. Volbu -p (priorita) používáme k označení, že naše zprávy jsou pouze pro informaci (informace). Nejsou to důležité chyby nebo varování.
Existuje nekonečná smyčka while.
Proměnná TIMESTAMP je nastavena na aktuální datum a čas. Toto je zformátováno do zprávy a odesláno do deníku.
Skript se poté na 60 sekund uspí.
Po 60 sekundách se smyčka opakuje. Tento skript tedy jednou za minutu zapíše zprávu s časovým razítkem do deníku.

Skript zkopírujeme do adresáře /usr/local/bin.

sudo cp htg.sh /usr/local/bin

A musíme to udělat spustitelným:

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

Vytvoření souboru servisní jednotky

Každý program, který spouští systemd, má definiční soubor, který se nazývá soubor servisní jednotky. To obsahuje určité atributy, které může systemd použít k vyhledání a spuštění programu ak definování některých jeho chování.

Potřebujeme vytvořit soubor jednotek pro naši novou službu, ale je rozumné zajistit, aby žádný ze stávajících souborů jednotek neměl název, který chceme dát naší nové službě.

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

Můžete procházet seznam souborů jednotek, který je řazen abecedně, a zkontrolovat, zda název, který chcete použít, není převzat.

Naše služba se bude jmenovat „htg.service“. Žádné soubory jednotek nemají tento název, takže můžeme pokračovat a vytvořit soubor jednotek.

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

Otevře se editor gedit. Zkopírujte a vložte následující text do editoru:

[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

Uložte změny a zavřete editor.

Záznamy mají tyto významy. Toto jsou typické záznamy. Naše jednoduchá služba ve skutečnosti většinu z nich nepotřebuje, ale jejich zahrnutí nám umožňuje vysvětlit je.

  Jak vyhledávat (nebo znovu vyhledávat) kanály na vašem televizoru

Popis: Toto je textový popis vaší služby.
Požaduje: Naše služba chce – ale nevyžaduje –, aby byla síť v provozu před spuštěním naší služby.
Po: Seznam názvů jednotek, které by měly být spuštěny po úspěšném spuštění této služby, pokud již nejsou spuštěny.
Typ: Jednoduchý. systemd bude považovat tuto službu za spuštěnou, jakmile bude proces specifikovaný ExecStart rozdělen.
ExecStart: Cesta k procesu, který by měl být spuštěn.
Restartovat: Kdy a zda má být služba restartována. Nastavili jsme to na „při selhání“.
RestartSec: Jak dlouho čekat před pokusem o restartování služby. Tato hodnota je v sekundách.
KillMode: Definuje, jak by měl systemd zabít proces, pokud požádáme systemctl o zastavení služby. Toto máme nastaveno na „proces“. To způsobí, že systemd použije signál SIGTERM pouze na hlavním procesu. Pokud by naše služba byla netriviálním programem namísto jednoduchého skriptu, nastavili bychom toto na „smíšené“, abychom zajistili, že budou ukončeny i všechny vytvořené procesy.
WantedBy: Toto máme nastaveno na „multi-user.target“, což znamená, že služba by měla být spuštěna, dokud je systém ve stavu, kdy se může přihlásit více uživatelů, bez ohledu na to, zda je k dispozici grafické uživatelské rozhraní.

Soubor jednotky nemusí být spustitelný, ale oprávnění k souboru jednotky by měla omezovat, kdo jej může upravovat. Nechcete, aby zlomyslný nebo zlomyslný uživatel změnil soubor jednotky tak, aby spouštěl úplně jiný program.

Tento příkaz udělí vlastníkovi oprávnění ke čtení a zápisu a oprávnění ke čtení skupině. Ostatní nebudou mít žádná oprávnění.

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

Můžeme nechat systemctl zkontrolovat syntaxi našeho souboru jednotky, i když služba ještě neběží. Případné chyby budou hlášeny. (Ve skutečnosti je část „.service“ pro většinu příkazů volitelná.)

systemctl status htg.service

Nejsou zvýrazněny žádné chyby, což znamená, že náš soubor jednotky je syntakticky správný.

  Jak vypočítat Z-skóre pomocí aplikace Microsoft Excel

Spuštění služby

Když přidáte nový soubor jednotek nebo upravíte existující, musíte systému říct, aby znovu načetl definice souboru jednotek.

sudo systemctl daemon-reload

Pokud chcete, aby se služba spustila při spuštění, musíte ji povolit:

sudo systemctl enable htg

Povolením služby se nespustí, pouze se nastaví, aby se spouštěla ​​při bootování. Chcete-li službu spustit nyní, musíte použít systemctl s možností spuštění.

sudo systemctl start htg

Ověření služby

Po ručním spuštění služby nebo po restartu počítače můžeme ověřit, že naše služba běží správně.

sudo systemctl status htg.service

Zobrazí se nám stav služby.

Zelená tečka znamená, že naše služba běží hladce.
Název služby je „htg.service“ a dlouhý popis je ten, který jsme uvedli v souboru jednotky.
Je ukázáno, který soubor jednotky byl načten „/etc/systemd/system/htg.service“.
Služba je aktivní a je nám uveden čas spuštění služby.
Jeho PID je 7762.
Se službou jsou spojeny dva úkoly.
Celkem 928 Kibibajty paměti jsou službou používány.
Kontrolní skupina obsahuje skript „htg.sh“ a příkaz spánku, který spustil „htg.sh“. Většinu času bude pro tuto službu pracovat příkaz spánku.

Také je zobrazeno posledních 10 záznamů deníku vytvořených touto službou. Není překvapením, že jsou všechny od sebe vzdálená jedna minuta.

Zastavení a deaktivace služby

Pokud potřebujete službu zastavit, můžete tak učinit pomocí tohoto příkazu:

sudo systemctl stop htg.service

Tím se služba zastaví, ale nezabrání to v restartování při příštím restartování počítače. Chcete-li zastavit spouštění služby při spuštění, musíte ji zakázat:

sudo systemctl disable htg.service

Pokud je služba spuštěna, tento příkaz ji nezastaví. Jednoduše řekne systemd, aby službu nespouštěl při příštím restartu.

Pokud chcete službu zastavit a zabránit jejímu spuštění při startu, použijte oba příkazy.

Servisní tip

Ujistěte se, že váš program běží podle očekávání, než jej zkusíte spustit jako službu.