Systemd, ஊடாடும் ஸ்கிரிப்டுகள் மற்றும் டைமர்கள்

Systemd, ஊடாடும் ஸ்கிரிப்டுகள் மற்றும் டைமர்கள்

அறிமுகம்

லினக்ஸை உருவாக்கும்போது, ​​கணினி இயக்கப்படும்போது அல்லது மூடப்படும்போது செயல்படுத்தப்படும் ஊடாடும் ஸ்கிரிப்ட்களை உருவாக்கும் பணி எழுகிறது. கணினி V இல் இது எளிதாக இருந்தது, ஆனால் systemd உடன் இது மாற்றங்களைச் செய்கிறது. ஆனால் அது அதன் சொந்த டைமர்களைக் கொண்டிருக்கலாம்.

நமக்கு ஏன் இலக்குகள் தேவை?

கணினி V -init இல் ரன்லெவலின் ஒப்புமையாக இலக்கு செயல்படுகிறது என்று அடிக்கடி எழுதப்படுகிறது. நான் அடிப்படையில் உடன்படவில்லை. அவற்றில் பல உள்ளன, மேலும் நீங்கள் தொகுப்புகளை குழுக்களாகப் பிரிக்கலாம், எடுத்துக்காட்டாக, ஒரு கட்டளையுடன் சேவைகளின் குழுவைத் தொடங்கலாம் மற்றும் கூடுதல் செயல்களைச் செய்யலாம். மேலும், அவர்களுக்கு படிநிலை இல்லை, சார்புகள் மட்டுமே உள்ளன.

இயக்கப்படும் ஊடாடும் ஸ்கிரிப்ட் மூலம் இயக்கப்படும் போது இலக்கின் எடுத்துக்காட்டு (அம்ச மேலோட்டம்).

இலக்கின் விளக்கம்:

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

இந்த இலக்கு 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-ஐத் தேர்ந்தெடுப்பது - கணினி தொடக்கத்தில் எந்த இலக்கை அடைய வேண்டும். தொடக்கச் செயல்பாட்டின் போது, ​​systemd சார்புகள் வழியாகச் சென்று தனக்குத் தேவையான அனைத்தையும் தொடங்கும்.
final.target ஐத் தேர்ந்தெடுக்க வெவ்வேறு வழிகள் உள்ளன, இதற்கு ஏற்றி விருப்பத்தைப் பயன்படுத்தினேன்.

இறுதி வெளியீடு இதுபோல் தெரிகிறது:

  1. துவக்க ஏற்றி தொடங்குகிறது
  2. பூட்லோடர் final.target அளவுருவை கடந்து ஃபார்ம்வேரை துவக்குகிறது
  3. Systemd கணினி தொடக்கத்தைத் தொடங்குகிறது. வரிசைமுறையாக, அடிப்படை.இலக்குகளிலிருந்து installer.target அல்லது work.target க்கு அவற்றின் சார்புகள் மூலம் செல்கிறது (உதாரணமாக, multi-user.target). பிந்தையது கணினியை விரும்பிய பயன்முறையில் வேலை செய்யும்.

துவக்கத்திற்கான ஃபார்ம்வேரைத் தயார்படுத்துகிறது

ஃபார்ம்வேரை உருவாக்கும்போது, ​​​​தொடக்கத்தில் கணினி நிலையை மீட்டெடுப்பது மற்றும் மூடும்போது அதைச் சேமிப்பது எப்போதும் பணி எழுகிறது. மாநிலம் என்பது உள்ளமைவு கோப்புகள், தரவுத்தள டம்ப்கள், இடைமுக அமைப்புகள் போன்றவை.

Systemd ஒரே இலக்கில் செயல்முறைகளை இணையாக இயக்குகிறது. ஸ்கிரிப்ட்களின் தொடக்க வரிசையைத் தீர்மானிக்க உங்களை அனுமதிக்கும் சார்புகள் உள்ளன.

