Scripteanna agus amadóirí córasacha idirghníomhacha

Scripteanna agus amadóirí córasacha idirghníomhacha

Réamhrá

Nuair a bhíonn Linux á fhorbairt, tagann an tasc chun scripteanna idirghníomhacha a chruthú a dhéantar nuair a chuirtear an córas ar siúl nó nuair a stoptar é. I gcóras V bhí sé seo éasca, ach le systemd déanann sé coigeartuithe. Ach is féidir go mbeadh a chuid lasc ama féin aige.

Cén fáth a bhfuil spriocanna ag teastáil uainn?

Is minic a scríobhtar go bhfeidhmíonn an sprioc mar analóg den leibhéal rúidbhealaigh i gcóras V -init. Ní aontaím go bunúsach. Tá níos mó acu ann agus is féidir leat pacáistí a roinnt ina ngrúpaí agus, mar shampla, grúpa seirbhísí a sheoladh le hordú amháin agus gníomhartha breise a dhéanamh. Ina theannta sin, níl aon ordlathas acu, níl ach spleáchais acu.

Sampla den sprioc nuair atá sé cumasaithe (forbhreathnú gné) le script idirghníomhach a rith

Cur síos ar an sprioc féin:

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

Cuirfear tús leis an sprioc seo nuair a sheolfar multi-user.target agus nuair a ghlaonn installer.service air. D’fhéadfadh go mbeadh roinnt seirbhísí den sórt sin ann, áfach.

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

Agus ar deireadh, sampla den script á fhorghníomhú:

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

Is é an rud is tábhachtaí ná final.target a roghnú - an sprioc ar cheart don chóras teacht ar an am tosaithe. Le linn an phróisis tosaithe, rachaidh systemd tríd na spleáchais agus seolfaidh sé gach rud a theastaíonn uaidh.
Tá bealaí éagsúla ann chun final.target a roghnú, d'úsáid mé an rogha lódóra le haghaidh seo.

Breathnaíonn an seoladh deiridh mar seo:

  1. Tosaíonn an tosaitheoir
  2. Tosaíonn an bootloader an firmware a sheoladh tríd an paraiméadar final.target a rith
  3. Tosaíonn Systemd an córas a thosú. Téann go seicheamhach chuig installer.target nó work.target ó basic.target trína spleáchais (mar shampla, multi-user.target). Tugann an dara ceann an córas ag obair sa mhodh atá ag teastáil

Firmware a ullmhú le haghaidh an seoladh

Nuair a bhíonn firmware á chruthú, tagann an tasc chun cinn i gcónaí staid an chórais a athchóiriú ag am tosaithe agus é a shábháil nuair a bhíonn sé ag múchadh. Ciallaíonn stát comhaid cumraíochta, dumpaí bunachar sonraí, socruithe comhéadan, etc.

Ritheann Systemd próisis sa sprioc chéanna go comhthreomhar. Tá spleáchais ann a ligeann duit seicheamh tosaithe na scripteanna a chinneadh.

