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:
- Tòisichidh an bootloader
- Bidh an bootloader a 'tòiseachadh a' cur air bhog am firmware le bhith a 'dol seachad air paramadair final.target
- 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 (
- Tha an siostam a 'tòiseachadh
- 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)
- Tòisich postgresq
- 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)
- Bidh an cuireadh ag atharrachadh - nochdaidh an abairt Deiseil airson obair
- 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