Systemd, script interaktiboak eta tenporizadoreak

Systemd, script interaktiboak eta tenporizadoreak

Sarrera

Linuxerako garatzean, sistema piztean edo itzaltzean exekutatzen diren script interaktiboak sortzeko zeregina sortzen da. V sisteman hau erraza zen, baina systemd-ekin doikuntzak egiten ditu. Baina bere tenporizadoreak izan ditzake.

Zergatik behar ditugu helburuak?

Askotan idazten da helburua V -init sisteman exekuzio-mailaren analogo gisa balio duela. Funtsean ez nago ados. Gehiago daude eta paketeak taldetan banatu ditzakezu eta, adibidez, zerbitzu talde bat abiarazi komando batekin eta ekintza osagarriak egin ditzakezu. Gainera, ez dute hierarkiarik, menpekotasunak baizik.

Helburuaren adibidea gaituta dagoenean (eginbideen ikuspegi orokorra) script interaktiboa martxan dagoenean

Helburuaren beraren deskribapena:

cat installer.target
[Unit]
Description=My installer
Requires=multi-user.target 
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target 
AllowIsolate=yes
Wants=installer.service

Helburu hau multi-user.target abiarazten denean eta installer.service deitzen duenean hasiko da. Hala ere, horrelako zerbitzu ugari egon daitezke.

cat installer.service
[Unit]
# описаниС
Description=installer interactive dialog

[Service]
# Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎ
Type=idle
# Команда запуска - Π²Ρ‹Π·ΠΎΠ² скрипта
ExecStart=/usr/bin/installer.sh
# Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ взаимодСйствиС с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Ρ‡Π΅Ρ€Π΅Π· tty3
StandardInput=tty
TTYPath=/dev/tty3
TTYReset=yes
TTYVHangup=yes

[Install]
WantedBy=installer.target

Eta azkenik, exekutatzen ari den scriptaren adibide bat:

#!/bin/bash
# ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π² tty3
chvt 3
echo "Install, y/n ?"
read user_answer

Garrantzitsuena final.target hautatzea da, sistema abiaraztean iritsi behar den helburua. Abiarazteko prozesuan, systemd-ek mendekotasunetatik igaroko du eta behar duen guztia abiaraziko du.
Final.target hautatzeko modu desberdinak daude, horretarako loader aukera erabili dut.

Azken aurkezpena honelakoa da:

  1. Abio-kargatzailea abiarazten da
  2. Abio-kargatzailea firmwarea abiarazten hasten da final.target parametroa pasatuz
  3. Systemd sistema abiarazten hasten da. Sekuentzialki installer.target edo work.target-era doa basic.target-tik haien menpekotasunen bidez (adibidez, multi-erabiltzaile.target). Azken hauek sistema nahi den moduan lanera ekartzen dute

Firmwarea abiarazteko prestatzen

Firmwarea sortzean, sistemaren egoera abiarazteko eta itzaltzean gordetzea beti sortzen da. Egoera esan nahi du konfigurazio fitxategiak, datu-baseen iraulketak, interfazearen ezarpenak, etab.

Systemd-ek helburu berean exekutatzen ditu prozesuak paraleloki. Scripten abiarazte-sekuentzia zehazteko aukera ematen duten mendekotasunak daude.

