Жүйелі, интерактивті сценарийлер және таймерлер

Жүйелі, интерактивті сценарийлер және таймерлер

Кіріспе

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

Көріп отырғаныңыздай, мен тәуелділіктерді орнаттым, сонда менің сценарийім алдымен жұмыс істейді, содан кейін ғана желі көтеріліп, ДҚБЖ іске қосылады.

Ал екінші қызмет (заббикс дайындау)

#!/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 ДҚБЖ және менің 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 опциясымен бір реттік қызметті жасау ұсынылады, бірақ бұл интерактивті сценарий жасауды болдырмайды.

Бірақ 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 жүйесінде қайта жүктеу (қуатты өшіру сияқты) 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

пікір қалдыру