Systemd, sib tham sib scripts thiab timers

Systemd, sib tham sib scripts thiab timers

Taw qhia

Thaum txhim kho rau Linux, txoj haujlwm ntawm kev tsim cov ntawv sib tham sib tham uas raug tua thaum lub kaw lus qhib lossis kaw tshwm sim. Hauv system V qhov no yooj yim, tab sis nrog systemd nws ua kev hloov kho. Tab sis nws tuaj yeem muaj nws tus kheej timers.

Vim li cas peb thiaj xav tau lub hom phiaj?

Nws yog feem ntau sau tias lub hom phiaj ua hauj lwm raws li ib qho analogue ntawm runlevel hauv system V -init. Kuv yeej tsis pom zoo. Muaj ntau ntawm lawv thiab koj tuaj yeem faib cov pob khoom rau hauv pab pawg thiab, piv txwv li, tso ib pab pawg ntawm cov kev pabcuam nrog ib qho lus txib thiab ua haujlwm ntxiv. Ntxiv mus, lawv tsis muaj hierarchy, tsuas yog dependencies.

Piv txwv ntawm lub hom phiaj thaum enabled (feature overview) nrog khiav sib tham sib tsab ntawv

Kev piav qhia ntawm lub hom phiaj nws tus kheej:

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

Lub hom phiaj no yuav pib thaum multi-user.target tau pib thiab hu rau installer.service. Txawm li cas los xij, tej zaum yuav muaj ntau yam kev pabcuam.

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

Thiab thaum kawg, ib qho piv txwv ntawm tsab ntawv raug tua:

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

Qhov tseem ceeb tshaj plaws yog xaiv qhov kawg.target - lub hom phiaj uas lub kaw lus yuav tsum tuaj txog thaum pib. Thaum lub sij hawm pib txheej txheem, systemd yuav mus los ntawm cov dependencies thiab tso txhua yam nws xav tau.
Muaj ntau txoj hauv kev los xaiv final.target, Kuv siv qhov kev xaiv loader rau qhov no.

Qhov kawg launches zoo li no:

  1. Lub bootloader pib
  2. Lub bootloader pib launching lub firmware los ntawm dhau qhov kawg.target parameter
  3. Systemd pib pib qhov system. Sequentially mus rau installer.target los yog work.target los ntawm Basic.target los ntawm lawv cov dependencies (piv txwv li, multi-user.target). Lub tom kawg coj lub kaw lus mus ua haujlwm nyob rau hauv hom xav tau

Npaj lub firmware rau tso tawm

Thaum tsim firmware, txoj hauj lwm ib txwm tshwm sim ntawm kev kho lub xeev lub xeev thaum pib thiab txuag nws thaum kaw. State txhais tau tias configuration ntaub ntawv, database dumps, interface settings, thiab lwm yam.

Systemd khiav cov txheej txheem nyob rau hauv tib lub hom phiaj nyob rau hauv parallel. Muaj kev vam meej uas tso cai rau koj los txiav txim qhov pib ua ntu zus ntawm cov ntawv sau.

