Hati za mfumo, zinazoingiliana na vipima muda

Hati za mfumo, zinazoingiliana na vipima muda

Utangulizi

Wakati wa kuunda kwa ajili ya Linux, kazi ya kuunda hati zinazoingiliana ambazo hutekelezwa wakati mfumo umewashwa au kuzima hutokea. Katika mfumo V hii ilikuwa rahisi, lakini kwa systemd inafanya marekebisho. Lakini inaweza kuwa na vipima muda vyake.

Kwa nini tunahitaji malengo?

Mara nyingi huandikwa kuwa lengo hutumika kama analog ya runlevel katika mfumo V -init. Kimsingi sikubaliani. Kuna zaidi yao na unaweza kugawanya vifurushi katika vikundi na, kwa mfano, kuzindua kikundi cha huduma kwa amri moja na kufanya vitendo vya ziada. Zaidi ya hayo, hawana uongozi, ni utegemezi tu.

Mfano wa lengo wakati umewashwa (muhtasari wa kipengele) kwa kutumia hati shirikishi

Maelezo ya lengo lenyewe:

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

Lengo hili litaanza wakati multi-user.target itakapozinduliwa na kupiga simu installer.service. Walakini, kunaweza kuwa na huduma kadhaa kama hizo.

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

Na mwishowe, mfano wa hati inayotekelezwa:

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

Jambo muhimu zaidi ni kuchagua final.target - lengo ambalo mfumo unapaswa kufika wakati wa kuanza. Wakati wa mchakato wa kuanza, systemd itapitia utegemezi na kuzindua kila kitu kinachohitaji.
Kuna njia tofauti za kuchagua final.target, nilitumia chaguo la kipakiaji kwa hili.

Uzinduzi wa mwisho unaonekana kama hii:

  1. Bootloader huanza
  2. Bootloader huanza kuzindua firmware kwa kupitisha parameter ya final.target
  3. Systemd huanza kuanza mfumo. Mfululizo huenda kwa installer.target au work.target kutoka basic.target kupitia utegemezi wao (kwa mfano, multi-user.target). Mwisho huleta mfumo kufanya kazi katika hali inayotaka

Kuandaa firmware kwa uzinduzi

Wakati wa kuunda firmware, kazi daima hutokea kwa kurejesha hali ya mfumo wakati wa kuanza na kuihifadhi wakati wa kuzima. Jimbo linamaanisha faili za usanidi, utupaji wa hifadhidata, mipangilio ya kiolesura, n.k.

Systemd huendesha michakato katika lengo sawa sambamba. Kuna vitegemezi vinavyokuruhusu kuamua mlolongo wa uanzishaji wa hati.