Conas a oibríonn sé i mo thionscadal ( https://habr.com/ru/post/477008/ https://github.com/skif-web/monitor)

  1. Tosaíonn an córas
  2. Seoltar an tseirbhís settings_restore.service. Seiceálann sé láithreacht an chomhaid settings.txt sa rannóg sonraí. Mura bhfuil sé ann, cuirtear comhad tagartha ina áit. Ansin, athchóirítear socruithe an chórais:
    • pasfhocal riarthóra
    • óstainm,
    • crios ama
    • logán
    • Cinneann an bhfuil gach meán á úsáid. De réir réamhshocraithe, tá méid na híomhá beag - ar mhaithe le héascaíocht a chóipeáil agus a thaifeadadh chuig na meáin. Ag am tosaithe, seiceálann sé féachaint an bhfuil spás gan úsáid fós. Má tá, tá an diosca repartitioned.
    • Meaisín-aitheantas a ghiniúint ó sheoladh MAC. Tá sé seo tábhachtach chun an seoladh céanna a fháil trí DHCP
    • Socruithe líonra
    • Teorainneacha ar mhéid na logs
    • Tá an tiomántán seachtrach á ullmhú don obair (má tá an rogha comhfhreagrach cumasaithe agus an tiomántán nua)
  3. Tosaigh postgresq
  4. Tosaíonn an tseirbhís athchóirithe. Tá sé riachtanach zabbix féin agus a bhunachar sonraí a ullmhú:
    • Seiceálann sé an bhfuil bunachar sonraí zabbix ann cheana féin. Mura bhfuil, cruthaítear é ó dhumpaí tosaigh (san áireamh le zabbix)
    • cruthaítear liosta criosanna ama (is gá iad a thaispeáint sa chomhéadan gréasáin)
    • Faightear an IP reatha, taispeántar é i saincheist (cuireadh chun logáil isteach sa chonsól)
  5. Athraíonn an cuireadh - feictear an frása Ready to work
  6. Tá an firmware réidh le húsáid

Tá na comhaid seirbhíse tábhachtach, is iad sin na cinn a shocraíonn an t-ord a seoladh

[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

Mar a fheiceann tú, shuiteáil mé spleáchais ionas go n-oibreodh mo script ar dtús, agus gan ach ansin bheadh ​​an líonra ag dul suas agus go dtosódh an DBMS.

Agus an dara seirbhís (ullmhú 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

Tá sé beagán níos casta anseo. Tá an seoladh i multi-user.target freisin, ach TAR ÉIS an postgresql DBMS agus mo setting_restore a thosú. Ach ROIMH tosú ar sheirbhísí zabbix.

Seirbhís lasc ama le haghaidh logrotate

Is féidir le systemd ionad CRON. Dáiríre. Thairis sin, níl an cruinneas suas go dtí an nóiméad, ach suas go dtí an dara ceann (cad má tá sé ag teastáil) Nó is féidir leat lasc ama monotonous a chruthú, ar a dtugtar teorainn ama ó imeacht.
Ba é an t-amadóir monotonous a chomhaireamh an t-am ó thús an mheaisín a chruthaigh mé.
Teastóidh 2 chomhad chuige seo
logrotateTimer.service - an cur síos iarbhír ar an tseirbhís:

[Unit]
Description=run logrotate

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

Tá sé simplí - cur síos ar an ordú seolta.
Is é an dara comhad logrotateTimer.timer ná an áit a n-oibríonn na hamadóirí:

[Unit]
Description=Run logrotate

[Timer]
OnBootSec=15min
OnUnitActiveSec=15min

[Install]
WantedBy=timers.target

Cad atá anseo:

  • cur síos ar an lasc ama
  • An chéad am tosaithe, ag tosú ó tosaithe an chórais
  • tréimhse seoltaí eile
  • Ag brath ar an tseirbhís lasc ama. Go deimhin, is é seo an teaghrán a dhéanann an t-amadóir

Script idirghníomhach nuair a múchadh agus do sprioc múchadh

I bhforbairt eile, bhí orm leagan níos casta a dhéanamh chun an meaisín a mhúchadh - trí mo sprioc féin, chun go leor gníomhartha a dhéanamh. De ghnáth moltar seirbhís oneshot a chruthú leis an rogha RemainAfterExit, ach cuireann sé seo cosc ​​ort script idirghníomhach a chruthú.

Ach is é fírinne an scéil go ndéantar na horduithe a sheol an rogha ExecOnStop a fhorghníomhú lasmuigh den TTY! Tá sé éasca a sheiceáil - greamaigh an t-ordú tty agus sábháil a aschur.

Mar sin, chuir mé an múchadh i bhfeidhm trí mo sprioc. Ní mhaíonn mé go bhfuil mé 100% ceart, ach oibríonn sé!
Conas a rinneadh é (i dtéarmaí ginearálta):
Chruthaigh mé sprioc my_shutdown.target, nach raibh ag brath ar aon duine:
mo_mhúchadh.sprioc

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

Agus an sprioc seo á dhéanamh (trí systemctl isolate my_shutdwn.target), sheol sé an tseirbhís my_shutdown.service, a bhfuil an tasc simplí - chun an script my_shutdown.sh a fhorghníomhú:

[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

  • Laistigh den script seo déanaim na gníomhartha riachtanacha. Is féidir leat go leor scripteanna a chur leis an sprioc le haghaidh solúbthachta agus áise:

mo_mhúchadh.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

Nóta. Ag baint úsáide as na comhaid /tmp/reboot agus /tmp/ múchadh. Ní féidir leat sprioc a ghlaoch le paraiméadair. Níl ach seirbhís indéanta.

Ach bainim úsáid as sprioc chun solúbthacht a bheith agam san obair agus ordú ráthaithe gníomhartha.

Mar sin féin, tháinig an rud is suimiúla ina dhiaidh sin. Ní mór an meaisín a mhúchadh/a atosú. Agus tá 2 rogha ann:

  • Cuir do script in ionad an atosaigh, múchadh agus orduithe eile (is simplíinks go systemctl iad fós). Taobh istigh den script, téigh chuig my_shutdown.target. Agus na scripteanna taobh istigh den sprioc glaoch ansin systemctl go díreach, mar shampla, systemctl atosaigh
  • Rogha níos simplí, ach ní maith liom é. I ngach comhéadain, ná cuir glaoch ar múchadh/atosú/eile, ach glaoigh go díreach ar an spriocchórasctl isolate my_shutdown.target

Roghnaigh mé an chéad rogha. I systemd, is naisc le systemd iad atosaigh (cosúil le poweroff).

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

Mar sin, is féidir leat do scripteanna féin a chur ina n-ionad:
Atosaigh

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

Foinse: will.com

Add a comment