Nws ua haujlwm li cas hauv kuv qhov project ( https://habr.com/ru/post/477008/ https://github.com/skif-web/monitor)

  1. Lub kaw lus pib
  2. Cov kev pabcuam settings_restore.service tau pib. Yog tias nws tsis nyob ntawd, ces cov ntaub ntawv siv tau muab tso rau hauv nws qhov chaw.
    • tus thawj tswj password
    • hostname,
    • thaj tsam
    • thaj chaw
    • Txiav txim siab seb puas yog txhua qhov kev tshaj tawm raug siv. Los ntawm lub neej ntawd, cov duab loj me me - kom yooj yim ntawm kev luam thiab kaw rau hauv xov xwm. Thaum pib, nws tshawb xyuas seb puas tseem muaj qhov chaw tsis siv. Yog hais tias muaj, lub disk yog repartitioned.
    • Tsim tshuab-id los ntawm MAC chaw nyob. Qhov no tseem ceeb heev kom tau txais tib qhov chaw nyob ntawm DHCP
    • Network nqis
    • Txwv qhov loj ntawm cov cav
    • Cov tsav sab nraud tau npaj rau kev ua haujlwm (yog tias qhov kev xaiv sib raug tau qhib thiab tsav yog tshiab)
  3. Pib postgresq
  4. Qhov kev pab cuam rov qab pib. Nws yuav tsum tau npaj zabbix nws tus kheej thiab nws cov ntaub ntawv:
    • Tshawb xyuas seb puas muaj cov ntaub ntawv zabbix lawm. Yog hais tias tsis yog, nws yog tsim los ntawm initialization dumps (nrog rau zabbix)
    • ib daim ntawv teev cov cheeb tsam lub sij hawm yog tsim (yuav tsum tau muab tso rau hauv lub web interface)
    • Tus IP tam sim no pom, nws tau tshwm sim hauv qhov teeb meem (kev caw kom nkag mus rau hauv lub console)
  5. Cov lus caw hloov pauv - kab lus Npaj ua haujlwm tshwm
  6. Lub firmware yog npaj rau kev siv

Cov ntaub ntawv kev pabcuam yog qhov tseem ceeb, lawv yog cov uas tau teem caij rau lawv qhov kev tso tawm

[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

Raws li koj tuaj yeem pom, Kuv tau teeb tsa kev vam khom kom kuv cov ntawv ua ntej ua haujlwm, thiab tsuas yog tom qab ntawd lub network yuav nce thiab DBMS yuav pib.

Thiab qhov kev pabcuam thib ob (zabbix npaj)

#!/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

Nws yog qhov nyuaj me ntsis ntawm no. Lub community launch kuj tseem nyob rau hauv ntau tus neeg siv.target, tab sis TAM SIM NO pib lub postgresql DBMS thiab kuv setting_restore. Tab sis ua ntej pib zabbix cov kev pabcuam.

Kev pabcuam timer rau logrotate

Systemd tuaj yeem hloov CRON. Tiag tiag. Ntxiv mus, qhov tseeb tsis yog mus txog rau feeb, tab sis mus txog qhov thib ob (dab tsi yog tias nws xav tau). Los yog koj tuaj yeem tsim lub timer monotonous, hu ua timeout los ntawm ib qho kev tshwm sim.
Nws yog lub monotonous timer uas suav lub sijhawm txij li pib lub tshuab uas kuv tsim.
Qhov no yuav xav tau 2 cov ntaub ntawv
logrotateTimer.service - qhov tseeb piav qhia ntawm qhov kev pab cuam:

[Unit]
Description=run logrotate

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

Nws yog ib qho yooj yim - piav qhia ntawm lub launch command.
Cov ntaub ntawv thib ob logrotateTimer.timer yog qhov twg lub sijhawm ua haujlwm:

[Unit]
Description=Run logrotate

[Timer]
OnBootSec=15min
OnUnitActiveSec=15min

[Install]
WantedBy=timers.target

Dab tsi nyob ntawm no:

  • timer piav qhia
  • Thawj lub sij hawm pib, pib los ntawm qhov system khau raj
  • lub sijhawm ntawm kev tshaj tawm ntxiv
  • Nyob ntawm qhov kev pabcuam timer Qhov tseeb, qhov no yog txoj hlua uas ua rau lub sijhawm teem sijhawm

Sib tham sib tsab ntawv thaum kaw thiab koj lub hom phiaj kaw

Hauv lwm txoj kev loj hlob, kuv yuav tsum tau ua ntau txoj hauv kev ntawm kev kaw lub tshuab - los ntawm kuv tus kheej lub hom phiaj, txhawm rau ua ntau yam haujlwm. Nws feem ntau pom zoo kom tsim cov kev pabcuam oneshot nrog RemainAfterExit kev xaiv, tab sis qhov no tiv thaiv koj los ntawm kev tsim cov ntawv sib tham.

Tab sis qhov tseeb yog tias cov lus txib pib los ntawm ExecOnStop kev xaiv raug tua sab nraum TTY! Nws yog ib qho yooj yim mus xyuas - muab tshuaj txhuam tty hais kom ua thiab txuag nws cov zis.

Yog li ntawd, kuv tau siv qhov kev kaw los ntawm kuv lub hom phiaj. Kuv tsis thov kom 100% yog, tab sis nws ua haujlwm!
Nws tau ua li cas (hauv cov ntsiab lus dav dav):
Kuv tsim lub hom phiaj my_shutdown.target, uas tsis nyob ntawm leej twg:
my_shutdown.target

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

Thaum mus rau lub hom phiaj no (ntawm systemctl cais my_shutdwn.target), nws tau pib qhov kev pabcuam my_shutdown.service, txoj haujlwm uas yooj yim - kom ua tiav cov ntawv 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

  • Hauv tsab ntawv no kuv ua qhov tsim nyog ua. Koj tuaj yeem ntxiv ntau cov ntawv sau rau lub hom phiaj kom yooj yim thiab yooj yim:

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

Nco tseg. Siv cov ntaub ntawv /tmp/reboot thiab /tmp/shutdown. Koj tsis tuaj yeem hu lub hom phiaj nrog cov ntsuas. Tsuas yog kev pabcuam nkaus xwb.

Tab sis kuv siv lub hom phiaj kom muaj kev hloov pauv hauv kev ua haujlwm thiab kev lees paub ntawm kev ua.

Txawm li cas los xij, qhov nthuav tshaj plaws tuaj tom qab. Lub tshuab yuav tsum tau muab tua / rov pib dua. Thiab muaj 2 txoj kev xaiv:

  • Hloov cov reboot, kaw thiab lwm cov lus txib (lawv tseem yog cov symlinks rau systemctl) nrog koj tsab ntawv. Hauv tsab ntawv, mus rau my_shutdown.target. Thiab cov ntawv sau hauv lub hom phiaj ces hu rau systemctl ncaj qha, piv txwv li, systemctl reboot
  • Ib qho kev xaiv yooj yim, tab sis kuv tsis nyiam nws. Nyob rau hauv tag nrho cov interfaces, tsis txhob hu shutdown / reboot / lwm yam, tab sis ncaj qha hu rau lub hom phiaj systemctl cais my_shutdown.target

Kuv xaiv thawj qhov kev xaiv. Hauv systemd, reboot (xws li poweroff) yog symlinks rau systemd.

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

Yog li ntawd, koj tuaj yeem hloov lawv nrog koj tus kheej cov ntawv sau:
Reboot

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

Tau qhov twg los: www.hab.com

Ntxiv ib saib