
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.serviceDin 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.targetU fl-aħħarnett, eżempju tal-iskrittura li qed titwettaq:
#!/bin/bash
# Переходим в tty3
chvt 3
echo "Install, y/n ?"
read user_answerL-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:
- Il-bootloader jibda
- Il-bootloader jibda jniedi l-firmware billi jgħaddi l-parametru final.target
- 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 ( )
- Is-sistema tibda
- 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)
- Ibda postgresq
- 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)
- L-istedina tinbidel – tidher il-frażi Lest għax-xogħol
- 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.targetKif 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.targetHuwa 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=300Huwa 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.targetX'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/
$commandNota. 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/systemctlGħalhekk, tista 'tissostitwihom bl-iskripts tiegħek stess:
reboot
#!/bin/sh
touch /tmp/reboot
sudo systemctl isolate my_shutdown.target
fiSors: www.habr.com
