Systemd, ibanisọrọ awọn iwe afọwọkọ ati aago

Systemd, ibanisọrọ awọn iwe afọwọkọ ati aago

Ifihan

Nigbati o ba ndagbasoke fun Linux, iṣẹ ṣiṣe ti ṣiṣẹda awọn iwe afọwọkọ ibaraenisepo ti o ṣiṣẹ nigbati eto ba wa ni titan tabi tiipa dide. Ni eto V yi rorun, ṣugbọn pẹlu systemd o mu ki awọn atunṣe. Ṣugbọn o le ni awọn aago tirẹ.

Kini idi ti a nilo awọn ibi-afẹde?

Nigbagbogbo a kọ pe ibi-afẹde n ṣiṣẹ bi afọwọṣe ti runlevel ninu eto V -init. Mo Pataki koo. Diẹ sii ninu wọn wa ati pe o le pin awọn idii si awọn ẹgbẹ ati, fun apẹẹrẹ, ṣe ifilọlẹ ẹgbẹ kan ti awọn iṣẹ pẹlu aṣẹ kan ki o ṣe awọn iṣe afikun. Pẹlupẹlu, wọn ko ni awọn ilana, awọn igbẹkẹle nikan.

Apẹẹrẹ ti ibi-afẹde nigbati o ba mu ṣiṣẹ (ayẹwo ẹya ara ẹrọ) pẹlu iwe afọwọkọ ibaraenisepo nṣiṣẹ

Apejuwe ibi-afẹde funrararẹ:

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

Àfojúsùn yii yoo bẹrẹ nigbati multi-user.target ti ṣe ifilọlẹ ati pe o pe installer.service. Sibẹsibẹ, o le jẹ ọpọlọpọ iru awọn iṣẹ bẹ.

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

Ati nikẹhin, apẹẹrẹ ti iwe afọwọkọ ti n ṣiṣẹ:

#!/bin/bash
# Переходим в tty3
chvt 3
echo "Install, y/n ?"
read user_answer

Ohun pataki julọ ni lati yan final.target - ibi-afẹde eyiti eto yẹ ki o de ni ibẹrẹ. Lakoko ilana ibẹrẹ, systemd yoo lọ nipasẹ awọn igbẹkẹle ati ṣe ifilọlẹ ohun gbogbo ti o nilo.
Awọn ọna oriṣiriṣi wa lati yan final.target, Mo lo aṣayan agberu fun eyi.

Ifilọlẹ ikẹhin dabi eyi:

  1. Awọn bootloader bẹrẹ
  2. Bootloader bẹrẹ ifilọlẹ famuwia nipasẹ gbigbe paramita final.target
  3. Systemd bẹrẹ lati bẹrẹ eto naa. Sequentially lọ si installer.target tabi work.target lati basic.target nipasẹ wọn gbára (fun apẹẹrẹ, multi-user.target). Ikẹhin mu eto naa ṣiṣẹ ni ipo ti o fẹ

Ngbaradi famuwia fun ifilọlẹ

Nigbati o ba ṣẹda famuwia, iṣẹ ṣiṣe nigbagbogbo dide ti mimu-pada sipo ipo eto ni ibẹrẹ ati fifipamọ rẹ nigbati o ba pa. Ipinle tumọ si awọn faili atunto, idalenu data, awọn eto wiwo, ati bẹbẹ lọ.

Systemd nṣiṣẹ awọn ilana ni ibi-afẹde kanna ni afiwe. Awọn igbẹkẹle wa ti o gba ọ laaye lati pinnu ilana ibẹrẹ ti awọn iwe afọwọkọ.

