Systemd, interactive nga mga script ug timer

Systemd, interactive nga mga script ug timer

Pasiuna

Kung nag-develop alang sa Linux, ang tahas sa paghimo og mga interactive nga mga script nga gipatuman kung ang sistema gi-on o gipalong. Sa sistema V kini sayon, apan sa systemd naghimo kini og mga kausaban. Apan mahimo kini nga adunay kaugalingon nga mga timer.

Ngano nga kinahanglan naton ang mga target?

Kanunay gisulat nga ang target nagsilbi nga analogue sa runlevel sa sistema V -init. Sa sukaranan dili ko mouyon. Adunay daghan pa niini ug mahimo nimong bahinon ang mga pakete sa mga grupo ug, pananglitan, maglunsad og usa ka grupo sa mga serbisyo nga adunay usa ka sugo ug maghimo og dugang nga mga aksyon. Dugang pa, wala silay hierarchy, mga dependency lamang.

Panig-ingnan sa target kung gi-enable (kinatibuk-an sa bahin) nga adunay nagdagan nga interactive nga script

Deskripsyon sa target mismo:

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

Kini nga target magsugod kung ang multi-user.target gilansad ug motawag sa installer.service. Bisan pa, mahimong adunay daghang ingon nga mga serbisyo.

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

Ug sa katapusan, usa ka pananglitan sa script nga gipatuman:

#!/bin/bash
# ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π² tty3
chvt 3
echo "Install, y/n ?"
read user_answer

Ang labing importante nga butang mao ang pagpili sa final.target - ang target diin ang sistema kinahanglan nga moabut sa pagsugod. Atol sa proseso sa pagsugod, ang systemd moagi sa mga dependency ug maglunsad sa tanan nga gikinahanglan niini.
Adunay lain-laing mga paagi sa pagpili sa final.target, akong gigamit ang loader kapilian alang niini.

Ang katapusan nga paglansad ingon niini:

  1. Nagsugod ang bootloader
  2. Ang bootloader magsugod sa paglansad sa firmware pinaagi sa pagpasa sa final.target parameter
  3. Ang Systemd nagsugod sa pagsugod sa sistema. Sunod-sunod nga moadto sa installer.target o work.target gikan sa basic.target pinaagi sa ilang mga dependency (pananglitan, multi-user.target). Ang ulahi nagdala sa sistema sa pagtrabaho sa gusto nga mode

Pag-andam sa firmware alang sa paglansad

Sa paghimo sa firmware, ang buluhaton kanunay nga mitungha sa pagpasig-uli sa sistema sa estado sa pagsugod ug sa pagluwas niini sa diha nga shut down. Ang estado nagpasabot sa mga file sa pag-configure, mga paglabay sa database, mga setting sa interface, ug uban pa.

Ang Systemd nagpadagan sa mga proseso sa parehas nga target nga managsama. Adunay mga dependency nga nagtugot kanimo sa pagtino sa han-ay sa pagsugod sa mga script.

