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