Systemd, ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΈ скриптовС ΠΈ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΈ

Systemd, ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΈ скриптовС ΠΈ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΈ

въвСдСниС

ΠŸΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π° Π·Π° Linux възниква Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° Π·Π° създаванС Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΈ скриптовС, ΠΊΠΎΠΈΡ‚ΠΎ сС ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚ ΠΏΡ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅ ΠΈΠ»ΠΈ ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅ Π½Π° систСмата. Π’ system V Ρ‚ΠΎΠ²Π° бСшС лСсно, Π½ΠΎ със systemd ΠΏΡ€Π°Π²ΠΈ ΠΊΠΎΡ€Π΅ΠΊΡ†ΠΈΠΈ. Но ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° свои собствСни Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΈ.

Π—Π°Ρ‰ΠΎ сС Π½ΡƒΠΆΠ΄Π°Π΅ΠΌ ΠΎΡ‚ Ρ†Π΅Π»ΠΈ?

ЧСсто сС пишС, Ρ‡Π΅ target слуТи ΠΊΠ°Ρ‚ΠΎ Π°Π½Π°Π»ΠΎΠ³ Π½Π° runlevel Π² систСмата 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 Π² сСкцията с Π΄Π°Π½Π½ΠΈ. Ако Π½Π΅ Π΅ Ρ‚Π°ΠΌ, Ρ‚ΠΎΠ³Π°Π²Π° Π½Π° мястото ΠΌΡƒ сС поставя Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ‚Π΅Π½ Ρ„Π°ΠΉΠ» Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° систСмнитС настройки сС Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Ρ‚:
    • администраторска ΠΏΠ°Ρ€ΠΎΠ»Π°
    • ΠΈΠΌΠ΅ Π½Π° хост,
    • часова Π·ΠΎΠ½Π°
    • Π»ΠΎΠΊΠ°Π»
    • ΠžΠΏΡ€Π΅Π΄Π΅Π»Ρ Π΄Π°Π»ΠΈ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ всички носитСли. По ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π΅ малък - Π·Π° лСсно ΠΊΠΎΠΏΠΈΡ€Π°Π½Π΅ ΠΈ запис Π½Π° носитСл. ΠŸΡ€ΠΈ стартиранС Ρ‚ΠΎΠΉ провСрява Π΄Π°Π»ΠΈ всС ΠΎΡ‰Π΅ ΠΈΠΌΠ° Π½Π΅ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΎ място. Ако ΠΈΠΌΠ°, Π΄ΠΈΡΠΊΡŠΡ‚ сС прСраздСля.
    • Π“Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½Π° машина ΠΎΡ‚ MAC адрСс. Π’ΠΎΠ²Π° Π΅ Π²Π°ΠΆΠ½ΠΎ Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° ΡΡŠΡ‰ΠΈΡ адрСс Ρ‡Ρ€Π΅Π· DHCP
    • ΠœΡ€Π΅ΠΆΠΎΠ²ΠΈ настройки
    • ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π°Π²Π° Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° Ρ‚Ρ€ΡƒΠΏΠΈΡ‚Π΅
    • Π’ΡŠΠ½ΡˆΠ½ΠΎΡ‚ΠΎ устройство сС подготвя Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° (Π°ΠΊΠΎ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½Π°Ρ‚Π° опция Π΅ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π½Π° ΠΈ устройството Π΅ Π½ΠΎΠ²ΠΎ)
  3. Π‘Ρ‚Π°Ρ€Ρ‚ΠΈΡ€Π°ΠΉΡ‚Π΅ postgresq
  4. Услугата Π·Π° Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ стартира. НСобходимо Π΅ Π΄Π° ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²ΠΈΡ‚Π΅ самия zabbix ΠΈ Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ:
    • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ²Π° Π΄Π°Π»ΠΈ Π²Π΅Ρ‡Π΅ ΠΈΠΌΠ° zabbix Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ. Ако Π½Π΅, Ρ‚ΠΎΠΉ сС създава ΠΎΡ‚ дъмповС Π·Π° инициализация (Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈ със zabbix)
    • създава сС списък с часови Π·ΠΎΠ½ΠΈ (Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° ΠΏΠΎΠΊΠ°Π·Π²Π°Π½Π΅Ρ‚ΠΎ ΠΈΠΌ Π² ΡƒΠ΅Π± интСрфСйса)
    • ВСкущият IP Π΅ Π½Π°ΠΌΠ΅Ρ€Π΅Π½, Ρ‚ΠΎΠΉ сС ΠΏΠΎΠΊΠ°Π·Π²Π° Π² ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ (ΠΏΠΎΠΊΠ°Π½Π° Π·Π° Π²Π»ΠΈΠ·Π°Π½Π΅ Π² ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π°)
  5. ΠŸΠΎΠΊΠ°Π½Π°Ρ‚Π° сС промСня - появява сС Ρ„Ρ€Π°Π·Π°Ρ‚Π° Ready to work
  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

ΠšΠ°ΠΊΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅, инсталирах зависимости, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ моят скрипт ΠΏΡŠΡ€Π²ΠΎ Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΈ Π΅Π΄Π²Π° слСд Ρ‚ΠΎΠ²Π° ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π° Π΄Π° сС ΠΊΠ°Ρ‡ΠΈ ΠΈ Π‘Π£Π‘Π” Π΄Π° стартира.

И Π²Ρ‚ΠΎΡ€Π°Ρ‚Π° услуга (ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π½Π° 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 ΠΈ моя setting_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. НС ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°Ρ‚Π΅ target с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ. Π’ΡŠΠ·ΠΌΠΎΠΆΠ΅Π½ Π΅ само сСрвиз.

Но ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ target, Π·Π° Π΄Π° ΠΈΠΌΠ°ΠΌ Π³ΡŠΠ²ΠΊΠ°Π²ΠΎΡΡ‚ Π² Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° ΠΈ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π°Π½ Ρ€Π΅Π΄ Π½Π° дСйствията.

Най-интСрСсното ΠΎΠ±Π°Ρ‡Π΅ Π΄ΠΎΠΉΠ΄Π΅ ΠΏΠΎ-късно. ΠœΠ°ΡˆΠΈΠ½Π°Ρ‚Π° трябва Π΄Π° сС ΠΈΠ·ΠΊΠ»ΡŽΡ‡ΠΈ/рСстартира. И ΠΈΠΌΠ° 2 ΠΎΠΏΡ†ΠΈΠΈ:

  • Π—Π°ΠΌΠ΅Π½Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡ‚Π΅ Π·Π° рСстартиранС, ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ (Ρ‚Π΅ всС ΠΎΡ‰Π΅ са символни Π²Ρ€ΡŠΠ·ΠΊΠΈ към systemctl) с вашия скрипт. Π’ΡŠΡ‚Ρ€Π΅ Π² скрипта ΠΎΡ‚ΠΈΠ΄Π΅Ρ‚Π΅ Π½Π° my_shutdown.target. И скриптовСтС Π²ΡŠΡ‚Ρ€Π΅ Π² Ρ†Π΅Π»Ρ‚Π° слСд Ρ‚ΠΎΠ²Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°Ρ‚ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ systemctl, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ systemctl reboot
  • По-прост Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, Π½ΠΎ Π½Π΅ ΠΌΠΈ харСсва. Π’ΡŠΠ² всички интСрфСйси Π½Π΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π°ΠΉΡ‚Π΅ 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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€