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

Publicat: 2022-01-29
O fereastră de terminal stilizată pe un laptop.
Fatmawati Achmad Zaenuri/Shutterstock

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 , managerul de sistem și servicii. systemd este primul proces care rulează la pornire. Are întotdeauna un ID de proces (PID) 1. Orice alt proces care rulează pe computer este pornit de systemd sau de un proces pe care systemd a început deja.

Programele care rulează în fundal se numesc demoni 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 , interfața de control pentru systemd
  • Capabil să scrie în jurnal

Crearea programului de service

Trebuie să avem un program pe care systemd 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.

 atinge htg.sh
 gedit htg.sh 

Publicitate

Se va deschide editorul gedit . Copiați și inserați următorul text în editor.

 #!/bin/bash

echo „htg.service: ## Pornind ##” | info systemd-cat -p

in timp ce :
do
TIMESTAMP=$(data „+%Y-%m-%d %H:%M:%S”)
echo „htg.service: timestamp ${TIMESTAMP}” | info systemd-cat -p
dormi 60
Terminat

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

htg.sh script în editorul gedit

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

  • Cele două linii de echo sunt transmise prin systemd-cat , un program care preia rezultatul dintr-un program și îl 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.

Publicitate

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:

 [Unitate]
Descriere=Exemplu de serviciu Geek

Wants=network.target
După=syslog.target network-online.target

[Serviciu]
Tip=simplu
ExecStart=/usr/local/bin/htg.sh
Restart=la eșec
RestartSec=10
KillMode=proces

[Instalare]
WantedBy=multi-user.target

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

fișierul htg.service unit în editorul gedit

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.

  • 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 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 

Publicitate

Nu sunt evidențiate erori, ceea ce înseamnă că fișierul nostru de unitate este corect din punct de vedere sintactic.

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 start .

 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.

Starea htg.service într-o fereastră de terminal

  • 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 folosiți de serviciu.
  • Grupul de control include scriptul „htg.sh” și comanda de sleep , 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 

Publicitate

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 dezactivați 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.

LEGATE: Cele mai bune laptopuri Linux pentru dezvoltatori și entuziaști