Si të ekzekutoni një program Linux në fillimin me systemd


Keni nevojë për të nisur një program Linux në nisje? Softueri systemd ofron një mënyrë për ta bërë atë në çdo shpërndarje Linux me systemd - që është shumica e tyre këto ditë, duke përfshirë Ubuntu. Ne do t'ju përcjellim në procesin e krijimit të një shërbimi të integruar—dhe madje ai flet me ditarin.

Ky udhëzues tregon se si të konfiguroni një shërbim të sistemit që fillon kur filloni sistemin tuaj. Për të nisur një program grafik kur identifikoheni, përdorni menaxherin e fillimit të desktopit tuaj.

Ekzekutimi i programeve në fillim

Ndonjëherë softueri që instaloni në kompjuterin tuaj lidhet me procesin e nisjes së Linux-it, në mënyrë që programi të hapet automatikisht sa herë që kompjuteri niset. Ju mund ta arrini lehtësisht të njëjtën sjellje me programet dhe skriptet tuaja, ose në fakt çdo program tjetër që është në kompjuterin tuaj.

Programet që lansohen në fillim kontrollohen nga systemd, menaxheri i sistemit dhe i shërbimit. systemd është procesi i parë që ekzekutohet në fillim. Gjithmonë ka ID-në e procesit (PID) 1. Çdo proces tjetër që ekzekutohet në kompjuterin tuaj niset nga systemd ose nga një proces që systemd ka filluar tashmë.

Programet që funksionojnë në sfond quhen demonë ose shërbime. d në fund të systemd qëndron për demon. Në këtë artikull, ne do të krijojmë një shërbim shembull. Për të shënuar të gjitha kutitë, shërbimi ynë duhet të jetë:

  • I integruar me systemd përmes një skedari të njësisë së shërbimit
  • Lansuar në fillim
  • E kontrollueshme duke përdorur systemctl, ndërfaqen e kontrollit për systemd
  • Në gjendje të shkruaj në ditar

Krijimi i Programit të Shërbimit

Duhet të kemi një program që do të nisë systemd. Ne do të krijojmë një skenar të thjeshtë, të quajtur htg.sh. Ky tutorial përdor redaktuesin e tekstit Gedit, por ju mund të përdorni cilindo redaktues teksti që preferoni.

touch htg.sh
gedit htg.sh

Redaktori gedit do të hapet. Kopjoni dhe ngjisni tekstin e mëposhtëm në redaktues.

#!/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

Ruani ndryshimet tuaja dhe mbyllni redaktorin.

Skenari nuk bën shumë, por ka disa pika që ia vlen të përmenden.

  • Dy linjat echo dërgohen përmes systemd-cat, një program që merr daljen nga një program dhe e dërgon atë në ditar. Regjistrimet në ditar kanë përparësi. Ne po përdorim opsionin -p (përparësi) për të treguar se mesazhet tona janë vetëm për informacion (info). Nuk janë gabime apo paralajmërime të rëndësishme.
  • Ka një lak të pafund while.
  • Ndryshorja TIMESTAMP është caktuar në datën dhe orën aktuale. Ky formatohet në një mesazh dhe dërgohet në ditar.
  • Skenari më pas fle për 60 sekonda.
  • Pas 60 sekondash cikli përsëritet. Pra, ky skenar shkruan një mesazh të vulosur me kohë në ditar një herë në minutë.

Ne do ta kopjojmë skriptin në drejtorinë /usr/local/bin.

sudo cp htg.sh /usr/local/bin

Dhe ne duhet ta bëjmë atë të ekzekutueshme:

sudo chmod +x /usr/local/bin/htg.sh

Krijimi i skedarit të njësisë së shërbimit

Çdo program që niset nga systemd ka një skedar përkufizimi, i quajtur skedar i njësisë së shërbimit. Kjo përmban disa atribute që systemd mund t'i përdorë për të lokalizuar dhe nisur programin dhe për të përcaktuar disa nga sjelljet e tij.

Ne duhet të krijojmë një skedar njësi për shërbimin tonë të ri, por është e kujdesshme të sigurohemi që asnjë nga skedarët e njësisë ekzistuese të mos ketë emrin që duam t'i japim shërbimit tonë të ri.

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

Mund të lëvizni nëpër listën e skedarëve të njësive, e cila është renditur sipas alfabetit, dhe të kontrolloni që emri që dëshironi të përdorni të mos jetë marrë.

Shërbimi ynë do të quhet htg.service. Asnjë skedar njësie nuk e ka atë emër, kështu që ne mund të vazhdojmë dhe të krijojmë skedarin tonë të njësisë.

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

Redaktori gedit do të hapet. Kopjoni dhe ngjisni tekstin e mëposhtëm në redaktues:

