
Pîrozbahiyê
Dema ku ji bo Linux-ê pêşve diçin, peywira afirandina skrîptên înteraktîf ên ku dema ku pergal tê vemirandin an girtin têne darve kirin derdikeve pêş. Di pergala V de ev hêsan bû, lê bi systemd-ê verastkirinê dike. Lê ew dikare demjimêrên xwe hebin.
Çima em hewceyê hedefan in?
Bi gelemperî tê nivîsandin ku armanc di pergala V -init de wekî analoga asta rêvekirinê kar dike. Ez bi bingehîn li hev nakim. Zêdetir ji wan hene û hûn dikarin pakêtan li koman dabeş bikin û, mînakî, komek karûbar bi yek fermanê bidin destpêkirin û çalakiyên din jî bikin. Wekî din, hiyerarşiya wan tune, tenê girêdayî ye.
Mînaka armancê dema ku were çalak kirin (pêşveçûna taybetmendiyê) bi skrîpta înteraktîf a xebitandinê
Danasîna armancê bixwe:
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.serviceDema ku multi-user.target were destpêkirin û gazî installer.service bike ev armanc dê dest pê bike. Lêbelê, dibe ku çend karûbarên weha hebin.
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Û di dawiyê de, mînakek skrîpta ku hatî darve kirin:
#!/bin/bash
# Переходим в tty3
chvt 3
echo "Install, y/n ?"
read user_answerYa herî girîng ew e ku meriv final.target hilbijêrin - armanca ku divê pergal di destpêkê de bigihîje. Di pêvajoya destpêkirinê de, systemd dê di nav pêwendiyan de derbas bibe û her tiştê ku hewce dike dest pê bike.
Ji bo hilbijartina final.target awayên cûda hene, min ji bo vê vebijarka barker bikar anî.
Destpêka dawîn wiha xuya dike:
- Bootloader dest pê dike
- Bootloader bi derbaskirina parametreya final.target dest bi destpêkirina firmwareyê dike
- Systemd dest bi destpêkirina pergalê dike. Bi dû hev ve diçe installer.target an work.target ji basic.target bi navgîniya wan ve girêdayî (mînak, multi-user.target). Ya paşîn pergalê di moda xwestinê de dixebitîne
Amadekirina firmware ji bo destpêkirinê
Dema ku firmware diafirîne, her gav peywira nûvekirina rewşa pergalê di dema destpêkirinê de û hilanîna wê di dema girtinê de radibe. Dewlet tê wateya pelên vesazkirinê, avêtina databasê, mîhengên navberê, hwd.
Systemd pêvajoyên di heman armancê de paralel dimeşîne. Girêdan hene ku dihêle hûn rêzika destpêkê ya nivîsan diyar bikin.
Ew di projeya min de çawa dixebite ( )
- Sîstem dest pê dike
- Karûbarê settings_restore.service tê destpêkirin Ew hebûna pelê settings.txt di beşa daneyê de kontrol dike. Ger ew ne li wir be, wê hingê pelek referans li şûna wê tê danîn, mîhengên pergalê têne sererast kirin:
- şîfreya rêveberê
- navê mêvandar,
- qada demê
- locale
- Diyar dike ka gelo hemî medya têne bikar anîn. Bi xwerû, mezinahiya wêneyê piçûk e - ji bo hêsankirina kopîkirin û tomarkirina medyayê. Di destpêkê de, ew kontrol dike ku bibîne ka hîn cîhê nekarandî heye. Ger hebe, dîsk ji nû ve tê dabeş kirin.
- Ji navnîşana MAC-ê nasnameya makîneyê çêdike. Ev ji bo bidestxistina heman navnîşanê bi riya DHCP-ê girîng e
- Mîhengên torê
- Mezinahiya têketin sînordar dike
- Ajokera derve ji bo xebatê tê amadekirin (heke vebijarka têkildar were çalak kirin û ajoker nû be)
- Postgresq dest pê bikin
- Karûbarê sererastkirinê dest pê dike. Pêdivî ye ku zabbix bixwe û databasa wê amade bike:
- Kontrol dike ka jixwe databasek zabbix heye. Heke ne, ew ji avêtina destpêkê ve hatî afirandin (bi zabbix re tê de)
- navnîşek deverên demjimêr têne afirandin (pêdivî ye ku wan di navgîniya malperê de nîşan bidin)
- IP-ya heyî tê dîtin, di pirsgirêkê de tê xuyang kirin (vexwendname ji bo têketina konsolê)
- Vexwendname diguhere - hevoka Ready to work xuya dibe
- Firmware ji bo karanîna amade ye
Pelên karûbar girîng in, ew in ku rêza destpêkirina wan destnîşan dikin
[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.targetWekî ku hûn dibînin, min pêwendiyan saz kir da ku skrîpta min pêşî bixebite, û tenê wê hingê tor dê bilind bibe û DBMS dest pê bike.
Û xizmeta duyemîn (amadekirina 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.targetLi vir ew hinekî tevlihevtir e Destpêk jî di pir-bikarhêner.target de ye, lê PÎŞT dest bi postgresql DBMS û setting_restore-ya min kir. Lê BERÎ destpêkirina karûbarên zabbix.
xizmeta Timer ji bo logrotate
Systemd dikare şûna CRON-ê bigire. Seriously. Digel vê yekê, rastbûn ne heya hûrdemê ye, lê heya duyemîn e (ger hewce be, An jî hûn dikarin demjimêrek monoton biafirînin, ku ji bûyerek demdirêj tê gotin).
Ew demjimêra monoton bû ku ji destpêka makîneya ku min afirand dema dihejmêre.
Ev ê 2 pelan hewce bike
logrotateTimer.service - şiroveya rastîn a karûbarê:
[Unit]
Description=run logrotate
[Service]
ExecStart=logrotate /etc/logrotate.conf
TimeoutSec=300Ew hêsan e - danasîna fermana destpêkirinê.
Pela duyemîn logrotateTimer.timer cihê ku demjimêr dixebitin e:
[Unit]
Description=Run logrotate
[Timer]
OnBootSec=15min
OnUnitActiveSec=15min
[Install]
WantedBy=timers.targetLi vir çi ye:
- danasîna timer
- Dema destpêkirina yekem, ji bootkirina pergalê dest pê dike
- dema destpêkirinên din
- Girêdana bi karûbarê demjimêrê Di rastiyê de, ev rêzika ku demjimêrê çêdike ye
Nivîsara înteraktîf dema ku were girtin û armanca weya girtinê
Di pêşkeftinek din de, ez neçar bûm ku guhertoyek tevlihevtir a qutkirina makîneyê bikim - bi riya armanca xwe, da ku ez gelek çalakiyan bikim. Bi gelemperî tê pêşniyar kirin ku hûn bi vebijarka RemainAfterExit karûbarek oneshot biafirînin, lê ev ji we re diafirîne ku hûn skrîptek înteraktîf biafirînin.
Lê rastî ev e ku emrên ku ji hêla vebijarka ExecOnStop ve hatî destpêkirin li derveyî TTY-yê têne darve kirin! Kontrolkirin hêsan e - fermana tty bişopînin û hilberîna wê hilînin.
Ji ber vê yekê, min bi armanca xwe ve girtin pêk anî. Ez îdîa nakim ku 100% rast im, lê ew dixebite!
Çawa hate kirin (bi gelemperî):
Min armancek my_shutdown.target çêkir, ku bi kesî ve girêdayî nebû:
my_shutdown.target
[Unit]
Description=my shutdown
AllowIsolate=yes
Wants=my_shutdown.service Dema ku diçû vê mebestê (bi rêya systemctl veqetandina my_shutdwn.target), wê karûbarê my_shutdown.service dest pê kir, ku peywira wê hêsan e - pêkanîna skrîpta 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- Di hundurê vê skrîptê de ez tevgerên pêwîst dikim. Hûn dikarin ji bo nermbûn û rehetiyê gelek nivîsan li armancê zêde bikin:
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/
$commandNot. Bikaranîna pelên /tmp/reboot û /tmp/ shutdown. Hûn nikarin bi pîvanan bang bikin. Tenê xizmet gengaz e.
Lê ez armanc bikar tînim da ku di xebatê de nermbûn û rêziknameya garantî ya çalakiyan hebe.
Lêbelê, tiştê herî balkêş paşê hat. Pêdivî ye ku makîne were vemirandin / ji nû ve were destpêkirin. Û 2 vebijark hene:
- Reboot, shutdown û fermanên din (ew hîn jî ji systemctl re sembol in) bi skrîpta xwe veguherînin, biçin my_shutdown.target. Û nivîsarên di hundurê armancê de dûv re rasterast gazî systemctl dikin, mînakî, systemctl reboot
- Vebijêrkek hêsantir, lê ez jê hez nakim. Di hemî navbeynkaran de, gazî shutdown/reboot/yên din nekin, lê rasterast gazî pergala armanc bikinctl isolate my_shutdown.target
Min vebijarka yekem hilbijart. Di systemd de, reboot (wek poweroff) ji systemd re sîmgirên hev in.
ls -l /sbin/poweroff
lrwxrwxrwx 1 root root 14 сен 30 18:23 /sbin/poweroff -> /bin/systemctlJi ber vê yekê, hûn dikarin wan bi nivîsarên xwe veguherînin:
destpêbikin
#!/bin/sh
touch /tmp/reboot
sudo systemctl isolate my_shutdown.target
fiSource: www.habr.com
