Cum să rulați un program Linux la pornire cu systemd

Dorești să inițiezi un program Linux la pornirea sistemului? Systemd, componenta software, oferă o metodă eficientă pentru a realiza acest lucru pe orice distribuție Linux care utilizează systemd, incluzând majoritatea distribuțiilor actuale, cum ar fi Ubuntu. Acest ghid te va conduce prin procesul de creare a unui serviciu integrat, care comunică chiar și cu jurnalul de sistem.

Acest tutorial demonstrează configurarea unui serviciu de sistem care se activează la pornirea sistemului. Pentru a lansa un program cu interfață grafică la conectarea utilizatorului, utilizează în schimb funcțiile de management al pornirii specifice mediului desktop.

Executarea programelor la inițializarea sistemului

Uneori, software-ul pe care îl instalezi pe calculator se integrează cu procesul de pornire Linux, astfel încât programul este inițiat automat la fiecare pornire a sistemului. Poți obține același comportament pentru programele și scripturile tale, sau, de fapt, orice alt program existent pe sistemul tău.

Programele care sunt lansate automat la pornire sunt gestionate de systemd, administratorul de sistem și servicii. Systemd este primul proces care rulează la pornirea sistemului. Întotdeauna are identificatorul de proces (PID) 1. Orice alt proces care rulează pe sistem este inițiat de systemd, sau de un alt proces inițiat anterior de acesta.

Programele care rulează în fundal sunt denumite daemoni sau servicii. Litera „d” din finalul cuvântului systemd indică un daemon. În acest articol, vom exemplifica crearea unui serviciu. Pentru a satisface toate cerințele, serviciul nostru trebuie să fie:

Integrat cu systemd printr-un fișier de unitate de serviciu
Activat la pornirea sistemului
Controlabil prin comanda systemctl, interfața de control pentru systemd
Capabil să scrie informații în jurnalul de sistem.

Crearea scriptului pentru serviciu

Avem nevoie de un program pe care systemd să-l poată lansa. Vom crea un script simplu, numit „htg.sh”. Acest tutorial utilizează editorul de text Gedit, dar poți folosi orice alt editor de text.

touch htg.sh
gedit htg.sh

Editorul Gedit se va deschide. Copiază și inserează următorul cod în 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

Salvează modificările și închide editorul.

Scriptul nu face operații complexe, dar câteva aspecte sunt demne de menționat.

Cele două linii cu comanda eco sunt direcționate prin systemd-cat, un program care preia ieșirea unui program și o direcționează către jurnalul de sistem. Înregistrările din jurnal au o anumită prioritate. Utilizăm opțiunea -p (prioritate) pentru a indica faptul că mesajele noastre sunt doar informative. Nu sunt erori sau avertismente importante.
Scriptul conține o buclă while infinită.
Variabila TIMESTAMP este setată la data și ora curentă. Aceasta este formatată într-un mesaj și trimisă în jurnal.
Apoi, scriptul intră în starea de repaus pentru 60 de secunde.
După 60 de secunde, bucla se reia. Astfel, acest script scrie un mesaj cu marcaj temporal în jurnal o dată pe minut.

Vom copia scriptul în directorul /usr/local/bin.

sudo cp htg.sh /usr/local/bin

Și trebuie să-l facem executabil:

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

Crearea fișierului de unitate pentru serviciu

Fiecare program lansat de systemd are un fișier de definiție, numit fișier de unitate de serviciu. Acesta conține diverse atribute pe care systemd le utilizează pentru a localiza și a iniția programul, definind totodată o parte din comportamentul acestuia.

Trebuie să creăm un fișier unitar pentru noul nostru serviciu, dar este recomandat să verificăm dacă niciunul dintre fișierele unitare existente nu are numele pe care îl dorim pentru noul nostru serviciu.

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

Poți consulta lista de fișiere unitare, care este ordonată alfabetic, și poți verifica dacă numele pe care dorești să-l folosești nu este deja atribuit.

Serviciul nostru se va numi „htg.service”. Niciun fișier unitar nu are acest nume, așa că putem continua cu crearea fișierului unitar.

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

Editorul Gedit se va deschide. Copiază și inserează următorul cod în editor:

[Unit]
Description=Exemplu de serviciu How-To Geek

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

Salvează modificările și închide editorul.

Intrările au următoarele semnificații. Acestea sunt intrări tipice. Serviciul nostru simplu nu necesită majoritatea acestora, dar includerea lor ne permite să le explicăm.