[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

Ruani ndryshimet tuaja dhe mbyllni redaktorin.

Regjistrimet kanë këto kuptime. Këto janë shënime tipike. Shërbimi ynë i thjeshtë në fakt nuk ka nevojë për shumicën e tyre, por përfshirja e tyre na lejon t'i shpjegojmë ato.

  • Përshkrim: Ky është një përshkrim me tekst i shërbimit tuaj.
  • Dëshiron: Shërbimi ynë dëshiron, por nuk kërkon që rrjeti të funksionojë përpara se të fillojë shërbimi ynë.
  • Pas: Një listë me emrat e njësive që duhen nisur pasi ky shërbim të jetë nisur me sukses, nëse nuk janë duke u ekzekutuar tashmë.
  • Lloji: E thjeshtë. systemd do ta konsiderojë këtë shërbim të nisur sapo procesi i specifikuar nga ExecStart të jetë ndërprerë.
  • ExecStart: Rruga drejt procesit që duhet të fillojë.
  • Rinisni: Kur dhe nëse shërbimi duhet të riniset. E kemi vendosur në në dështim.
  • RestartSec: Sa kohë duhet pritur përpara se të tentoni të rinisni shërbimin. Kjo vlerë është në sekonda.
  • KillMode: Përcakton se si systemd duhet ta vrasë procesin nëse i kërkojmë systemctl të ndalojë shërbimin. Ne e kemi këtë grup për të përpunuar. Kjo bën që systemd të përdorë sinjalin SIGTERM vetëm në procesin kryesor. Nëse shërbimi ynë do të ishte një program jo i parëndësishëm në vend të një skripti të thjeshtë, ne do ta vendosnim këtë në të përzier për të siguruar që çdo proces i krijuar të përfundonte gjithashtu.
  • WantedBy: Ne e kemi vendosur këtë në multi-user.target, që do të thotë se shërbimi duhet të fillojë për sa kohë që sistemi është në një gjendje ku shumë përdorues mund të identifikohen, pavarësisht nëse ose nuk disponohet një ndërfaqe grafike e përdoruesit.

Skedari i njësisë nuk ka nevojë të jetë i ekzekutueshëm, por lejet në skedarin e njësisë duhet të kufizojnë se kush mund ta modifikojë atë. Ju nuk dëshironi që një përdorues keqdashës ose keqbërës të ndryshojë skedarin e njësisë në mënyrë që ai të ekzekutojë një program tjetër krejtësisht.

Kjo komandë do t'i japë pronarit leje leximi dhe shkrimi, dhe leje leximi për grupin. Të tjerët nuk do të kenë leje.

sudo chmod 640 /etc/systemd/system/htg.service

Ne mund të kemi systemctl të kontrollojë sintaksën e skedarit tonë të njësisë për ne, edhe nëse shërbimi nuk po funksionon ende. Çdo gabim do të raportohet. (Në fakt, pjesa .service është opsionale për shumicën e komandave.)

systemctl status htg.service

Asnjë gabim nuk është theksuar, që do të thotë se skedari ynë i njësisë është sintaksorisht i saktë.

Fillimi i Shërbimit

Kur shtoni një skedar të ri njësie ose modifikoni një ekzistues, duhet t'i tregoni systemd që të rifreskojë përkufizimet e skedarit të njësisë.

sudo systemctl daemon-reload

Nëse dëshironi që një shërbim të nisë në fillim, duhet ta aktivizoni atë:

sudo systemctl enable htg

Aktivizimi i një shërbimi nuk e nis atë, ai vendos vetëm që të nisë në kohën e nisjes. Për të nisur shërbimin tani, duhet të përdorni systemctl me opsionin start.

sudo systemctl start htg

Verifikimi i Shërbimit

Pas nisjes manuale të shërbimit ose pas rinisjes së kompjuterit, ne mund të verifikojmë që shërbimi ynë funksionon siç duhet.

sudo systemctl status htg.service

Statusi i shërbimit shfaqet për ne.

  • Pika jeshile do të thotë se shërbimi ynë funksionon pa probleme.
  • Emri i shërbimit është htg.service dhe përshkrimi i gjatë është ai që kemi dhënë në skedarin e njësisë.
  • Na tregohet se cili skedar i njësisë është ngarkuar /etc/systemd/system/htg.service.
  • Shërbimi është aktiv dhe koha kur u hap shërbimi është e listuar për ne.
  • PID e tij është 7762.
  • Ka dy detyra që lidhen me shërbimin.
  • Një total prej 928 Kibibajt memorie po përdoren nga shërbimi.
  • Grupi i kontrollit përfshin skriptin htg.sh dhe komandën sleep, e cila është nisur nga htg.sh. Shumicën e kohës, komanda sleep do të kryejë punën për këtë shërbim.

Na janë shfaqur gjithashtu 10 shënimet e fundit të ditarit të prodhuara nga ky shërbim. Çuditërisht, ata janë të gjithë një minutë diferencë.

Ndalimi dhe çaktivizimi i Shërbimit

Nëse keni nevojë të ndaloni shërbimin, mund ta bëni këtë me këtë komandë:

sudo systemctl stop htg.service

Kjo e ndalon shërbimin, por nuk e pengon atë të rifillojë herën tjetër që kompjuteri të rindizet. Për të ndaluar lëshimin e shërbimit në fillim, duhet ta çaktivizoni atë:

sudo systemctl disable htg.service

Nëse shërbimi po funksionon, kjo komandë nuk e ndalon atë. Thjesht i thotë systemd që të mos e nisë shërbimin në rindezjen tjetër.

Nëse dëshironi të ndaloni shërbimin dhe ta parandaloni nisjen e tij në fillim, përdorni të dyja komandat.

Këshillë shërbimi

Sigurohuni që programi juaj të funksionojë siç pritej përpara se të provoni ta nisni atë si shërbim.

RELATED: Best Linux Laptops for Developers and Enthusiasts