Скриптҳои системавӣ, интерактивӣ ва таймерҳо

Скриптҳои системавӣ, интерактивӣ ва таймерҳо

Муқаддима

Ҳангоми таҳияи Linux, вазифаи эҷоди скриптҳои интерактивӣ ба миён меояд, ки ҳангоми фурӯзон ё хомӯш кардани система иҷро мешаванд. Дар системаи V ин осон буд, аммо бо systemd он ислоҳ мекунад. Аммо он метавонад таймерҳои худро дошта бошад.

Чаро мо ба ҳадафҳо ниёз дорем?

Аксар вақт навишта мешавад, ки ҳадаф ҳамчун аналоги сатҳи иҷро дар системаи V -init хизмат мекунад. Ман аслан розӣ нестам. Шумораи онҳо зиёданд ва шумо метавонед бастаҳоро ба гурӯҳҳо тақсим кунед ва масалан, бо як фармон як гурӯҳи хидматҳоро оғоз кунед ва амалҳои иловагиро иҷро кунед. Ғайр аз он, онҳо иерархия надоранд, танҳо вобастагӣ доранд.

Намунаи ҳадаф ҳангоми фаъолкунӣ (шарҳи хусусият) бо иҷрокунандаи скрипти интерактивӣ

Тавсифи худи ҳадаф:

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

Ин ҳадаф вақте оғоз мешавад multi-user.target оғоз мешавад ва ба installer.service занг мезанад. Бо вуҷуди ин, метавонад якчанд чунин хидматҳо вуҷуд дошта бошанд.

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

Ва ниҳоят, як мисоли скрипти иҷрошаванда:

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

Муҳимтар аз ҳама интихоби final.target - ҳадафе, ки система бояд ҳангоми оғозёбӣ ба он расад. Дар ҷараёни оғозёбӣ, systemd аз вобастагӣ мегузарад ва ҳама чизи лозимаро оғоз мекунад.
Роҳҳои гуногуни интихоби final.target вуҷуд доранд, ман барои ин варианти боркунакро истифода кардам.

Ифтитоҳи ниҳоӣ чунин менамояд:

  1. Боркунаки пурборкунанда оғоз мешавад
  2. Боркунаки боркунак бо гузариши параметри final.target оғоз кардани нармафзорро оғоз мекунад
  3. Systemd ба оғоз кардани система оғоз мекунад. Пайдарпай ба installer.target ё work.target аз basic.target тавассути вобастагии онҳо (масалан, multi-user.target) мегузарад. Охирин системаро дар реҷаи дилхоҳ ба кор меорад

Омодасозии нармафзор барои оғози кор

Ҳангоми эҷоди нармафзор, вазифа ҳамеша барқарор кардани ҳолати система ҳангоми оғозёбӣ ва нигоҳ доштани он ҳангоми хомӯш шудан ба миён меояд. Ҳолат маънои файлҳои конфигуратсия, партовҳои пойгоҳи додаҳо, танзимоти интерфейс ва ғайраро дорад.

Systemd равандҳоро дар як ҳадаф параллел иҷро мекунад. Вобастагӣ вуҷуд дорад, ки ба шумо имкон медиҳанд, ки пайдарпаии оғози скриптҳоро муайян кунед.

