Systemd, අන්තර්ක්‍රියාකාරී ස්ක්‍රිප්ට් සහ ටයිමර්

Systemd, අන්තර්ක්‍රියාකාරී ස්ක්‍රිප්ට් සහ ටයිමර්

හැඳින්වීම

Linux සඳහා සංවර්ධනය කිරීමේදී, පද්ධතිය සක්‍රිය කර හෝ වසා දැමීමේදී ක්‍රියාත්මක වන අන්තර්ක්‍රියාකාරී ස්ක්‍රිප්ට් නිර්මාණය කිරීමේ කාර්යය පැන නගී. පද්ධතිය 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 තෝරා ගැනීමට විවිධ ක්‍රම තිබේ, මම මේ සඳහා loader විකල්පය භාවිතා කළෙමි.

අවසාන දියත් කිරීම මේ වගේ ය:

  1. ඇරඹුම් කාරකය ආරම්භ වේ
  2. bootloader 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 සමඟ ඇතුළත්)
    • වේලා කලාප ලැයිස්තුවක් සාදනු ලැබේ (ඒවා වෙබ් අතුරු මුහුණතේ පෙන්වීමට අවශ්‍ය වේ)
    • වත්මන් IP සොයාගෙන ඇත, එය ගැටළුවක් ලෙස පෙන්වනු ලැබේ (කොන්සෝලය වෙත ලොග් වීමට ආරාධනාව)
  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

එය මෙහි ටිකක් සංකීර්ණයි. දියත් කිරීම බහු-පරිශීලක. ඉලක්කය තුළ ද ඇත, නමුත් postgresql DBMS සහ මගේ 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 විකල්පය සමඟ Oneshot සේවාවක් සෑදීම සාමාන්‍යයෙන් නිර්දේශ කරනු ලැබේ, නමුත් මෙය අන්තර්ක්‍රියාකාරී ස්ක්‍රිප්ට් එකක් සෑදීමෙන් ඔබව වළක්වයි.

නමුත් කාරණය වන්නේ 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 ක් ඇත:

  • reboot, shutdown සහ අනෙකුත් විධාන (ඒවා තවමත් systemctl වෙත symlinks වේ) ඔබේ script එක සමඟ ප්‍රතිස්ථාපනය කරන්න. script එක ඇතුලේ my_shutdown.target වෙත යන්න. ඉලක්කය තුළ ඇති ස්ක්‍රිප්ට් පසුව systemctl කෙලින්ම අමතන්න, උදාහරණයක් ලෙස, systemctl reboot
  • සරල විකල්පයක්, නමුත් මම එයට කැමති නැත. සියලුම අතුරුමුහුණත් වලදී, shutdown/reboot/other ලෙස අමතන්න එපා, නමුත් ඉලක්කගත systemctl isolate my_shutdown.target වෙත කෙලින්ම අමතන්න.

මම පළමු විකල්පය තෝරා ගත්තා. systemd හි, reboot (poweroff වැනි) යනු systemd වෙත symlinks වේ.

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

අදහස් එක් කරන්න