Systemd, skripts interattivi u tajmers

Systemd, skripts interattivi u tajmers

Introduzzjoni

Meta tiżviluppa għal-Linux, iqum il-kompitu li jinħolqu skripts interattivi li jiġu eżegwiti meta s-sistema tinxtegħel jew tintefa. Fis-sistema V dan kien faċli, iżda bis-systemd jagħmel aġġustamenti. Iżda jista 'jkollha t-tajmers tagħha stess.

Għaliex għandna bżonn miri?

Ħafna drabi huwa miktub li l-mira sservi bħala analogu ta 'runlevel fis-sistema V -init. Jien ma naqbilx fundamentalment. Hemm aktar minnhom u tista 'taqsam pakketti fi gruppi u, pereżempju, tniedi grupp ta' servizzi bi kmand wieħed u twettaq azzjonijiet addizzjonali. Barra minn hekk, m'għandhom l-ebda ġerarkija, biss dipendenzi.

Eżempju ta' mira meta tkun attivata (ħarsa ġenerali tal-karatteristika) b'kitba interattiva li taħdem

Deskrizzjoni tal-mira nnifisha:

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

Din il-mira tibda meta jitnieda multi-user.target u jsejjaħ installer.service. Madankollu, jista' jkun hemm diversi servizzi bħal dawn.

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

U fl-aħħarnett, eżempju tal-iskrittura li qed titwettaq:

#!/bin/bash
# Переходим в tty3
chvt 3
echo "Install, y/n ?"
read user_answer

L-iktar ħaġa importanti hija li tagħżel final.target - il-mira li għaliha għandha tasal is-sistema fl-istartjar. Matul il-proċess tal-istartjar, systemd se jgħaddi mid-dipendenzi u jniedi dak kollu li għandu bżonn.
Hemm modi differenti biex tagħżel final.target, użajt l-għażla tal-loader għal dan.

It-tnedija finali tidher bħal din:

  1. Il-bootloader jibda
  2. Il-bootloader jibda jniedi l-firmware billi jgħaddi l-parametru final.target
  3. Systemd jibda jibda s-sistema. Sekwenzjali jmur għal installer.target jew work.target minn basic.target permezz tad-dipendenzi tagħhom (per eżempju, multi-user.target). Dawn tal-aħħar iġibu s-sistema taħdem fil-mod mixtieq

Tħejjija tal-firmware għat-tnedija

Meta toħloq il-firmware, dejjem iqum il-kompitu li tirrestawra l-istat tas-sistema fl-istartjar u tissejvjah meta tintefa. Stat tfisser fajls tal-konfigurazzjoni, dumps tad-database, settings tal-interface, eċċ.

Systemd imexxi proċessi fl-istess mira b'mod parallel. Hemm dipendenzi li jippermettulek tiddetermina s-sekwenza tal-istartjar tal-iskripts.

Kif taħdem fil-proġett tiegħi ( https://habr.com/ru/post/477008/ https://github.com/skif-web/monitor)

  1. Is-sistema tibda
  2. Is-servizz settings_restore.service jiġi mniedi. Jiċċekkja l-preżenza tal-fajl settings.txt fit-taqsima tad-dejta. Jekk ma jkunx hemm, imbagħad jitqiegħed fajl ta 'referenza f'postha. Imbagħad, is-settings tas-sistema jiġu restawrati:
    • password tal-amministratur
    • hostname,
    • żona tal-ħin
    • lokalità
    • Jiddetermina jekk il-midja kollha tkunx qed tintuża. B'mod awtomatiku, id-daqs ta 'l-immaġini huwa żgħir - għal faċilità ta' ikkupjar u reġistrazzjoni fuq il-midja. Fl-istartjar, jiċċekkja biex jara jekk għadx hemm spazju mhux użat. Jekk ikun hemm, id-diska tiġi ripartizzjonata.
    • Ġenerazzjoni tal-magna-id mill-indirizz MAC. Dan huwa importanti biex jinkiseb l-istess indirizz permezz tad-DHCP
    • Issettjar tan-netwerk
    • Illimita d-daqs taz-zkuk
    • Id-drajv estern qed jitħejja għax-xogħol (jekk l-għażla korrispondenti hija attivata u d-drajv huwa ġdid)
  3. Ibda postgresq
  4. Is-servizz tar-restawr jibda. Huwa meħtieġ biex tipprepara zabbix innifsu u d-database tiegħu:
    • Jiċċekkja jekk diġà hemmx database zabbix. Jekk le, hija maħluqa minn miżbliet ta 'inizjalizzazzjoni (inklużi ma' zabbix)
    • tinħoloq lista ta' żoni tal-ħin (meħtieġa biex jintwerew fl-interface tal-web)
    • L-IP attwali jinstab, huwa muri fil-ħruġ (stedina biex tidħol fil-console)
  5. L-istedina tinbidel – tidher il-frażi Lest għax-xogħol
  6. Il-firmware huwa lest għall-użu