Nola funtzionatzen du nire proiektuan ( https://habr.com/ru/post/477008/ https://github.com/skif-web/monitor)

  1. Sistema hasten da
  2. settings_restore.service zerbitzua abiarazten da. Datuen atalean settings.txt fitxategia dagoen egiaztatzen du. Bertan ez badago, erreferentzia-fitxategi bat jarriko da bere lekuan. Ondoren, sistemaren ezarpenak berrezartzen dira:
    • administratzailearen pasahitza
    • ostalari izena,
    • ordu eremu
    • lokala
    • Euskarri guztiak erabiltzen diren ala ez zehazten du. Lehenespenez, irudiaren tamaina txikia da - euskarrietan kopiatzeko eta grabatzeko erraztasunerako. Abiaraztean, oraindik erabiltzen ez den lekurik dagoen egiaztatzen du. Bada, diskoa birpartizionatu egiten da.
    • MAC helbidetik makina-id sortzea. Hau garrantzitsua da DHCP bidez helbide bera lortzeko
    • Sarearen ezarpenak
    • Erregistroen tamaina mugatzen du
    • Kanpoko unitatea lanerako prestatzen ari da (dagokion aukera gaituta badago eta disko berria bada)
  3. Hasi postgresq
  4. Berreskuratze zerbitzua hasten da. Zabbix bera eta bere datu-basea prestatzeko beharrezkoa da:
    • Zabbix datu-baserik ba ote dagoen egiaztatzen du. Hala ez bada, hasierako iraulketetatik sortzen da (zabbix-ekin barne)
    • ordu-eremuen zerrenda sortzen da (web interfazean bistaratzeko beharrezkoa da)
    • Uneko IPa aurkitzen da, arazoan bistaratzen da (kontsolan saioa hasteko gonbidapena)
  5. Gonbidapena aldatzen da - Lanerako prest esaldia agertzen da
  6. Firmwarea erabiltzeko prest dago

Zerbitzu-fitxategiak garrantzitsuak dira, haiek dira abiarazteko sekuentzia ezartzen dutenak

[Unit]
Description=restore system settings
Before=network.service prepare.service postgresql.service systemd-networkd.service systemd-resolved.service

[Service]
Type=oneshot
ExecStart=/usr/bin/settings_restore.sh

[Install]
WantedBy=multi-user.target

Ikusten duzunez, mendekotasunak instalatu nituen nire script-ak lehenik funtziona zezan, eta orduan bakarrik igoko zen sarea eta DBMSa abiaraziko zen.

Eta bigarren zerbitzua (zabbix prestaketa)

#!/bin/sh
[Unit]
Description=monitor prepare system
After=postgresql.service settings_restore.service
Before=zabbix-server.service zabbix-agent.service

[Service]
Type=oneshot
ExecStart=/usr/bin/prepare.sh

[Install]
WantedBy=multi-user.target

Hemen pixka bat konplikatuagoa da. Abiaraztea multi-user.target-en ere badago, baina postgresql DBMS eta nire setting_restore hasi ONDOREN. Baina zabbix zerbitzuak hasi AURRETIK.

Logrotaterako tenporizadore-zerbitzua

Systemd-ek CRON ordezkatu dezake. Serio. Gainera, zehaztasuna ez da minuturainokoa, segundorainokoa baizik (zer behar bada).Edo tenporizadore monotono bat sor dezakezu, gertaera bateko denbora-muga batek deituta.
Tenporizadore monotonoa zen nik sortu nuen makina abiaraztetik denbora zenbatzen duena.
Horretarako 2 fitxategi beharko dira
logrotateTimer.service - zerbitzuaren benetako deskribapena:

[Unit]
Description=run logrotate

[Service]
ExecStart=logrotate /etc/logrotate.conf
TimeoutSec=300

Erraza da: abiarazteko komandoaren deskribapena.
logrotateTimer.timer bigarren fitxategia da tenporizadoreek lan egiten duten lekua:

[Unit]
Description=Run logrotate

[Timer]
OnBootSec=15min
OnUnitActiveSec=15min

[Install]
WantedBy=timers.target

Zer dago hemen:

  • tenporizadorearen deskribapena
  • Hasierako lehen ordua, sistemaren abiaraztetik hasita
  • abian jartzeko aldia
  • Tenporizadore-zerbitzuaren menpekotasuna.Izan ere, horixe da tenporizadorea egiten duen katea

Script interaktiboa itzaltzean eta itzaltzeko helburua

Beste garapen batean, makina itzaltzeko bertsio konplexuago bat egin behar izan nuen - nire helburuaren bidez, ekintza asko egiteko. Normalean oneshot zerbitzu bat sortzea gomendatzen da RemainAfterExit aukerarekin, baina honek script interaktibo bat sortzea eragozten du.

Baina kontua da ExecOnStop aukerak abiarazitako komandoak TTYtik kanpo exekutatzen direla! Egiaztatzeko erraza da - itsatsi tty komandoa eta gorde bere irteera.

Hori dela eta, itzaltzea inplementatu nuen nire xedearen bidez. Ez dut %100 zuzena naizenik esaten, baina funtzionatzen du!
Nola egin zen (modu orokorrean):
my_shutdown.target helburu bat sortu nuen, inoren menpe ez zegoena:
nire_itxiera.helburua

[Unit]
Description=my shutdown
AllowIsolate=yes
Wants=my_shutdown.service 

Helburu honetara joatean (systemctl isolate my_shutdwn.target bidez), my_shutdown.service zerbitzua abiarazi zuen, eta horren zeregina erraza da - my_shutdown.sh script-a exekutatzeko:

[Unit]
Description=MY shutdown

[Service]
Type=oneshot
ExecStart=/usr/bin/my_shutdown.sh
StandardInput=tty
TTYPath=/dev/tty3
TTYReset=yes
TTYVHangup=yes

WantedBy=my_shutdown.target

  • Script honen barruan beharrezko ekintzak egiten ditut. Helburuari script asko gehi ditzakezu malgutasuna eta erosotasuna lortzeko:

nire_itxiera.sh

#!/bin/bash --login
if [ -f /tmp/reboot ];then
    command="systemctl reboot"
elif [ -f /tmp/shutdown ]; then
    command="systemctl poweroff"
fi
#Π’ΠΎΡ‚ здСсь Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
#НапримСр, cp /home/user/data.txt /storage/user/
    $command

Ohar. /tmp/reboot eta /tmp/shutdown fitxategiak erabiliz. Ezin duzu helburura deitu parametroekin. Zerbitzua soilik posible da.

Baina target erabiltzen dut lanean malgutasuna eta ekintzen ordena bermatua izateko.

Hala ere, interesgarriena geroago etorri zen. Makina itzali/berrabiarazi behar da. Eta 2 aukera daude:

  • Ordezkatu berrabiarazi, itzali eta beste komando batzuk (oraindik systemctl-rako esteka sinbolikoak dira) zure scriptarekin. Scriptaren barruan, joan my_shutdown.target atalera. Eta helburu barruko scriptek, ondoren, systemctl zuzenean deitzen dute, adibidez, systemctl berrabiarazi
  • Aukera sinpleagoa, baina ez zait gustatzen. Interfaze guztietan, ez deitu shutdown/reboot/other, baizik eta zuzenean deitu xede systemctl isolate my_shutdown.target

Lehenengo aukera aukeratu nuen. Systemd-en, berrabiarazi (poweroff bezala) systemd-rako esteka sinbolikoak dira.

ls -l /sbin/poweroff 
lrwxrwxrwx 1 root root 14 сСн 30 18:23 /sbin/poweroff -> /bin/systemctl

Hori dela eta, zure scriptekin ordezka ditzakezu:
berrabiarazi

#!/bin/sh
    touch /tmp/reboot
    sudo systemctl isolate my_shutdown.target
fi

Iturria: www.habr.com

Gehitu iruzkin berria