Системалык, интерактивдүү сценарийлер жана таймерлер

Системалык, интерактивдүү сценарийлер жана таймерлер

тааныштыруу

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 системаны иштете баштайт. Көз карандылыктары аркылуу (мисалы, multi-user.target) ырааттуу түрдө basic.target'тен installer.target же work.target барат. Акыркысы системаны керектүү режимде иштөөгө алып келет

Микропрограмманы ишке киргизүүгө даярдоо

Микропрограмманы түзүүдө дайыма системаны ишке киргизүүдө абалды калыбына келтирүү жана өчүрүүдө аны сактоо милдети пайда болот. Мамлекет конфигурация файлдарын, маалымат базасынын таштандыларын, интерфейстин орнотууларын ж.б.

Systemd бир эле максатта процесстерди параллелдүү иштетет. Скрипттерди баштоо ырааттуулугун аныктоого мүмкүндүк берген көз карандылыктар бар.

Бул менин долбоордо кандай иштейт ( https://habr.com/ru/post/477008/ https://github.com/skif-web/monitor)

  1. Система башталат
  2. settings_restore.service кызматы ишке киргизилди.Ал маалыматтар бөлүмүндө settings.txt файлынын бар-жоктугун текшерет. Эгерде ал жок болсо, анда анын ордуна маалымдама файлы жайгаштырылат жана системанын жөндөөлөрү калыбына келтирилет:
    • администратор сырсөз
    • хост аты
    • убакыт зонасы
    • жергиликтүү тил
    • Бардык медиа колдонулуп жатканын аныктайт. Демейки боюнча, сүрөттүн көлөмү кичинекей - көчүрүү жана медиага жаздыруу оңой. Ишке киргенде, ал дагы эле пайдаланылбаган мейкиндиктин бар-жоктугун текшерет. Эгер бар болсо, диск кайра бөлүнөт.
    • 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 сайтында да бар, бирок postgresql DBMS жана менин settings_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

Бул жерде эмне бар:

  • таймердин сүрөттөлүшү
  • Системаны жүктөөдөн баштап биринчи баштоо убактысы
  • андан ары ишке киргизүү мезгили
  • Таймер кызматына көз карандылык.Чындыгында, бул таймерди түзгөн сап

Өчүрүү учурунда интерактивдүү скрипт жана сиздин өчүрүү максатыңыз

Дагы бир өнүгүүдө, мен көптөгөн аракеттерди жасоо үчүн машинаны өчүрүүнүн татаал версиясын жасоого туура келди - өз максатым аркылуу. Демейде RemainAfterExit опциясы менен oneshot кызматын түзүү сунушталат, бирок бул интерактивдүү скрипт түзүүгө жол бербейт.

Бирок 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/shutdown файлдарын колдонуу. Параметрлер менен максатты чакыра албайсыз. Кызмат гана мүмкүн.

Бирок мен максатты жумушта ийкемдүүлүк жана кепилденген иш-аракеттер тартиби үчүн колдоном.

Бирок, эң кызыктуусу кийинчерээк келди. Машинаны өчүрүү/кайра иштетүү керек. Жана 2 вариант бар:

  • Кайра жүктөө, өчүрүү жана башка буйруктарды (алар дагы systemctlге символдор) скриптиңиз менен алмаштырыңыз.. Скрипттин ичинде my_shutdown.target дарегине өтүңүз. Жана максаттын ичиндеги скрипттер андан кийин түздөн-түз systemctl деп аташат, мисалы, systemctl кайра жүктөө
  • Жөнөкөй вариант, бирок мага жакпайт. Бардык интерфейстерде shutdown/reboot/other деп чалбаңыз, бирок түз эле максаттуу systemctl isolate my_shutdown.target деп атаңыз.

Мен биринчи вариантты тандадым. Системада кайра жүктөө (күйгүзүү сыяктуу) 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

Source: www.habr.com

Комментарий кошуу