Giunsa kini pagtrabaho sa akong proyekto ( https://habr.com/ru/post/477008/ https://github.com/skif-web/monitor)

  1. Nagsugod ang sistema
  2. Gilunsad ang serbisyo sa settings_restore.service. Gisusi niini ang presensya sa settings.txt file sa seksyon sa datos. Kung wala kini, nan usa ka reference file ang gibutang sa iyang lugar. Sunod, ang mga setting sa sistema gipahiuli:
    • password sa tagdumala
    • hostname
    • time zone
    • lokal
    • Pagtino kung ang tanan nga media gigamit. Sa kasagaran, ang gidak-on sa imahe gamay - para sa kadali sa pagkopya ug pagrekord sa media. Sa pagsugod, gisusi niini kung naa pa bay wala magamit nga wanang. Kung adunay, ang disk gibahin pag-usab.
    • Paghimo machine-id gikan sa MAC address. Importante kini sa pagkuha sa samang adres pinaagi sa DHCP
    • Mga setting sa network
    • Limitahi ang gidak-on sa mga troso
    • Ang eksternal nga drive giandam alang sa trabaho (kung ang katugbang nga kapilian gipagana ug ang drive bag-o)
  3. Pagsugod sa postgresq
  4. Nagsugod ang serbisyo sa pagpasig-uli. Gikinahanglan ang pag-andam sa zabbix mismo ug ang database niini:
    • Susihon kung aduna na bay database sa zabbix. Kung dili, kini gimugna gikan sa initialization dumps (gilakip sa zabbix)
    • usa ka lista sa mga time zone ang gihimo (gikinahanglan aron ipakita kini sa web interface)
    • Ang kasamtangan nga IP nakit-an, kini gipakita sa isyu (imbitasyon sa pag-log in sa console)
  5. Ang imbitasyon nagbag-o - ang hugpong sa mga pulong Andam sa pagtrabaho makita
  6. Ang firmware andam na alang sa paggamit

Ang mga file sa serbisyo hinungdanon, sila ang nagtakda sa pagkasunod-sunod sa ilang paglansad

[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

Sama sa imong makita, nag-instalar ako og mga dependency aron ang akong script una nga molihok, ug unya ang network mosaka ug ang DBMS magsugod.

Ug ang ikaduhang serbisyo (pag-andam sa 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

Kini usa ka gamay nga mas komplikado dinhi. Ang paglansad anaa usab sa multi-user.target, apan HUMAN magsugod ang postgresql DBMS ug ang akong setting_restore. Apan sa wala pa magsugod ang mga serbisyo sa zabbix.

Serbisyo sa timer para sa logrotate

Ang Systemd mahimong mopuli sa CRON. Seryoso. Dugang pa, ang katukma dili hangtod sa minuto, apan hangtod sa ikaduha (unsa kung gikinahanglan) O mahimo ka maghimo usa ka monotonous timer, nga gitawag sa usa ka timeout gikan sa usa ka panghitabo.
Kini ang monotonous timer nga nag-ihap sa oras gikan sa pagsugod sa makina nga akong gibuhat.
Nagkinahanglan kini og 2 ka mga file
logrotateTimer.service - ang aktuwal nga paghulagway sa serbisyo:

[Unit]
Description=run logrotate

[Service]
ExecStart=logrotate /etc/logrotate.conf
TimeoutSec=300

Yano ra - paghulagway sa mando sa paglansad.
Ang ikaduha nga file logrotateTimer.timer diin ang mga timer nagtrabaho:

[Unit]
Description=Run logrotate

[Timer]
OnBootSec=15min
OnUnitActiveSec=15min

[Install]
WantedBy=timers.target

Unsay naa diri:

  • paghulagway sa timer
  • Unang panahon sa pagsugod, sugod sa sistema boot
  • panahon sa dugang nga paglansad
  • Pagsalig sa serbisyo sa timer. Sa tinuud, kini ang string nga naghimo sa timer

Interactive nga script kung nagsira ug ang imong target sa pagsira

Sa lain nga pag-uswag, kinahanglan nako nga buhaton ang usa ka labi ka komplikado nga bersyon sa pagpalong sa makina - pinaagi sa akong kaugalingon nga target, aron mahimo ang daghang mga aksyon. Kasagaran girekomenda nga maghimo usa ka serbisyo nga oneshot nga adunay kapilian nga RemainAfterExit, apan kini nagpugong kanimo sa paghimo usa ka interactive nga script.

Apan ang tinuod mao nga ang mga sugo nga gilusad sa ExecOnStop nga opsyon gipatuman sa gawas sa TTY! Sayon ang pagsusi - idikit ang tty command ug i-save ang output niini.

Busa, akong gipatuman ang pagsira pinaagi sa akong target. Wala ko nag-angkon nga 100% husto, apan kini molihok!
Giunsa kini gihimo (sa kinatibuk-ang termino):
Naghimo ko og target my_shutdown.target, nga wala magdepende ni bisan kinsa:
my_shutdown.target

[Unit]
Description=my shutdown
AllowIsolate=yes
Wants=my_shutdown.service 

Kung moadto sa kini nga target (pinaagi sa systemctl isolate my_shutdwn.target), gilunsad niini ang my_shutdown.service nga serbisyo, ang tahas nga yano - aron ipatuman ang my_shutdown.sh script:

[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

  • Sa sulod niini nga script akong gihimo ang gikinahanglan nga mga aksyon. Mahimo nimong idugang ang daghang mga script sa target alang sa kadali ug kadali:

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

Nota. Gamit ang /tmp/reboot ug /tmp/shutdown files. Dili ka makatawag sa target nga adunay mga parameter. Serbisyo ra ang mahimo.

Apan gigamit nako ang target aron adunay pagka-flexible sa trabaho ug usa ka garantiya nga han-ay sa mga aksyon.

Apan, ang labing makaiikag nga butang miabut sa ulahi. Kinahanglang palongon/i-restart ang makina. Ug adunay 2 nga kapilian:

  • Ilisan ang reboot, shutdown ug uban pang commands (symlinks pa sila sa systemctl) sa imong script.Sa sulod sa script, adto sa my_shutdown.target. Ug ang mga script sa sulod sa target dayon tawagan ang systemctl direkta, pananglitan, systemctl reboot
  • Usa ka mas simple nga kapilian, apan dili ko ganahan niini. Sa tanan nga mga interface, ayaw tawga ang shutdown/reboot/uban pa, apan direkta nga tawagan ang target systemctl isolate my_shutdown.target

Gipili nako ang una nga kapilian. Sa systemd, ang reboot (sama sa poweroff) mga symlink sa systemd.

ls -l /sbin/poweroff 
lrwxrwxrwx 1 root root 14 сСн 30 18:23 /sbin/poweroff -> /bin/systemctl

Busa, mahimo nimong pulihan kini sa imong kaugalingon nga mga script:
reboot

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

Source: www.habr.com

Idugang sa usa ka comment