Sgriobtaichean siostaim, eadar-ghnìomhach agus timers

Sgriobtaichean siostaim, eadar-ghnìomhach agus timers

Ro-ràdh

Nuair a bhios tu a’ leasachadh airson Linux, èiridh an obair a bhith a’ cruthachadh sgriobtaichean eadar-ghnìomhach a thèid a chur gu bàs nuair a thèid an siostam a thionndadh air no a dhùnadh sìos. Ann an siostam V bha seo furasta, ach le systemd bidh e a’ dèanamh atharrachaidhean. Ach faodaidh na timers aige fhèin a bhith aige.

Carson a tha feum againn air targaidean?

Tha e tric air a sgrìobhadh gu bheil targaid a 'frithealadh mar analog de runlevel ann an siostam V -init. Tha mi ag aontachadh gu bunaiteach. Tha barrachd dhiubh ann agus faodaidh tu pasganan a roinn ann am buidhnean agus, mar eisimpleir, buidheann de sheirbheisean a chuir air bhog le aon àithne agus gnìomhan a bharrachd a dhèanamh. A bharrachd air an sin, chan eil rangachd aca, dìreach eisimeileachd.

Eisimpleir de thargaid nuair a tha e air a chomasachadh (sealladh farsaing air feart) le ruith sgriobt eadar-ghnìomhach

Tuairisgeul air an targaid fhè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

Tòisichidh an targaid seo nuair a thèid ioma-user.target a chuir air bhog agus gairmean installer.service. Ach, dh’ fhaodadh grunn sheirbheisean leithid seo a bhith ann.

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 mu dheireadh, eisimpleir den sgriobt ga chur gu bàs:

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

Is e an rud as cudromaiche final.target a thaghadh - an targaid air am bu chòir don t-siostam ruighinn aig àm tòiseachaidh. Rè a 'phròiseas tòiseachaidh, thèid systemd tro na h-eisimeileachd agus cuiridh e air bhog a h-uile dad a dh' fheumas e.
Tha diofar dhòighean ann airson final.target a thaghadh, chleachd mi an roghainn luchdan airson seo.

Tha coltas mar seo air an fhoillseachadh mu dheireadh:

  1. Tòisichidh an bootloader
  2. Bidh an bootloader a 'tòiseachadh a' cur air bhog am firmware le bhith a 'dol seachad air paramadair final.target
  3. Bidh Systemd a 'tòiseachadh air an t-siostam a thòiseachadh. Sequentially a 'dol gu installer.target no work.target bho basic.target tro an eisimeileachd (mar eisimpleir, multi-user.target). Bheir an tè mu dheireadh an siostam gu bhith ag obair anns a’ mhodh a tha thu ag iarraidh

Ag ullachadh am bathar-bog airson a chuir air bhog

Nuair a chruthaicheas tu firmware, bidh an obair an-còmhnaidh ag èirigh gus staid an t-siostaim ath-nuadhachadh aig àm tòiseachaidh agus a shàbhaladh nuair a dhùineas e. Tha stàite a’ ciallachadh faidhlichean rèiteachaidh, dumps stòr-dàta, roghainnean eadar-aghaidh, msaa.

Bidh pròiseasan ruith systemd anns an aon targaid aig an aon àm. Tha eisimeileachd ann a leigeas leat sreath tòiseachaidh nan sgriobtaichean a dhearbhadh.