Description: o descriere text a serviciului.
Wants: serviciul nostru dorește, dar nu este necesar, ca rețeaua să fie activă înainte de a porni serviciul.
After: o listă de nume de unități care ar trebui să fie pornite după ce acest serviciu a fost pornit cu succes, dacă nu rulează deja.
Type: setat la „simple”. systemd va considera că acest serviciu a pornit imediat ce procesul specificat de ExecStart a fost bifurcat.
ExecStart: calea către procesul care trebuie lansat.
Restart: când și dacă serviciul trebuie repornit. Este setat la „on-failure” (la eșec).
RestartSec: timpul de așteptare înainte de a încerca repornirea serviciului. Această valoare este în secunde.
KillMode: definește modul în care systemd va opri procesul dacă îi cerem lui systemctl să oprească serviciul. L-am setat la „process”. Aceasta face ca systemd să utilizeze semnalul SIGTERM doar pe procesul principal. Dacă serviciul nostru ar fi un program mai complex în loc de un script simplu, l-am seta la „mixed” pentru a ne asigura că toate procesele generate sunt oprite.
WantedBy: setat la „multi-user.target”, ceea ce înseamnă că serviciul trebuie să fie pornit atâta timp cât sistemul este într-o stare în care mai mulți utilizatori se pot conecta, indiferent dacă este disponibilă sau nu o interfață grafică.

Fișierul unității nu trebuie să fie executabil, dar permisiunile pentru fișierul unității ar trebui să limiteze cine îl poate edita. Nu vrei ca un utilizator rău intenționat să modifice fișierul unității, astfel încât să ruleze un program diferit.

Această comandă va oferi proprietarului permisiuni de citire și scriere, și permisiuni de citire pentru grup. Alții nu vor avea permisiuni.

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

Putem cere lui systemctl să verifice sintaxa fișierului nostru unitate, chiar dacă serviciul nu rulează încă. Orice erori vor fi raportate. (De fapt, partea „.service” este opțională pentru majoritatea comenzilor.)

systemctl status htg.service

Nu sunt evidențiate erori, ceea ce indică faptul că fișierul nostru unitate are o sintaxă corectă.

Pornirea serviciului

Atunci când adaugi un fișier unitate nou sau editezi unul existent, trebuie să notifici systemd pentru a reîncărca definițiile fișierului unitate.

sudo systemctl daemon-reload

Dacă dorești ca un serviciu să fie inițiat la pornire, trebuie să-l activezi:

sudo systemctl enable htg

Activarea unui serviciu nu-l pornește, ci doar îl setează pentru a fi lansat în momentul pornirii. Pentru a porni serviciul acum, trebuie să utilizezi comanda systemctl cu opțiunea de pornire.

sudo systemctl start htg

Verificarea funcționării serviciului

După pornirea manuală a serviciului sau după repornirea sistemului, putem verifica dacă serviciul nostru rulează corect.

sudo systemctl status htg.service

Starea serviciului este afișată.

Punctul verde indică faptul că serviciul nostru funcționează corespunzător.
Numele serviciului este „htg.service”, iar descrierea detaliată este cea pe care am specificat-o în fișierul unitate.
Ni se arată ce fișier unitate a fost încărcat „/etc/systemd/system/htg.service”.
Serviciul este activ, iar ora de pornire a serviciului este listată.
PID-ul său este 7762.
Există două sarcini asociate serviciului.
Un total de 928 Kibiobiți de memorie sunt utilizați de serviciu.
Grupul de control include scriptul „htg.sh” și comanda de repaus, care a fost lansată de „htg.sh”. De cele mai multe ori, comanda de repaus va realiza sarcina pentru acest serviciu.

De asemenea, ni se afișează ultimele 10 înregistrări din jurnal produse de acest serviciu. Nu este surprinzător că sunt înregistrate la intervale de un minut.

Oprirea și dezactivarea serviciului

Dacă este necesar să oprești serviciul, poți face acest lucru cu următoarea comandă:

sudo systemctl stop htg.service

Aceasta oprește serviciul, dar nu împiedică repornirea acestuia la următoarea repornire a computerului. Pentru a opri lansarea serviciului la pornire, trebuie să-l dezactivezi:

sudo systemctl disable htg.service

Dacă serviciul rulează, această comandă nu îl oprește. Pur și simplu îi spune lui systemd să nu lanseze serviciul la următoarea repornire.

Dacă vrei să oprești serviciul și să împiedici lansarea acestuia la pornire, utilizează ambele comenzi.

Recomandări

Asigură-te că programul rulează conform așteptărilor înainte de a încerca să-l lansezi ca serviciu.