Inafanyaje kazi katika mradi wangu ( https://habr.com/ru/post/477008/ https://github.com/skif-web/monitor)

  1. Mfumo unaanza
  2. Huduma ya settings_restore.service imezinduliwa.Inakagua uwepo wa faili ya settings.txt katika sehemu ya data. Ikiwa haipo, basi faili ya kumbukumbu imewekwa mahali pake. Kisha, mipangilio ya mfumo inarejeshwa:
    • nenosiri la msimamizi
    • jina la mwenyeji
    • eneo la saa
    • eneo
    • Huamua ikiwa midia yote inatumika. Kwa chaguo-msingi, saizi ya picha ni ndogo - kwa urahisi wa kuiga na kurekodi kwa media. Inapoanzisha, hukagua kuona ikiwa bado kuna nafasi ambayo haijatumika. Ikiwa kuna, diski imegawanywa tena.
    • Inazalisha kitambulisho cha mashine kutoka kwa anwani ya MAC. Hii ni muhimu kwa kupata anwani sawa kupitia DHCP
    • Mipangilio ya mtandao
    • Hupunguza ukubwa wa magogo
    • Hifadhi ya nje inatayarishwa kwa kazi (ikiwa chaguo linalolingana limewezeshwa na kiendeshi ni kipya)
  3. Anzisha postgresq
  4. Huduma ya kurejesha inaanza. Inahitajika kuandaa zabbix yenyewe na hifadhidata yake:
    • Hukagua ikiwa tayari kuna hifadhidata ya zabbix. Ikiwa sivyo, imeundwa kutoka kwa utupaji wa utupaji (pamoja na zabbix)
    • orodha ya maeneo ya saa imeundwa (inahitajika ili kuzionyesha kwenye kiolesura cha wavuti)
    • IP ya sasa inapatikana, inaonyeshwa katika suala (mwaliko wa kuingia kwenye console)
  5. Mwaliko unabadilika - kifungu Tayari kufanya kazi kinaonekana
  6. Firmware iko tayari kutumika

Faili za huduma ni muhimu, ndizo zinazoweka mlolongo wa uzinduzi wao

[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

Kama unavyoona, niliweka utegemezi ili hati yangu ifanye kazi kwanza, na kisha tu mtandao ungepanda na DBMS itaanza.

Na huduma ya pili (maandalizi ya 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

Ni ngumu zaidi hapa. Uzinduzi pia uko katika malengo ya watumiaji wengi, lakini BAADA ya kuanzisha postgresql DBMS na setting_restore yangu. Lakini KABLA ya kuanza huduma zabbix.

Huduma ya kipima muda kwa logrotate

Systemd inaweza kuchukua nafasi ya CRON. Kwa umakini. Zaidi ya hayo, usahihi sio hadi dakika, lakini hadi ya pili (vipi ikiwa inahitajika) Au unaweza kuunda timer ya monotonous, inayoitwa na kuisha kwa tukio.
Ilikuwa kipima saa cha kustaajabisha ambacho huhesabu wakati tangu kuanza kwa mashine niliyounda.
Hii itahitaji faili 2
logrotateTimer.service - maelezo halisi ya huduma:

[Unit]
Description=run logrotate

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

Ni rahisi - maelezo ya amri ya uzinduzi.
Faili ya pili ya logrotateTimer.timer ndipo vipima muda hufanya kazi:

[Unit]
Description=Run logrotate

[Timer]
OnBootSec=15min
OnUnitActiveSec=15min

[Install]
WantedBy=timers.target

Kuna nini hapa:

  • maelezo ya kipima muda
  • Mara ya kwanza kuanza, kuanzia mfumo wa kuwasha
  • kipindi cha uzinduzi zaidi
  • Utegemezi wa huduma ya kipima muda. Kwa kweli, huu ndio uzi unaotengeneza kipima saa

Hati inayoingiliana wakati wa kuzima na lengo lako la kuzima

Katika maendeleo mengine, ilibidi nifanye toleo ngumu zaidi la kuzima mashine - kupitia lengo langu mwenyewe, ili kufanya vitendo vingi. Kawaida hupendekezwa kuunda huduma ya picha moja kwa chaguo la RemainAfterExit, lakini hii inakuzuia kuunda hati inayoingiliana.

Lakini ukweli ni kwamba amri zilizozinduliwa na chaguo la ExecOnStop zinatekelezwa nje ya TTY! Ni rahisi kuangalia - bandika amri ya tty na uhifadhi matokeo yake.

Kwa hivyo, nilitekeleza kuzima kupitia lengo langu. Sidai kuwa ni sahihi 100%, lakini inafanya kazi!
Jinsi ilifanywa (kwa maneno ya jumla):
Niliunda my_shutdown.target target, ambayo haikutegemea mtu yeyote:
shabaha_yangu_yangu

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

Wakati wa kwenda kwenye lengo hili (kupitia systemctl isolate my_shutdwn.target), ilizindua huduma ya my_shutdown.service, kazi ambayo ni rahisi - kutekeleza hati ya 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

  • Ndani ya hati hii mimi hufanya vitendo muhimu. Unaweza kuongeza maandishi mengi kwa lengo kwa kubadilika na urahisi:

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

Kumbuka. Kutumia faili za /tmp/reboot na /tmp/shutdown. Huwezi kuita shabaha kwa kutumia vigezo. Huduma pekee ndiyo inayowezekana.

Lakini mimi hutumia lengo kuwa na kubadilika katika kazi na utaratibu wa uhakika wa vitendo.

Walakini, jambo la kupendeza zaidi lilikuja baadaye. Mashine inahitaji kuzimwa/kuwashwa upya. Na kuna chaguzi 2:

  • Badilisha kuwasha upya, kuzima na amri zingine (bado ni ulinganifu kwa systemctl) na hati yako. Ndani ya hati, nenda kwa my_shutdown.target. Na maandishi ndani ya lengo basi piga simu systemctl moja kwa moja, kwa mfano, systemctl reboot
  • Chaguo rahisi zaidi, lakini siipendi. Katika miingiliano yote, usipige simu shutdown/reboot/mengine, lakini piga simu moja kwa moja systemctl lengwa kutenga my_shutdown.target.

Nilichagua chaguo la kwanza. Katika systemd, anzisha upya (kama poweroff) ni ulinganifu kwa systemd.

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

Kwa hivyo, unaweza kuzibadilisha na maandishi yako mwenyewe:
reboot

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

Chanzo: mapenzi.com

Kuongeza maoni