Systemd, Aksara interaktif tur timers

Systemd, Aksara interaktif tur timers

perkenalan

Nalika ngembang pikeun Linux, tugas nyiptakeun skrip interaktif anu dieksekusi nalika sistem dihurungkeun atanapi dipareuman timbul. Dina sistem V ieu gampang, tapi kalawan systemd ngajadikeun pangaluyuan. Tapi tiasa gaduh timers sorangan.

Naha urang peryogi target?

Seringna diserat yén target janten analog tina runlevel dina sistem V -init. Kuring dasarna teu satuju. Aya seueur deui sareng anjeun tiasa ngabagi bungkusan kana grup sareng, contona, ngaluncurkeun grup jasa kalayan hiji paréntah sareng ngalakukeun tindakan tambahan. Leuwih ti éta, maranéhna teu boga hirarki, ngan gumantung.

Conto udagan nalika diaktipkeun (tinjauan fitur) kalayan ngajalankeun skrip interaktif

Katerangan ngeunaan udagan sorangan:

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 ieu bakal ngamimitian nalika multi-user.target diluncurkeun sareng nelepon installer.service. Sanajan kitu, meureun aya sababaraha layanan misalna.

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

Tungtungna, conto naskah anu dieksekusi:

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

Anu paling penting nyaéta milih final.target - udagan anu sistemna kedah sumping nalika ngamimitian. Salila prosés ngamimitian, systemd bakal ngaliwat katergantungan sareng ngaluncurkeun sadayana anu diperyogikeun.
Aya sababaraha cara pikeun milih final.target, abdi nganggo pilihan loader pikeun ieu.

Peluncuran ahir sapertos kieu:

  1. Bootloader dimimitian
  2. Bootloader mimiti ngaluncurkeun firmware ku ngalangkungan parameter final.target
  3. Systemd mimiti ngamimitian sistem. Sequentially buka installer.target atawa work.target ti basic.target ngaliwatan kagumantungan maranéhanana (contona, multi-user.target). Panungtungan mawa sistem pikeun jalan dina mode nu dipikahoyong

Nyiapkeun firmware pikeun peluncuran

Nalika nyieun firmware, tugas sok timbul mulangkeun kaayaan sistem di ngamimitian tur nyimpen eta nalika shutting handap. State hartina file konfigurasi, dumps database, setélan panganteur, jsb.

Systemd ngajalankeun prosés dina udagan anu sami sacara paralel. Aya kagumantungan anu ngamungkinkeun anjeun pikeun nangtukeun sekuen ngamimitian naskah.