எனது திட்டத்தில் இது எவ்வாறு செயல்படுகிறது ( https://habr.com/ru/post/477008/ https://github.com/skif-web/monitor)

  1. அமைப்பு தொடங்குகிறது
  2. settings_restore.service சேவை தொடங்கப்பட்டது. இது தரவுப் பிரிவில் settings.txt கோப்பு உள்ளதா எனச் சரிபார்க்கிறது. அது இல்லை என்றால், ஒரு குறிப்பு கோப்பு அதன் இடத்தில் வைக்கப்படும். அடுத்து, கணினி அமைப்புகள் மீட்டமைக்கப்படும்:
    • நிர்வாகி கடவுச்சொல்
    • புரவலன் பெயர்,
    • நேரம் மண்டலம்
    • இடம்
    • அனைத்து ஊடகங்களும் பயன்படுத்தப்படுகிறதா என்பதைத் தீர்மானிக்கிறது. இயல்பாக, படத்தின் அளவு சிறியதாக உள்ளது - மீடியாவிற்கு நகலெடுப்பதற்கும் பதிவு செய்வதற்கும் எளிதாக. தொடக்கத்தில், இன்னும் பயன்படுத்தப்படாத இடம் இருக்கிறதா என்று பார்க்கிறது. இருந்தால், வட்டு மறுபகிர்வு செய்யப்படுகிறது.
    • MAC முகவரியிலிருந்து இயந்திர ஐடியை உருவாக்குகிறது. DHCP வழியாக அதே முகவரியைப் பெறுவதற்கு இது முக்கியமானது
    • பிணைய அமைப்புகள்
    • பதிவுகளின் அளவைக் கட்டுப்படுத்துகிறது
    • வெளிப்புற இயக்கி வேலைக்குத் தயாராகிறது (தொடர்புடைய விருப்பம் இயக்கப்பட்டிருந்தால் மற்றும் இயக்கி புதியதாக இருந்தால்)
  3. postgresq ஐத் தொடங்கவும்
  4. மீட்பு சேவை தொடங்குகிறது. Zabbix ஐயும் அதன் தரவுத்தளத்தையும் தயார் செய்ய இது தேவைப்படுகிறது:
    • ஏற்கனவே zabbix தரவுத்தளம் உள்ளதா என்பதைச் சரிபார்க்கிறது. இல்லையெனில், இது துவக்க டம்ப்களில் இருந்து உருவாக்கப்பட்டது (zabbix உடன் சேர்க்கப்பட்டுள்ளது)
    • நேர மண்டலங்களின் பட்டியல் உருவாக்கப்பட்டது (இணைய இடைமுகத்தில் அவற்றைக் காண்பிக்க வேண்டும்)
    • தற்போதைய ஐபி கண்டறியப்பட்டது, அது சிக்கலில் காட்டப்படும் (கன்சோலில் உள்நுழைவதற்கான அழைப்பு)
  5. அழைப்பிதழ் மாறுகிறது - வேலைக்கு தயார் என்ற சொற்றொடர் தோன்றும்
  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

நீங்கள் பார்க்க முடியும் என, நான் சார்புகளை நிறுவினேன், அதனால் எனது ஸ்கிரிப்ட் முதலில் வேலை செய்யும், அதன்பிறகுதான் நெட்வொர்க் உயரும் மற்றும் DBMS தொடங்கும்.

மற்றும் இரண்டாவது சேவை (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 DBMS மற்றும் my setting_restore ஐத் தொடங்கிய பிறகு. ஆனால் zabbix சேவைகளை தொடங்குவதற்கு முன்.

லாக்ரோடேட்டிற்கான டைமர் சேவை

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

இங்கே என்ன இருக்கிறது:

  • டைமர் விளக்கம்
  • முதல் தொடக்க நேரம், கணினி துவக்கத்தில் இருந்து தொடங்குகிறது
  • மேலும் ஏவுதல்களின் காலம்
  • டைமர் சேவையைச் சார்ந்திருத்தல். உண்மையில், இது டைமரை உருவாக்கும் சரம்

பணிநிறுத்தம் செய்யும் போது ஊடாடும் ஸ்கிரிப்ட் மற்றும் உங்கள் பணிநிறுத்த இலக்கு

மற்றொரு வளர்ச்சியில், பல செயல்களைச் செய்வதற்காக, எனது சொந்த இலக்கின் மூலம் - இயந்திரத்தை அணைக்க மிகவும் சிக்கலான பதிப்பை நான் செய்ய வேண்டியிருந்தது. 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 கோப்புகளைப் பயன்படுத்துதல். அளவுருக்கள் மூலம் இலக்கை நீங்கள் அழைக்க முடியாது. சேவை மட்டுமே சாத்தியம்.

ஆனால் வேலையில் நெகிழ்வுத்தன்மை மற்றும் செயல்களின் உத்தரவாத வரிசை ஆகியவற்றைக் கொண்டிருக்க நான் இலக்கைப் பயன்படுத்துகிறேன்.

இருப்பினும், மிகவும் சுவாரஸ்யமான விஷயம் பின்னர் வந்தது. இயந்திரத்தை அணைக்க / மறுதொடக்கம் செய்ய வேண்டும். மற்றும் 2 விருப்பங்கள் உள்ளன:

  • மறுதொடக்கம், பணிநிறுத்தம் மற்றும் பிற கட்டளைகளை (அவை இன்னும் systemctl க்கு சிம்லிங்க்களாக உள்ளன) உங்கள் ஸ்கிரிப்டுடன் மாற்றவும். ஸ்கிரிப்ட்டின் உள்ளே, my_shutdown.target க்குச் செல்லவும். இலக்குக்குள் இருக்கும் ஸ்கிரிப்ட்கள் பின்னர் systemctl ஐ நேரடியாக அழைக்கின்றன, எடுத்துக்காட்டாக, systemctl மறுதொடக்கம்
  • எளிமையான விருப்பம், ஆனால் எனக்கு அது பிடிக்கவில்லை. அனைத்து இடைமுகங்களிலும், பணிநிறுத்தம்/மறுதொடக்கம்/மற்றவை என அழைக்க வேண்டாம், ஆனால் இலக்கு systemctl ஐசோலேட் my_shutdown.target ஐ நேரடியாக அழைக்கவும்.

நான் முதல் விருப்பத்தைத் தேர்ந்தெடுத்தேன். systemd இல், reboot (poweroff போன்றவை) systemdக்கான சிம்லிங்க்களாகும்.

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

எனவே, அவற்றை உங்கள் சொந்த ஸ்கிரிப்ட்களால் மாற்றலாம்:
மறுதொடக்கத்தைத்

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

ஆதாரம்: www.habr.com

கருத்தைச் சேர்