Želite da pokrenete neki Linux program prilikom podizanja sistema? Systemd softver pruža način da se to uradi na bilo kojoj Linux distribuciji koja koristi systemd – a većina ih koristi, uključujući Ubuntu. Proći ćemo kroz proces kreiranja integrisane usluge koja čak i komunicira sa logom.
Ovaj vodič pokazuje kako podesiti sistemsku uslugu koja startuje kada se sistem pokrene. Za pokretanje grafičkog programa prilikom prijavljivanja, koristite umesto toga menadžer pokretanja radne površine.
Pokretanje programa pri podizanju sistema
Ponekad, softver koji instalirate na računar se integriše u proces podizanja Linux-a, tako da se program automatski pokreće svaki put kada se računar upali. Istu ovu funkcionalnost možete lako postići sa sopstvenim programima i skriptama, ili bilo kojim drugim programom koji se nalazi na vašem računaru.
Programe koji se pokreću pri podizanju sistema kontroliše systemd, menadžer sistema i servisa. Systemd je prvi proces koji se pokreće prilikom startovanja sistema. On uvek ima ID procesa (PID) 1. Svaki drugi proces koji se pokreće na vašem računaru pokreće systemd ili neki proces koji je systemd već pokrenuo.
Programi koji rade u pozadini nazivaju se daemoni ili usluge. Slovo „d“ na kraju systemd označava daemon. U ovom članku kreiraćemo primer usluge. Da bi bila kompletna, naša usluga mora:
Biti integrisana sa systemd-om preko datoteke servisne jedinice.
Pokretati se pri podizanju sistema.
Moći da se kontroliše pomoću systemctl, kontrolnog interfejsa za systemd.
Moći da piše u log.
Kreiranje servisnog programa
Moramo imati program koji će systemd pokretati. Napravićemo jednostavnu skriptu, nazvanu „htg.sh“. Ovaj vodič koristi tekst editor Gedit, ali možete koristiti bilo koji tekst editor.
touch htg.sh
gedit htg.sh
Otvoriće se Gedit. Kopirajte i nalepite sledeći tekst u 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
Sačuvajte izmene i zatvorite editor.
Skripta ne radi mnogo, ali ima nekoliko tačaka koje je vredno napomenuti.
Dve echo linije prolaze kroz systemd-cat, program koji preuzima izlaz iz programa i šalje ga u log. Unosi u log imaju prioritet. Koristimo opciju -p (prioritet) da označimo da su naše poruke samo informativne (info). To nisu važne greške ili upozorenja.
Postoji beskonačna while petlja.
Promenljiva TIMESTAMP je postavljena na trenutni datum i vreme. Ovo se formatira u poruku i šalje u log.
Skripta zatim spava 60 sekundi.
Nakon 60 sekundi petlja se ponavlja. Dakle, ova skripta upisuje vremensku poruku u log jednom u minutu.
Kopiraćemo skriptu u direktorijum /usr/local/bin.
sudo cp htg.sh /usr/local/bin
I moramo je učiniti izvršnom:
sudo chmod +x /usr/local/bin/htg.sh
Kreiranje datoteke servisne jedinice
Svaki program koji pokreće systemd ima datoteku definicije, koja se naziva datoteka servisne jedinice. Ona sadrži određene atribute koje systemd može koristiti da locira i pokrene program i da definiše neka od njegovih ponašanja.
Moramo kreirati jediničnu datoteku za našu novu uslugu, ali je pametno da proverimo da nijedna od postojećih datoteka jedinica nema ime koje želimo da damo našoj novoj usluzi.
sudo systemctl list-unit-files --type-service
Možete se kretati kroz listu datoteka jedinica, koja je poređana po abecednom redu, i proveriti da ime koje želite koristiti nije zauzeto.
Naša usluga će se zvati „htg.service“. Nijedna jedinica nema to ime, tako da možemo nastaviti i kreirati našu jediničnu datoteku.
sudo gedit /etc/systemd/system/htg.service
Otvoriće se Gedit. Kopirajte i nalepite sledeći tekst u 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
Sačuvajte izmene i zatvorite editor.
Unosi imaju ova značenja. Ovo su tipični unosi. Našoj jednostavnoj usluzi zapravo većina njih nije potrebna, ali njihovo uključivanje nam omogućava da ih objasnimo.
Opis: Ovo je tekstualni opis vaše usluge.
Želi: Naša usluga želi – ali ne zahteva – da mreža bude aktivna pre nego što se naša usluga pokrene.
Posle: Lista naziva jedinica koje treba pokrenuti nakon što je ova usluga uspešno pokrenuta, ako već nisu pokrenute.
Tip: Jednostavan. Systemd će smatrati da je ova usluga pokrenuta čim se proces koji je naveo ExecStart razdvoji.
ExecStart: Put do procesa koji treba da se pokrene.
Ponovo pokreni: Kada i ako uslugu treba ponovo pokrenuti. Postavili smo ga na „u slučaju kvara“.
RestartSec: Koliko dugo treba čekati pre nego što pokušate da ponovo pokrenete uslugu. Ova vrednost je u sekundama.
KillMode: Definiše kako systemd treba da „ubije“ proces ako tražimo od systemctl da zaustavi uslugu. Imamo ovo podešeno na „process“. Ovo uzrokuje da systemd koristi signal SIGTERM samo u glavnom procesu. Da je naša usluga netrivijalan program umesto jednostavne skripte, postavili bismo ovo na „mixed“ kako bismo osigurali da su svi pokrenuti procesi takođe prekinuti.
WantedBy: Ovo je podešeno na „multi-user.target“, što znači da servis treba da se pokrene sve dok je sistem u stanju u kojem više korisnika može da se prijavi, bez obzira da li je grafički korisnički interfejs dostupan ili ne.
Datoteka jedinice ne mora biti izvršna, ali dozvole za jediničnu datoteku treba da ograniče ko može da je uređuje. Ne želite da zlonamerni ili neposlušni korisnik menja datoteku jedinice tako da ona izvršava potpuno drugačiji program.
Ova komanda će vlasniku dati dozvole za čitanje i pisanje i dozvole za čitanje grupi. Drugi neće imati dozvole.
sudo chmod 640 /etc/systemd/system/htg.service
Možemo da nateramo systemctl da proveri sintaksu naše jedinice datoteke za nas, čak i ako usluga još nije pokrenuta. Sve greške će biti prijavljene. (U stvari, deo „.service“ je opcioni za većinu komandi.)
systemctl status htg.service
Nijedna greška nije istaknuta, što znači da je naša jedinica sintaksički ispravna.
Pokretanje usluge
Kada dodate novu jedinicu ili uredite postojeću, morate reći systemd-u da ponovo učita definicije jedinice datoteke.
sudo systemctl daemon-reload
Ako želite da se usluga pokrene pri pokretanju, morate je omogućiti:
sudo systemctl enable htg
Omogućavanje usluge ne pokreće je, već samo postavlja da se pokrene pri pokretanju. Da biste sada pokrenuli uslugu, morate koristiti systemctl sa opcijom start.
sudo systemctl start htg
Verifikacija usluge
Nakon ručnog pokretanja usluge ili nakon ponovnog pokretanja računara, možemo proveriti da li naša usluga radi ispravno.
sudo systemctl status htg.service
Status usluge je prikazan za nas.
Zelena tačka znači da naša usluga radi bez problema.
Naziv usluge je „htg.service“, a dug opis je onaj koji smo dali u jedinici.
Pokazano nam je koja je datoteka jedinice učitana „/etc/systemd/system/htg.service“.
Usluga je aktivna, a za nas je navedeno vreme kada je servis pokrenut.
Njegov PID je 7762.
Postoje dva zadatka povezana sa uslugom.
Ukupno 928 kibibajta memorije koristi servis.
Kontrolna grupa uključuje skriptu „htg.sh“ i komandu za spavanje, koju je pokrenuo „htg.sh“. Većinu vremena, komanda spavanja će obavljati posao za ovu uslugu.
Takođe nam je prikazano poslednjih 10 unosa u log koje je proizvela ova usluga. Nije iznenađujuće, svi su u razmaku od jednog minuta.
Zaustavljanje i onemogućavanje usluge
Ako treba da zaustavite uslugu, to možete učiniti sa ovom komandom:
sudo systemctl stop htg.service
Ovo zaustavlja uslugu, ali je ne sprečava da se ponovo pokrene sledeći put kada se računar ponovo pokrene. Da biste zaustavili pokretanje usluge pri pokretanju, potrebno je da je onemogućite:
sudo systemctl disable htg.service
Ako je usluga pokrenuta, ova komanda je ne zaustavlja. Jednostavno govori systemd-u da ne pokreće uslugu pri sledećem ponovnom pokretanju.
Ako želite zaustaviti uslugu i sprečiti da se pokrene pri pokretanju, koristite obe komande.
Servisni savet
Uverite se da vaš program radi kako se očekuje pre nego što pokušate da ga pokrenete kao uslugu.