Системчилсэн, интерактив скриптүүд болон таймерууд

Системчилсэн, интерактив скриптүүд болон таймерууд

Танилцуулга

Линуксыг хөгжүүлэх үед систем асаалттай эсвэл унтарсан үед хийгдэх интерактив скриптүүдийг үүсгэх даалгавар гарч ирдэг. 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 руу үндсэн.target-аас хамааралтайгаар нь дараалан очдог (жишээлбэл, олон хэрэглэгчийн.target). Сүүлийнх нь системийг хүссэн горимд ажиллуулах боломжийг олгодог

Програм хангамжийг эхлүүлэхэд бэлтгэж байна

Програм хангамжийг үүсгэх үед эхлүүлэх үед системийн төлөвийг сэргээх, унтрах үед хадгалах даалгавар үргэлж гарч ирдэг. Төлөв гэдэг нь тохиргооны файлууд, өгөгдлийн сангийн дамп, интерфейсийн тохиргоо гэх мэтийг хэлнэ.

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

Энэ нь миний төсөлд хэрхэн ажилладаг вэ ( https://habr.com/ru/post/477008/ https://github.com/skif-web/monitor)

  1. Систем эхэлнэ
  2. Settings_restore.service үйлчилгээг эхлүүлсэн бөгөөд энэ нь өгөгдлийн хэсэгт settings.txt файл байгаа эсэхийг шалгадаг. Хэрэв тэнд байхгүй бол лавлагаа файлыг оронд нь байрлуулна. Дараа нь системийн тохиргоог сэргээнэ.
    • администраторын нууц үг
    • хостын нэр,
    • цагийн бүс
    • нутаг дэвсгэр
    • Бүх медиа ашиглаж байгаа эсэхийг тодорхойлно. Анхдагч байдлаар, зургийн хэмжээ бага байдаг - зөөвөрлөгч рүү хуулж, бичихэд хялбар байдаг. Эхлэх үед энэ нь ашиглагдаагүй зай байгаа эсэхийг шалгадаг. Хэрэв байгаа бол дискийг дахин хуваана.
    • MAC хаягаас машины ID-г үүсгэж байна. Энэ нь 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 эхлэх болно.

Мөн хоёр дахь үйлчилгээ (заббикс бэлтгэх)

#!/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 болон миний тохиргоог_сэргээх тохиргоог эхлүүлсний дараа. Гэхдээ 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-д дахин ачаалах (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

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх