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

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

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

ΠŸΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΠΎΠ΄ linux Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Π·Π°Π΄Π°Ρ‡ΠΈ создания ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… скриптов, выполняСмых ΠΏΡ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΈΠ»ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ систСмы. Π’ system V это дСлалось Π»Π΅Π³ΠΊΠΎ, Π½ΠΎ с systemd вносит ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹. Π—Π°Ρ‚ΠΎ ΠΎΠ½ΠΎ ΡƒΠΌΠ΅Π΅Ρ‚ свои Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρ‹.

Π—Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½Ρ‹ target

Часто ΠΏΠΈΡˆΡƒΡ‚, Ρ‡Ρ‚ΠΎ target слуТат Π°Π½Π°Π»ΠΎΠ³ΠΎΠΌ runlevel Π² system V -init. Π’ ΠΊΠΎΡ€Π½Π΅ Π½Π΅ согласСн. Π˜Ρ… большС ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΏΠΎ Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌ ΠΈ, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡƒ сСрвисов, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ дСйствия. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρƒ Π½ΠΈΡ… Π½Π΅Ρ‚ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ зависимости.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ target ΠΏΡ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ(ΠΎΠ±Π·ΠΎΡ€ возмоТности) с запуском ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ скрипта

ОписаниС самого target:

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

Π”Π°Π½Π½Ρ‹ΠΉ target запустится, ΠΊΠΎΠ³Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡ‰Π΅Π½ 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 β€” 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 Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. Если Π΅Π³ΠΎ Π½Π΅Ρ‚, Ρ‚ΠΎ Π½Π° Π΅Π³ΠΎ мСсто кладётся эталонный Ρ„Π°ΠΉΠ».Π”Π°Π»Π΅Π΅ происходит восстановлСниС настроСк систСмы:
    • пароля администратора
    • hostname,
    • часового пояс
    • локаль
    • ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅, вСсь Π»ΠΈ Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ±Ρ€Π°Π·Π° нСбольшой β€” для удобства копирования ΠΈ записи Π½Π° Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒ. ΠŸΡ€ΠΈ стартС провСряСтся β€” Π΅ΡΡ‚ΡŒ Π»ΠΈ Π΅Ρ‰Ρ‘ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ мСсто. Если Π΅ΡΡ‚ΡŒ β€” диск пСрСразбиваСтся.
    • ГСнСрация machine-id ΠΈΠ· MAC-адрСса. Π­Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ для получСния ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ адрСса ΠΏΠΎ DHCP
    • Настройки сСти
    • ΠžΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ΡΡ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π»ΠΎΠ³ΠΎΠ²
    • ΠŸΠΎΠ΄Π³ΠΎΡ‚Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚ΡΡ ΠΊ Ρ€Π°Π±ΠΎΡ‚Π° внСшний диск(Ссли Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ опция ΠΈ диск Π½ΠΎΠ²Ρ‹ΠΉ)
  3. Π—Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ postgresq
  4. запускаСтся сСрвис restore. Он Π½ΡƒΠΆΠ΅Π½ для ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ самого zabbix ΠΈ Π΅Π³ΠΎ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…:
    • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚ΡΡ, Π΅ΡΡ‚ΡŒ Π»ΠΈ ΡƒΠΆΠ΅ Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… zabbix. Если Π½Π΅Ρ‚ β€” создаСтся ΠΈΠ· ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… Π΄Π°ΠΌΠΏΠΎΠ²(ΠΈΠ΄ΡƒΡ‚ Π² поставкС zabbix)
    • создаСтся список часовых поясов (Π½ΡƒΠΆΠ½ΠΎ для ΠΈΡ… отобраТСния Π² web-интСрфСйсС)
    • Находится Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ IP, ΠΎΠ½ выводится Π² issue (ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΠ΅ для Π²Ρ…ΠΎΠ΄Π° Π² консоли)
  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 ΠΈ ΠΌΠΎΠ΅Π³ΠΎ 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

Π§Ρ‚ΠΎ здСсь Π΅ΡΡ‚ΡŒ:

  • описаниС Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°
  • ВрСмя ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ запуска, начиная ΠΎΡ‚ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ систСм
  • ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠΈΡ… запусков
  • Π—Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ слуТбы Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΎΠ².ЀактичСски, это строка ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‚Π°ΠΉΠΌΠ΅Ρ€

Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ скрипт ΠΏΡ€ΠΈ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΈ свой Ρ‚Π°Ρ€Π³Π΅Ρ‚ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

Π’ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΌΠ½Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π΄Π΅Π»Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ слоТный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ β€” Ρ‡Π΅Ρ€Π΅Π· собствСнный Ρ‚Π°Ρ€Π³Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ мноТСство дСйствий. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ рСкомСндуСтся ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ сСрвис 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/shutdown. НСльзя Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ target с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ. МоТно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ service.

Но я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ target, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ Π² Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΈ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ порядок выполнСния дСйствий.

Однако, самоС интСрСсноС Π±Ρ‹Π»ΠΎ ΠΏΠΎΡ‚ΠΎΠΌ. ΠœΠ°ΡˆΠΈΠ½Ρƒ ΠΆΠ΅ Π½Π°Π΄ΠΎ Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ/ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ. И Ρ‚ΡƒΡ‚ Π΅ΡΡ‚ΡŒ 2 Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°:

  • Π—Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ reboot,shutdown ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅(ΠΎΠ½ΠΈ всС Ρ€Π°Π²Π½ΠΎ ΡΠ²Π»ΡΡŽΡ‚ΡΡ симлинками Π½Π° systemctl) Π½Π° свой скрипт.Π’Π½ΡƒΡ‚Ρ€ΠΈ скрипта β€” ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π² my_shutdown.target. А скрипты Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ‚Π°Ρ€Π³Π΅Ρ‚Π° ΠΏΠΎΡ‚ΠΎΠΌ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ systemctl, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, systemctl reboot
  • Π‘ΠΎΠ»Π΅Π΅ простой, Π½ΠΎ ΠΌΠ½Π΅ Π½Π΅ нравящийся Π²Π°Ρ€ΠΈΠ°Π½Ρ‚. Π’ΠΎ всСх интСрфСйсах Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅ shutdown/reboot/ΠΏΡ€ΠΎΡ‡ΠΈΠ΅, Π° Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚Π°Ρ€Π³Π΅Ρ‚ 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

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π° свои скрипты:
reboot

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

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com