Il-fajls tas-servizz huma importanti, huma dawk li jistabbilixxu s-sekwenza tat-tnedija tagħhom

[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

Kif tistgħu taraw, installajt id-dipendenzi sabiex l-iskrittura tiegħi l-ewwel taħdem, u mbagħad biss in-netwerk jitla’ u jibda d-DBMS.

U t-tieni servizz (preparazzjoni zabbix)

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

Huwa ftit aktar ikkumplikat hawn It-tnedija hija wkoll f'multi-user.target, iżda WARA li nibda l-DBMS postgresql u setting_restore tiegħi. Imma QABEL nibdew is-servizzi zabbix.

Servizz ta' timer għal logrotate

Systemd jista 'jissostitwixxi CRON. Serjament. Barra minn hekk, l-eżattezza mhix sal-minuta, iżda sat-tieni (x'jiġri jekk ikun meħtieġ jew tista 'toħloq timer monotonu, imsejjaħ minn timeout minn avveniment).
Kien it-tajmer monotonu li jgħodd il-ħin mill-bidu tal-magna li ħloqt.
Dan se jeħtieġ 2 fajls
logrotateTimer.service - id-deskrizzjoni attwali tas-servizz:

[Unit]
Description=run logrotate

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

Huwa sempliċi - deskrizzjoni tal-kmand tat-tnedija.
It-tieni fajl logrotateTimer.timer huwa fejn jaħdmu t-tajmers:

[Unit]
Description=Run logrotate

[Timer]
OnBootSec=15min
OnUnitActiveSec=15min

[Install]
WantedBy=timers.target

X'hemm hawn:

  • deskrizzjoni tat-tajmer
  • L-ewwel ħin tal-bidu, li jibda mill-boot tas-sistema
  • perjodu ta’ tnedija ulterjuri
  • Dipendenza fuq is-servizz tat-tajmer Fil-fatt, din hija s-sekwenza li tagħmel it-tajmer

Iskrittura interattiva meta tagħlaq u l-mira tal-għeluq tiegħek

Fi żvilupp ieħor, kelli nagħmel verżjoni aktar kumplessa li titfi l-magna - permezz tal-mira tiegħi stess, sabiex inwettaq ħafna azzjonijiet. Normalment huwa rakkomandat li toħloq servizz oneshot bl-għażla RemainAfterExit, iżda dan ma jħallikx toħloq skript interattiv.

Iżda l-fatt hu li l-kmandi mnedija mill-għażla ExecOnStop huma eżegwiti barra t-TTY! Huwa faċli li tiċċekkja - paste l-kmand tty u ssalva l-output tiegħu.

Għalhekk, implimentajt l-għeluq permezz tal-mira tiegħi. Ma nippretendux li jien 100% korrett, iżda jaħdem!
Kif sar (f'termini ġenerali):
Ħloqt mira my_shutdown.target, li ma tiddependi fuq ħadd:
my_shutdown.target

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

Meta tmur lejn din il-mira (permezz ta' systemctl isolate my_shutdwn.target), nediet is-servizz my_shutdown.service, li l-kompitu tiegħu huwa sempliċi - biex tesegwixxi l-iskrittura my_shutdown.sh:

[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

  • Ġewwa din l-iskrittura nwettaq l-azzjonijiet meħtieġa. Tista 'żżid ħafna skripts mal-mira għal flessibilità u konvenjenza:

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

Nota. Bl-użu tal-fajls /tmp/reboot u /tmp/shutdown. Ma tistax issejjaħ mira b'parametri. Is-servizz biss huwa possibbli.

Imma nuża mira biex ikolli flessibilità fix-xogħol u ordni ta’ azzjonijiet garantita.

Madankollu, l-aktar ħaġa interessanti ġiet aktar tard. Il-magna jeħtieġ li tintefa/ristartja. U hemm 2 għażliet:

  • Ibdel ir-reboot, shutdown u kmandi oħra (għadhom symlinks għal systemctl) bl-iskript tiegħek Ġewwa l-iskript, mur my_shutdown.target. U l-iskripts ġewwa l-mira mbagħad sejħa systemctl direttament, per eżempju, systemctl reboot
  • Għażla aktar sempliċi, imma ma nħobbx. Fl-interfaces kollha, issejjaħx shutdown/reboot/other, iżda ċempel direttament lill-mira systemctl isolate my_shutdown.target

Għażilt l-ewwel għażla. F'systemd, reboot (bħal poweroff) huma symlinks għal systemd.

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

Għalhekk, tista 'tissostitwihom bl-iskripts tiegħek stess:
reboot

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

Sors: www.habr.com

Ixtri hosting affidabbli għal siti bi protezzjoni DDoS, servers VPS VDS 🔥 Ixtri hosting ta' websajts affidabbli bi protezzjoni DDoS, servers VPS VDS | ProHoster