Он дар лоиҳаи ман чӣ гуна кор мекунад ( https://habr.com/ru/post/477008/ https://github.com/skif-web/monitor)

  1. Система оғоз меёбад
  2. Хизматрасонии settings_restore.service ба кор андохта шуд.Он мавҷудияти файли settings.txt-ро дар бахши додаҳо тафтиш мекунад. Агар он дар он ҷо набошад, файли истинод ба ҷои он ҷойгир карда мешавад. Баъд, танзимоти система барқарор карда мешаванд:
    • пароли администратор
    • номи мизбон,
    • минтақаи вақт
    • маҳаллӣ
    • Муайян мекунад, ки оё тамоми воситаҳои ахбори омма истифода мешаванд. Бо нобаёнӣ, андозаи тасвир хурд аст - барои осонии нусхабардорӣ ва сабт ба ВАО. Ҳангоми оғозёбӣ, он тафтиш мекунад, ки оё фазои истифоданашуда вуҷуд дорад. Агар мавҷуд бошад, диск дубора тақсим карда мешавад.
    • Эҷоди ID-и мошин аз суроғаи MAC. Ин барои ба даст овардани як суроға тавассути DHCP муҳим аст
    • Танзимоти шабака
    • Андозаи гузоришҳоро маҳдуд мекунад
    • Диски беруна барои кор омода карда мешавад (агар варианти мувофиқ фаъол бошад ва диск нав бошад)
  3. Postgresq-ро оғоз кунед
  4. Хизматрасонии барқарорсозӣ оғоз меёбад. Барои тайёр кардани худи zabbix ва базаи он зарур аст:
    • Санҷед, ки оё аллакай пойгоҳи додаҳои zabbix вуҷуд дорад. Дар акси ҳол, он аз партовҳои ибтидоӣ сохта мешавад (бо zabbix дохил карда шудааст)
    • рӯйхати минтақаҳои вақт сохта мешавад (барои намоиши онҳо дар интерфейси веб лозим аст)
    • IP-и ҷорӣ пайдо шуд, он дар масъала нишон дода мешавад (даъват барои ворид шудан ба консол)
  5. Даъват тағир меёбад - ибораи Омода ба кор пайдо мешавад
  6. Нармафзор барои истифода омода аст

Файлҳои хидматрасонӣ муҳиманд, онҳо ҳамонҳоянд, ки пайдарпаии оғози онҳоро муқаррар мекунанд

[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

Тавре ки шумо мебинед, ман вобастагиҳоро насб кардам, то скрипти ман аввал кор кунад ва танҳо пас аз он шабака боло равад ва DBMS оғоз шавад.

Ва хидмати дуюм (тайёркунии 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

Ин ҷо каме мураккабтар аст.Оғоз инчунин дар multi-user.target аст, аммо БАЪД аз оғози DBMS postgresql ва set_restore ман. Аммо пеш аз оғози хидматҳои zabbix.

Хидмати таймер барои logrotate

Systemd метавонад CRON-ро иваз кунад. Ҷиддӣ. Гузашта аз ин, дақиқӣ на то дақиқа, балки то сония аст (агар лозим бошад) Ё шумо метавонед як таймери якранг созед, ки бо вақти тайм-аут аз ҳодиса даъват карда мешавад.
Ин таймери якранг буд, ки вақтро аз оғози мошини офаридаам ҳисоб мекунад.
Ин 2 файлро талаб мекунад
logrotateTimer.service - тавсифи воқеии хидмат:

[Unit]
Description=run logrotate

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

Ин оддӣ аст - тавсифи фармони оғоз.
Файли дуюм logrotateTimer.timer аст, ки дар он таймерҳо кор мекунанд:

[Unit]
Description=Run logrotate

[Timer]
OnBootSec=15min
OnUnitActiveSec=15min

[Install]
WantedBy=timers.target

Дар ин ҷо чӣ ҳаст:

  • тавсифи таймер
  • Аввалин бор оғоз, аз пурборкунии система
  • давраи ба кор андохтани минбаъда
  • Вобастагӣ аз хидмати таймер Дар асл, ин сатрест, ки таймерро месозад

Скрипти интерактивӣ ҳангоми хомӯш кардан ва ҳадафи хомӯш кардани шумо

Дар таҳаввулоти дигар, ба ман лозим омад, ки як варианти мураккабтари хомӯш кардани мошинро иҷро кунам - тавассути ҳадафи худ, барои иҷрои бисёр амалҳо. Одатан тавсия дода мешавад, ки хидмати oneshot бо опсияи RemainAfterExit эҷод кунед, аммо ин ба шумо имкон намедиҳад, ки скрипти интерактивиро эҷод кунед.

Аммо далел дар он аст, ки фармонҳое, ки бо опсияи ExecOnStop оғоз шудаанд, берун аз TTY иҷро мешаванд! Санҷиши он осон аст - фармони tty -ро часбонед ва баромади онро захира кунед.

Аз ин рӯ, ман хомӯширо тавассути ҳадафи худ амалӣ кардам. Ман даъво намекунам, ки 100% дуруст ҳастам, аммо ин кор мекунад!
Он чӣ гуна анҷом дода шуд (ба ибораи умумӣ):
Ман ҳадафи my_shutdown.target эҷод кардам, ки аз касе вобаста набуд:
my_shutdown.target

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

Ҳангоми рафтан ба ин ҳадаф (тавассути systemctl isolate my_shutdwn.target), он хидмати my_shutdown.service-ро оғоз кард, ки вазифаи он оддӣ аст - иҷрои скрипти 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

  • Дар дохили ин скрипт ман амалҳои заруриро иҷро мекунам. Шумо метавонед скриптҳои зиёдеро ба ҳадаф барои чандирӣ ва роҳат илова кунед:

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

Шарҳ. Истифодаи файлҳои /tmp/reboot ва /tmp/sutdown. Шумо наметавонед ҳадафро бо параметрҳо занг занед. Танҳо хидмат имконпазир аст.

Аммо ман ҳадафро барои чандирӣ дар кор ва тартиби кафолатноки амалҳо истифода мекунам.

Бо вуҷуди ин, чизи ҷолибтарин баъдтар пайдо шуд. Мошинро хомӯш кардан/аз нав оғоз кардан лозим аст. Ва 2 вариант вуҷуд дорад:

  • Бо скрипти худ бозоғозӣ, хомӯшкунӣ ва фармонҳои дигарро иваз кунед (онҳо ҳамчунон аломати systemctl мебошанд) Дар дохили скрипт ба my_shutdown.target гузаред. Ва скриптҳои дохили ҳадаф пас мустақиман systemctl-ро даъват мекунанд, масалан, systemctl reboot
  • Варианти соддатар, аммо ба ман маъқул нест. Дар ҳама интерфейсҳо, shutdown/reboot/diger занг назанед, балки бевосита ба systemctl isolate my_shutdown.target занг занед

Ман варианти аввалро интихоб кардам. Дар systemd, reboot (ба монанди poweroff) пайвандҳои рамзӣ ба systemd мебошанд.

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

Аз ин рӯ, шумо метавонед онҳоро бо скриптҳои худ иваз кунед:
Перезагрузка

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

Манбаъ: will.com

Илова Эзоҳ