03/29/2024

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

Trebuie să lansați un program Linux la pornire? Software-ul systemd oferă o modalitate de a face acest lucru pe orice distribuție Linux cu systemd – care este majoritatea acestora în zilele noastre, inclusiv Ubuntu. Vă vom ghida prin procesul de creare a unui serviciu integrat – și chiar vorbește cu jurnalul.

Acest tutorial demonstrează cum să configurați un serviciu de sistem care se lansează atunci când porniți sistemul. Pentru a lansa un program grafic atunci când vă conectați, utilizați în schimb managerul de pornire al desktopului.

Rularea programelor la pornire

Uneori, software-ul pe care îl instalați pe computer se conectează la procesul de pornire Linux, astfel încât programul este lansat automat de fiecare dată când computerul este pornit. Puteți obține cu ușurință același comportament cu propriile programe și scripturi sau, de fapt, cu orice alt program care se află pe computerul dvs.

Programele care sunt lansate la pornire sunt controlate de systemd, the sistem și serviciu administrator. systemd este primul proces care rulează la pornire. Întotdeauna a făcut-o ID proces (PID) 1. Orice alt proces care rulează pe computer este pornit de systemd sau de un proces care systemd a început deja.

Sunt apelate programele care rulează în fundal demonii sau servicii. „d” de la sfârșitul lui systemd înseamnă demon. În acest articol, vom crea un exemplu de serviciu. Pentru a bifa toate căsuțele, serviciul nostru trebuie să fie:

Integrat cu systemd printr-un fișier de unitate de serviciu
Lansat la pornire
Controlabil folosind systemctl, the interfata de control pentru systemd
Capabil să scrie în jurnal

Crearea programului de service

Trebuie să avem un program pe care systemd îl va lansa. Vom crea un script simplu, numit „htg.sh”. Acest tutorial folosește editorul de text Gedit, dar puteți folosi orice editor de text doriți.

touch htg.sh
gedit htg.sh

Se va deschide editorul gedit. Copiați și inserați următorul text î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

Salvați modificările și închideți editorul.

  Cum să utilizați comanda yes pe Linux

Scenariul nu face mare lucru, dar există câteva puncte care merită remarcate.

Cele două linii de eco sunt transmise prin systemd-cat, un program care preia ieșire dintr-un program și o trimite în jurnal. Intrările în jurnal au prioritate. Folosim opțiunea -p (prioritate) pentru a indica faptul că mesajele noastre sunt doar pentru informații (informații). Nu sunt erori sau avertismente importante.
Există o buclă while fără sfârșit.
Variabila TIMESTAMP este setată la data și ora curente. Acesta este formatat într-un mesaj și trimis în jurnal.
Apoi scriptul inactivează timp de 60 de secunde.
După 60 de secunde bucla se repetă. Deci, acest script scrie un mesaj marcat de timp î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 unității de service

Fiecare program pornit de systemd are un fișier de definiție, numit fișier de unitate de serviciu. Aceasta deține anumite atribute pe care systemd le poate folosi pentru a localiza și lansa programul și pentru a defini o parte din comportamentul acestuia.

Trebuie să creăm un fișier unitar pentru noul nostru serviciu, dar este prudent să ne asigurăm că niciunul dintre fișierele unitare existente nu are numele pe care vrem să-l acordăm noului nostru serviciu.

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

Puteți parcurge lista de fișiere de unitate, care este sortată alfabetic, și puteți verifica dacă numele pe care doriți să-l utilizați nu este luat.

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

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

Se va deschide editorul gedit. Copiați și inserați următorul text în 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

Salvați modificările și închideți editorul.

Intrările au aceste semnificații. Acestea sunt intrări tipice. Serviciul nostru simplu nu are nevoie de cele mai multe dintre ele, dar includerea lor ne permite să le explicăm.

  6 dintre cele mai bune teme de pictograme pentru Linux

Descriere: aceasta este o descriere text a serviciului dvs.
Dorește: serviciul nostru dorește, dar nu necesită, ca rețeaua să fie activă înainte de începerea serviciului nostru.
După: 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.
Tip: Simplu. systemd va considera acest serviciu început imediat ce procesul specificat de ExecStart a fost bifurcat.
ExecStart: Calea către procesul care ar trebui pornit.
Reporniți: când și dacă serviciul ar trebui repornit. L-am setat la „la eșec”.
RestartSec: Cât timp trebuie să așteptați înainte de a încerca să reporniți serviciul. Această valoare este în secunde.
KillMode: Definește modul în care systemd ar trebui să oprească procesul dacă îi cerem lui systemctl să oprească serviciul. Avem acest lucru setat la „procesează”. Acest lucru face ca systemd să utilizeze semnalul SIGTERM numai pe procesul principal. Dacă serviciul nostru ar fi un program non-trivial în loc de un script simplu, l-am seta la „mixt” pentru a ne asigura că toate procesele generate au fost, de asemenea, încheiate.
WantedBy: Avem acest set la „multi-user.target”, ceea ce înseamnă că serviciul ar trebui 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ă de utilizator.

Fișierul unității nu trebuie să fie executabil, dar permisiunile pentru fișierul unității ar trebui să restricționeze cine îl poate edita. Nu doriți ca un utilizator rău intenționat sau răutăcios să schimbe fișierul unității, astfel încât să execute un program complet 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 systemctl să verifice sintaxa fișierului nostru unitate pentru noi, 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 înseamnă că fișierul nostru de unitate este corect din punct de vedere sintactic.

  Cum să utilizați Nmap pe Linux pentru a vedea cine este în rețeaua dvs. Wi-Fi

Pornirea Serviciului

Când adăugați un fișier unitate nou sau editați unul existent, trebuie să spuneți systemd să reîncarce definițiile fișierului unității.

sudo systemctl daemon-reload

Dacă doriți ca un serviciu să fie lansat la pornire, trebuie să îl activați:

sudo systemctl enable htg

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

sudo systemctl start htg

Verificarea Serviciului

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

sudo systemctl status htg.service

Starea serviciului este afișată pentru noi.

Punctul verde înseamnă că serviciul nostru funcționează fără probleme.
Numele serviciului este „htg.service”, iar descrierea lungă este cea pe care am furnizat-o în fișierul unității.
Ni se arată ce fișier unitate a fost încărcat „/etc/systemd/system/htg.service”.
Serviciul este activ, iar ora lansării serviciului este listată pentru noi.
PID-ul său este 7762.
Există două sarcini asociate serviciului.
Un total de 928 Kibibytes de memorie sunt utilizate 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 sleep va face treaba pentru acest serviciu.

De asemenea, ni se arată ultimele 10 intrări de jurnal produse de acest serviciu. Deloc surprinzător, toate sunt la un minut una dintre ele.

Oprirea și dezactivarea serviciului

Dacă trebuie să opriți serviciul, puteți face acest lucru cu această comandă:

sudo systemctl stop htg.service

Acest lucru oprește serviciul, dar nu îl împiedică să repornească data viitoare când computerul este repornit. Pentru a opri lansarea serviciului la pornire, trebuie să-l dezactivați:

sudo systemctl disable htg.service

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

Dacă doriți să opriți serviciul și să împiedicați lansarea acestuia la pornire, utilizați ambele comenzi.

Sfat de service

Asigurați-vă că programul rulează așa cum vă așteptați înainte de a încerca să-l lansați ca serviciu.