Cum să rulați un program Linux la pornire cu systemd
Publicat: 2022-01-29Trebuie 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 pentrusystemd
- 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
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.
Scenariul nu face mare lucru, dar există câteva puncte care merită remarcate.
- Cele două linii de
echo
sunt transmise prinsystemd-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.
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.
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 deExecStart
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 luisystemctl
să oprească serviciul. Avem acest lucru setat la „procesează”. Acest lucru face casystemd
să utilizeze semnalulSIGTERM
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
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.
- 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, comandasleep
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 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.
Comenzi Linux | ||
Fișiere | tar · pv · cat · tac · chmod · grep · diff · sed · ar · om · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · tip · redenumire · zip · dezarhivare · montare · demontare · instalare · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm | |
Procese | alias · ecran · sus · frumos · renice · progres · strace · systemd · tmux · chsh · istoric · la · lot · gratuit · care · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · da · kill · sleep · sudo · su · time · groupadd · usermod · grupuri · lshw · shutdown · repornire · stop · poweroff · passwd · lscpu · crontab · data · bg · fg | |
Rețele | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw |
LEGATE: Cele mai bune laptopuri Linux pentru dezvoltatori și entuziaști