Ciamar a tha e ag obair sa phròiseact agam ( https://habr.com/ru/post/477008/ https://github.com/skif-web/monitor)

  1. Tha an siostam a 'tòiseachadh
  2. Tha an t-seirbheis settings_restore.service ga chur air bhog Bidh e a 'dèanamh sgrùdadh airson làthaireachd an fhaidhle settings.txt anns an roinn dàta. Mura h-eil e ann, thèid faidhle iomraidh a chuir na àite. An uairsin, thèid roghainnean an t-siostaim ath-nuadhachadh:
    • facal-faire rianaire
    • ainm an òstair,
    • sòn ùine
    • sgìre
    • A’ dearbhadh a bheil na meadhanan uile gan cleachdadh. Gu gnàthach, tha meud an ìomhaigh beag - airson a bhith furasta a chopaigeadh agus a chlàradh gu meadhanan. Aig toiseach tòiseachaidh, bidh e a’ sgrùdadh a bheil àite ann fhathast gun chleachdadh. Ma tha, tha an diosc air a chuir air ais.
    • A’ gineadh inneal-id bho sheòladh MAC. Tha seo cudromach airson an aon sheòladh fhaighinn tro DHCP
    • Roghainnean lìonra
    • A 'cuingealachadh meud nan logaichean
    • Thathas ag ullachadh an draibhear taobh a-muigh airson obair (ma tha an roghainn fhreagarrach air a chomasachadh agus gu bheil an draibhear ùr)
  3. Tòisich postgresq
  4. Tòisichidh an t-seirbheis ath-nuadhachaidh. Tha feum air zabbix fhèin agus an stòr-dàta ullachadh:
    • Dèan sgrùdadh a bheil stòr-dàta zabbix ann mu thràth. Mura h-eil, tha e air a chruthachadh bho dumps tòiseachaidh (air a ghabhail a-steach le zabbix)
    • tha liosta de shònaichean ùine air a chruthachadh (feumar an taisbeanadh san eadar-aghaidh lìn)
    • Lorgar an IP gnàthach, tha e air a thaisbeanadh ann an cùis (cuireadh logadh a-steach don consol)
  5. Bidh an cuireadh ag atharrachadh - nochdaidh an abairt Deiseil airson obair
  6. Tha am firmware deiseil airson a chleachdadh

Tha na faidhlichean seirbheis cudromach, is iadsan an fheadhainn a shuidhich an t-sreath air bhog

[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 chì thu, chuir mi a-steach eisimeileachd gus an obraicheadh ​​​​an sgriobt agam an-toiseach, agus dìreach an uairsin rachadh an lìonra suas agus thòisicheadh ​​​​an DBMS.

Agus an dàrna seirbheis (zabbix ullachadh)

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

Tha e beagan nas iom-fhillte an seo. Ach mus tòisich thu air seirbheisean zabbix.

Seirbheis timer airson logrotate

Faodaidh systemd a dhol an àite CRON. Gu dona. A bharrachd air an sin, chan eil an cruinneas suas chun mhionaid, ach suas ris an dàrna fear (dè ma tha feum air) No faodaidh tu timer monotonous a chruthachadh, air a ghairm le ùine a-mach à tachartas.
B’ e an timer monotonous a tha a’ cunntadh na h-ùine bho thoiseach an inneil a chruthaich mi.
Feumaidh seo 2 fhaidhle
logrotateTimer.service - an dearbh thuairisgeul air an t-seirbheis:

[Unit]
Description=run logrotate

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

Tha e sìmplidh - tuairisgeul air an àithne tòiseachaidh.
Is e an dàrna faidhle logrotateTimer.timer far a bheil na timers ag obair:

[Unit]
Description=Run logrotate

[Timer]
OnBootSec=15min
OnUnitActiveSec=15min

[Install]
WantedBy=timers.target

Dè tha an seo:

  • tuairisgeul timer
  • A’ chiad ùine tòiseachaidh, a’ tòiseachadh le siostam tòiseachaidh
  • ùine de chur air bhog eile
  • An eisimeil air an t-seirbheis timer. Gu dearbh, is e seo an sreang a nì an timer

Sgriobt eadar-ghnìomhach nuair a dhùineas tu agus an targaid dùnadh agad

Ann an leasachadh eile, bha agam ri dreach nas iom-fhillte a dhèanamh gus an inneal a chuir dheth - tro mo thargaid fhìn, gus iomadh gnìomh a dhèanamh. Mar as trice thathar a’ moladh seirbheis oneshot a chruthachadh leis an roghainn RemainAfterExit, ach tha seo a’ cur casg ort bho bhith a’ cruthachadh sgriobt eadar-ghnìomhach.

Ach is e an fhìrinn gu bheil na h-òrdughan a chuir an roghainn ExecOnStop air bhog air an cur gu bàs taobh a-muigh an TTY! Tha e furasta sgrùdadh a dhèanamh - cuir a-steach an àithne tty agus sàbhail an toradh aige.

Mar sin, chuir mi an dùnadh an gnìomh tron ​​​​targaid agam. Chan eil mi ag ràdh gu bheil mi 100% ceart, ach tha e ag obair!
Mar a chaidh a dhèanamh (san fharsaingeachd):
Chruthaich mi targaid my_shutdown.target, nach robh an urra ri duine sam bith:
mo_shutdown.targaid

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

Nuair a chaidh e chun targaid seo (tro systemctl isolate my_shutdwn.target), chuir e air bhog an t-seirbheis my_shutdown.service, agus tha an obair aige sìmplidh - gus an sgriobt my_shutdown.sh a chuir an gnì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

  • Taobh a-staigh an sgriobt seo bidh mi a’ coileanadh nan gnìomhan riatanach. Faodaidh tu mòran sgriobtaichean a chur ris an targaid airson sùbailteachd agus goireasachd:

mo_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

Thoir an aire. A’ cleachdadh na faidhlichean /tmp/reboot agus /tmp/shutdown. Chan urrainn dhut targaid a ghairm le paramadairean. Chan eil ach seirbheis comasach.

Ach bidh mi a’ cleachdadh targaid gus sùbailteachd a bhith agam san obair agus òrdugh gnìomh cinnteach.

Ach, thàinig an rud as inntinniche nas fhaide air adhart. Feumar an inneal a chuir dheth / ath-thòiseachadh. Agus tha 2 roghainn ann:

  • Cuir an sgriobt agad an àite an ath-thòiseachadh, an dùnadh agus òrdughan eile (tha iad fhathast nan symlinks gu systemctl) leis an sgriobt agad. Taobh a-staigh an sgriobt, theirig gu my_shutdown.target. Agus bidh na sgriobtaichean taobh a-staigh an targaid an uairsin a’ gairm systemctl gu dìreach, mar eisimpleir, systemctl reboot
  • Roghainn nas sìmplidh, ach cha toil leam e. Anns a h-uile eadar-aghaidh, na cuir fios gu dùnadh / ath-thòiseachadh / eile, ach cuir fios gu dìreach air an t-siostam targaidctl isolate my_shutdown.target

Thagh mi a’ chiad roghainn. Ann an systemd, tha reboot (mar poweroff) nan symlinks gu systemd.

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

Mar sin, faodaidh tu na sgriobtaichean agad fhèin a chuir nan àite:
reboot

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

Source: www.habr.com

Cuir beachd ann