Kumaha gawéna dina proyék kuring ( https://habr.com/ru/post/477008/ https://github.com/skif-web/monitor)

  1. Sistim dimimitian
  2. Ladenan settings_restore.service diluncurkeun. Éta mariksa ayana file settings.txt dina bagian data. Upami teu aya, teras file rujukan disimpen dina tempatna.Salajengna, setélan sistem disimpen deui:
    • sandi administrator
    • ngaran host,
    • zone waktos
    • lokal
    • Nangtukeun naha sadaya média dianggo. Sacara standar, ukuran gambar leutik - pikeun gampang nyalin sareng ngarékam kana média. Dina ngamimitian, éta pariksa ningali naha masih aya rohangan anu henteu dianggo. Upami aya, disk dipisahkeun deui.
    • Ngahasilkeun mesin-id tina alamat MAC. Ieu penting pikeun meunangkeun alamat nu sarua via DHCP
    • Setélan jaringan
    • Ngawatesan ukuran log
    • Drive éksternal nuju disiapkeun pikeun digawé (upami pilihan anu cocog diaktipkeun sareng drive énggal)
  3. Mimitian postgresq
  4. Ladenan pamulihan dimimitian. Ieu diperlukeun pikeun nyiapkeun zabbix sorangan jeung database na:
    • Pariksa naha geus aya database zabbix. Lamun henteu, éta dijieun tina dumps initialization (kaasup kalawan zabbix)
    • daptar zona waktu dijieun (diperlukeun pikeun nembongkeun aranjeunna dina panganteur web)
    • IP ayeuna kapanggih, dipintonkeun dina masalah (ondangan pikeun log in kana konsol nu)
  5. Ondangan robah - frasa Siap dianggo nembongan
  6. Firmware parantos siap dianggo

File jasa penting, aranjeunna mangrupikeun anu ngatur urutan peluncuranana

[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

Sakumaha anjeun tiasa tingali, kuring masang dependensi supados skrip kuring mimiti tiasa dianggo, sareng teras jaringan bakal naék sareng DBMS bakal ngamimitian.

Sareng jasa kadua (persiapan 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

Ieu saeutik leuwih pajeulit di dieu. Peluncuran ogé dina multi-user.target, tapi sanggeus dimimitian postgresql DBMS na setting_restore kuring. Tapi sateuacan ngamimitian jasa zabbix.

jasa timer pikeun logrotate

Systemd tiasa ngagentos CRON. Serius. Sumawona, akurasi henteu dugi ka menit, tapi dugi ka detik (kumaha upami diperyogikeun).
Éta mangrupikeun timer monoton anu ngitung waktos ti mimiti mesin anu ku kuring diciptakeun.
Ieu ngabutuhkeun 2 file
logrotateTimer.service - katerangan sabenerna jasa:

[Unit]
Description=run logrotate

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

Ieu basajan - pedaran paréntah peluncuran.
The file kadua logrotateTimer.timer nyaeta dimana timers dianggo:

[Unit]
Description=Run logrotate

[Timer]
OnBootSec=15min
OnUnitActiveSec=15min

[Install]
WantedBy=timers.target

Aya naon di dieu:

  • pedaran timer
  • Mimiti waktos ngamimitian, mimitian ti boot sistem
  • periode peluncuran salajengna
  • Katergantungan kana layanan timer. Kanyataanna, ieu string nu ngajadikeun timer

Skrip interaktif nalika mareuman sareng target pareum anjeun

Dina pamekaran anu sanés, kuring kedah ngalakukeun versi anu langkung kompleks pikeun mareuman mesin - ngalangkungan udagan kuring sorangan, pikeun ngalakukeun seueur tindakan. Biasana disarankeun pikeun nyieun layanan oneshot sareng pilihan RemainAfterExit, tapi ieu nyegah anjeun nyiptakeun naskah interaktif.

Tapi kanyataanna nyaéta paréntah anu diluncurkeun ku pilihan ExecOnStop dieksekusi di luar TTY! Gampang pariksa - témpél paréntah tty sareng simpen kaluaranna.

Ku alatan éta, kuring ngalaksanakeun shutdown ngaliwatan udagan kuring. Kuring teu ngaku 100% bener, tapi jalan!
Kumaha éta dilakukeun (sacara umum):
Kuring nyiptakeun target my_shutdown.target, anu henteu gumantung ka saha waé:
my_shutdown.target

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

Nalika nuju ka target ieu (via systemctl isolate my_shutdwn.target), éta ngaluncurkeun jasa my_shutdown.service, anu tugasna saderhana - pikeun ngaéksekusi skrip 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

  • Di jero naskah ieu kuring ngalakukeun tindakan anu diperyogikeun. Anjeun tiasa nambihan seueur skrip kana udagan pikeun kalenturan sareng genah:

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

Catetan. Nganggo file /tmp/reboot sareng /tmp/shutdown. Anjeun teu bisa nelepon target kalawan parameter. Ngan jasa anu mungkin.

Tapi kuring nganggo target pikeun gaduh kalenturan dina padamelan sareng urutan tindakan anu dijamin.

Sanajan kitu, hal paling metot datang engké. Mesin kudu dipareuman/dibalikan deui. Sareng aya 2 pilihan:

  • Ngaganti reboot nu, shutdown sarta paréntah séjén (aranjeunna masih symlinks mun systemctl) kalawan Aksara Anjeun.Di jero naskah, buka my_shutdown.target. Sareng skrip di jero target teras nyauran systemctl langsung, contona, reboot systemctl
  • Pilihan anu langkung saderhana, tapi kuring henteu resep. Dina sakabéh interfaces, ulah nelepon shutdown / reboot / séjén, tapi langsung nelepon target systemctl ngasingkeun my_shutdown.target

Kuring milih pilihan kahiji. Dina systemd, reboot (sapertos poweroff) mangrupikeun symlink ka systemd.

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

Janten, anjeun tiasa ngagentosana ku skrip anjeun nyalira:
reboot

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

sumber: www.habr.com

Tambahkeun komentar