Bawo ni o ṣe n ṣiṣẹ ninu iṣẹ akanṣe mi ( https://habr.com/ru/post/477008/ https://github.com/skif-web/monitor)

  1. Eto naa bẹrẹ
  2. Awọn iṣẹ settings_restore.service ti ṣe ifilọlẹ. O ṣayẹwo fun wiwa awọn faili settings.txt ni apakan data. Ti ko ba si nibẹ, lẹhinna faili itọkasi ni a gbe si aaye rẹ.
    • ọrọigbaniwọle administrator
    • oruko ogun,
    • agbegbe aago
    • agbegbe
    • Ṣe ipinnu boya gbogbo awọn media ti wa ni lilo. Nipa aiyipada, iwọn aworan jẹ kekere - fun irọrun ti didaakọ ati gbigbasilẹ si media. Ni ibẹrẹ, o ṣayẹwo lati rii boya aaye ṣi wa ti a ko lo. Ti o ba wa, disiki naa ti pin.
    • Ṣiṣẹda ẹrọ-id lati adiresi MAC. Eyi ṣe pataki fun gbigba adirẹsi kanna nipasẹ DHCP
    • Eto nẹtiwọki
    • Ifilelẹ awọn iwọn ti awọn àkọọlẹ
    • Awakọ ita ti wa ni ipese fun iṣẹ (ti o ba mu aṣayan ti o baamu ṣiṣẹ ati pe awakọ naa jẹ tuntun)
  3. Bẹrẹ postgresq
  4. Iṣẹ imupadabọ bẹrẹ. O nilo lati ṣeto zabbix funrararẹ ati aaye data rẹ:
    • Ṣayẹwo boya data data zabbix ti wa tẹlẹ. Ti kii ba ṣe bẹ, o ṣẹda lati awọn idalẹnu ibẹrẹ (pẹlu pẹlu zabbix)
    • A ṣẹda atokọ ti awọn agbegbe akoko (nilo lati ṣafihan wọn ni wiwo wẹẹbu)
    • IP ti o wa lọwọlọwọ wa, o han ni ọran (ifiwepe lati wọle si console)
  5. Ipe ifiwepe naa yipada - gbolohun naa Ṣetan lati ṣiṣẹ yoo han
  6. Famuwia ti šetan fun lilo

Awọn faili iṣẹ jẹ pataki, wọn jẹ awọn ti o ṣeto ọkọọkan ti ifilọlẹ wọn

[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

Bii o ti le rii, Mo fi awọn igbẹkẹle sori ẹrọ ki iwe afọwọkọ mi yoo kọkọ ṣiṣẹ, ati pe lẹhinna nẹtiwọọki yoo lọ soke ati DBMS yoo bẹrẹ.

Ati iṣẹ keji (igbaradi 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

O jẹ idiju diẹ sii nibi. Ifilọlẹ naa tun wa ni multi-user.target, ṣugbọn LEHIN ti o bẹrẹ postgresql DBMS ati settings_restore mi. Ṣugbọn KI o to bẹrẹ awọn iṣẹ zabbix.

Iṣẹ aago fun logrotate

Systemd le rọpo CRON. Ni pataki. Jubẹlọ, awọn išedede ni ko soke si awọn iseju, ṣugbọn soke si awọn keji (kini ti o ba ti o ti wa ni ti nilo) Tabi o le ṣẹda kan monotonous aago, ti a npe ni nipa akoko kan lati iṣẹlẹ.
O jẹ aago monotonous ti o ka akoko lati ibẹrẹ ẹrọ ti Mo ṣẹda.
Eyi yoo nilo awọn faili 2
logrotateTimer.service - apejuwe gangan ti iṣẹ naa:

[Unit]
Description=run logrotate

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

O rọrun - apejuwe ti aṣẹ ifilọlẹ.
Faili keji logrotateTimer.timer ni ibi ti awọn aago ṣiṣẹ:

[Unit]
Description=Run logrotate

[Timer]
OnBootSec=15min
OnUnitActiveSec=15min

[Install]
WantedBy=timers.target

Kini o wa nibi:

  • aago apejuwe
  • Akoko ibẹrẹ akọkọ, bẹrẹ lati bata eto
  • akoko ti siwaju sii awọn ifilọlẹ
  • Igbẹkẹle iṣẹ aago.Ni otitọ, eyi ni okun ti o ṣe aago

Iwe afọwọkọ ibaraenisepo nigba tiipa ati ibi-afẹde tiipa rẹ

Ni idagbasoke miiran, Mo ni lati ṣe ẹya eka diẹ sii ti pipa ẹrọ naa - nipasẹ ibi-afẹde ti ara mi, lati le ṣe ọpọlọpọ awọn iṣe. Nigbagbogbo a ṣe iṣeduro lati ṣẹda iṣẹ onehot pẹlu aṣayan RemainAfterExit, ṣugbọn eyi ṣe idiwọ fun ọ lati ṣiṣẹda iwe afọwọkọ ibaraenisọrọ.

Ṣugbọn otitọ ni pe awọn aṣẹ ti a ṣe ifilọlẹ nipasẹ aṣayan ExecOnStop ni a ṣe ni ita TTY! O rọrun lati ṣayẹwo - lẹẹmọ aṣẹ tty ki o ṣafipamọ iṣẹjade rẹ.

Nitorinaa, Mo ṣe imuse tiipa nipasẹ ibi-afẹde mi. Emi ko beere pe o tọ 100%, ṣugbọn o ṣiṣẹ!
Bii o ti ṣe (ni awọn ofin gbogbogbo):
Mo ṣẹda ibi-afẹde kan my_shutdown.target, eyiti ko dale lori ẹnikẹni:
my_shutdown.afojusun

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

Nigbati o ba lọ si ibi-afẹde yii (nipasẹ systemctl ya sọtọ my_shutdwn.target), o ṣe ifilọlẹ iṣẹ iṣẹ my_shutdown.iṣẹ, iṣẹ ṣiṣe eyiti o rọrun - lati ṣiṣẹ iwe afọwọkọ 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

  • Ninu iwe afọwọkọ yii Mo ṣe awọn iṣe pataki. O le ṣafikun ọpọlọpọ awọn iwe afọwọkọ si ibi-afẹde fun irọrun ati irọrun:

mi_tiipa.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

Akiyesi. Lilo awọn /tmp/atunbere ati /tmp/tiipa awọn faili. O ko le pe afojusun pẹlu awọn paramita. Iṣẹ nikan ṣee ṣe.

Ṣugbọn Mo lo ibi-afẹde lati ni irọrun ni iṣẹ ati aṣẹ aṣẹ ti awọn iṣe.

Sibẹsibẹ, ohun ti o nifẹ julọ wa nigbamii. Ẹrọ naa nilo lati wa ni pipa/tun bẹrẹ. Ati pe awọn aṣayan 2 wa:

  • Rọpo atunbere, tiipa ati awọn ofin miiran (wọn tun jẹ awọn aami si systemctl) pẹlu iwe afọwọkọ rẹ. Ninu iwe afọwọkọ, lọ si my_shutdown.target. Ati awọn iwe afọwọkọ inu ibi-afẹde lẹhinna pe systemctl taara, fun apẹẹrẹ, atunbere systemctl
  • Aṣayan ti o rọrun, ṣugbọn Emi ko fẹran rẹ. Ni gbogbo awọn atọkun, maṣe pe tiipa/atunbere/miiran, ṣugbọn taara pe eto afojusun systemctl ya sọtọ my_shutdown.target

Mo yan aṣayan akọkọ. Ninu eto, atunbere (bii poweroff) jẹ awọn ọna asopọ si eto.

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

Nitorinaa, o le rọpo wọn pẹlu awọn iwe afọwọkọ tirẹ:
atunbere

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

orisun: www.habr.com

Fi ọrọìwòye kun