ሲስተምድ፣ በይነተገናኝ ስክሪፕቶች እና ሰዓት ቆጣሪዎች

ሲስተምድ፣ በይነተገናኝ ስክሪፕቶች እና ሰዓት ቆጣሪዎች

መግቢያ

ለሊኑክስ ሲገነቡ ስርዓቱ ሲበራ ወይም ሲዘጋ የሚከናወኑ በይነተገናኝ ስክሪፕቶችን የመፍጠር ተግባር ይነሳል። በስርዓት V ውስጥ ይህ ቀላል ነበር, ነገር ግን በስርዓት ማስተካከያ ማስተካከያዎችን ያደርጋል. ግን የራሱ የሰዓት ቆጣሪዎች ሊኖሩት ይችላል።

ለምን ኢላማዎች እንፈልጋለን?

ዒላማ በሲስተም V -init ውስጥ እንደ runlevel ተመሳሳይነት እንደሚያገለግል ብዙ ጊዜ ተጽፏል። በመሠረቱ አልስማማም። ብዙዎቹ አሉ እና ፓኬጆችን በቡድን መከፋፈል እና ለምሳሌ የአገልግሎቶችን ቡድን በአንድ ትዕዛዝ ማስጀመር እና ተጨማሪ ድርጊቶችን ማከናወን ይችላሉ. ከዚህም በላይ ጥገኞች ብቻ እንጂ ተዋረድ የላቸውም።

ሲነቃ የዒላማ ምሳሌ (የባህሪ አጠቃላይ እይታ) ከአሂድ መስተጋብራዊ ስክሪፕት ጋር

የዒላማው ራሱ መግለጫ፡-

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

በጣም አስፈላጊው ነገር የመጨረሻውን መምረጥ ነው targetላማ - ስርዓቱ በሚነሳበት ጊዜ መድረስ ያለበት ዒላማ። በጅማሬው ሂደት, systemd ጥገኞችን በማለፍ አስፈላጊውን ሁሉ ይጀምራል.
final.targetን ለመምረጥ የተለያዩ መንገዶች አሉ, ለዚህ የመጫኛ አማራጭን ተጠቀምኩ.

የመጨረሻው ማስጀመሪያ ይህንን ይመስላል።

  1. ቡት ጫኚው ይጀምራል
  2. የቡት ጫኚው የመጨረሻውን የዒላማ መለኪያ በማለፍ firmware ን ማስጀመር ይጀምራል
  3. Systemd ስርዓቱን መጀመር ይጀምራል. በቅደም ተከተል ወደ installer.target ወይም work.target ከመሰረታዊ.ዒላማው በነሱ ጥገኞች በኩል ይሄዳል (ለምሳሌ፣ multi-user.target)። የኋለኛው ደግሞ ስርዓቱን በሚፈለገው ሁነታ ላይ ያመጣል

ለመጀመር firmware በማዘጋጀት ላይ

ፈርምዌርን በሚፈጥሩበት ጊዜ ስራው በሚነሳበት ጊዜ የስርዓቱን ሁኔታ ወደነበረበት መመለስ እና ሲዘጋ ማስቀመጥ ሁልጊዜ ይነሳል. ግዛት ማለት የውቅር ፋይሎች፣ የውሂብ ጎታ ማከማቻዎች፣ የበይነገጽ መቼቶች፣ ወዘተ ማለት ነው።

Systemd ሂደቶችን በትይዩ በተመሳሳይ ዒላማ ያካሂዳል። የስክሪፕቶችን ጅምር ቅደም ተከተል ለመወሰን የሚያስችሉዎት ጥገኞች አሉ።

በእኔ ፕሮጀክት ውስጥ እንዴት እንደሚሰራ ( https://habr.com/ru/post/477008/ https://github.com/skif-web/monitor)

  1. ስርዓቱ ይጀምራል
  2. የ settings_restore.አገልግሎት አገልግሎት ተጀምሯል።የሴቲንግ.txt ፋይል በመረጃ ክፍል ውስጥ መኖሩን ያረጋግጣል። እዚያ ከሌለ የማጣቀሻ ፋይል በእሱ ቦታ ላይ ተቀምጧል, በመቀጠል, የስርዓት ቅንጅቶች ወደነበሩበት ይመለሳሉ.
    • የአስተዳዳሪ የይለፍ ቃል
    • የአስተናጋጅ ስም ፣
    • የጊዜ ክልል
    • አካባቢያዊ
    • ሁሉም ሚዲያ ጥቅም ላይ እየዋለ መሆኑን ይወስናል። በነባሪ, የምስሉ መጠን ትንሽ ነው - ወደ ሚዲያ ለመቅዳት እና ለመቅዳት ቀላልነት. በሚነሳበት ጊዜ፣ አሁንም ጥቅም ላይ ያልዋለ ቦታ እንዳለ ይፈትሻል። ካለ, ዲስኩ እንደገና ተከፍሏል.
    • ማሽን-መታወቂያ ከ MAC አድራሻ በማመንጨት ላይ። በDHCP በኩል ተመሳሳይ አድራሻ ለማግኘት ይህ አስፈላጊ ነው።
    • የአውታረ መረብ ቅንብሮች
    • የምዝግብ ማስታወሻዎችን መጠን ይገድባል
    • ውጫዊው ድራይቭ ለስራ እየተዘጋጀ ነው (ተዛማጁ አማራጭ ከነቃ እና ድራይቭ አዲስ ከሆነ)
  3. postgresq ጀምር
  4. የመልሶ ማግኛ አገልግሎት ይጀምራል። Zabbix እራሱን እና የውሂብ ጎታውን ለማዘጋጀት ያስፈልጋል፡-
    • አስቀድሞ የዛቢክስ ዳታቤዝ መኖሩን ያረጋግጣል። ካልሆነ፣ ከመነሻ ማጠራቀሚያዎች (ከዛቢክስ ጋር ተጨምሮ) የተፈጠረ ነው።
    • የሰዓት ሰቆች ዝርዝር ተፈጠረ (በድር በይነገጽ ውስጥ ለማሳየት ያስፈልጋል)
    • የአሁኑ አይፒ ተገኝቷል፣ በችግር ውስጥ ይታያል (ወደ ኮንሶሉ የመግባት ግብዣ)
  5. ግብዣው ይለወጣል - ለስራ ዝግጁ የሚለው ሐረግ ይታያል
  6. firmware ለአገልግሎት ዝግጁ ነው።

የአገልግሎት ፋይሎቹ አስፈላጊ ናቸው, እነሱ የማስጀመሪያቸውን ቅደም ተከተል ያዘጋጃሉ

[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

እዚህ ትንሽ የበለጠ የተወሳሰበ ነው። ማስጀመሪያው በባለብዙ ተጠቃሚ.ዒላማ ላይ ነው፣ነገር ግን የድህረ ድህረ ገፅ DBMS እና የእኔ ቅንብር_ወደነበረበት መመለስ ከጀመርን በኋላ። ግን የዛቢክስ አገልግሎቶችን ከመጀመርዎ በፊት።

የሰዓት ቆጣሪ አገልግሎት ለ logrotate

ሲስተምድ 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 ውጭ ነው የሚፈጸሙት! ለመፈተሽ ቀላል ነው - የቲ ትዕዛዙን ይለጥፉ እና ውጤቱን ያስቀምጡ።

ስለዚህ ማቋረጡን በዒላማዬ ተግባራዊ አድርጌያለሁ። 100% ትክክል ነኝ አልልም፣ ግን ይሰራል!
እንዴት እንደተከናወነ (በአጠቃላይ ሁኔታ)
በማንም ላይ ያልተመካ my_shutdown. targetላማ ፈጠርኩ፡-
my_shutdown.ዒላማ

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

ወደዚህ ኢላማ ስንሄድ (በSystemctl isolate my_shutdwn.target)፣የmy_shutdown.አገልግሎት አገልግሎቱን ጀምሯል፣ይህም ተግባር ቀላል ነው -የ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

  • በዚህ ስክሪፕት ውስጥ አስፈላጊዎቹን ድርጊቶች እፈጽማለሁ. ለተለዋዋጭነት እና ምቾት ብዙ ስክሪፕቶችን ወደ ዒላማው ማከል ይችላሉ፡

የኔ_መዘጋት.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 አማራጮች አሉ-

  • ዳግም ማስነሳቱን፣ መዘጋቱን እና ሌሎች ትዕዛዞችን (አሁንም የስርዓት ሲቲኤል ምልክቶች ናቸው) በስክሪፕትዎ ይተኩ። በስክሪፕቱ ውስጥ፣ ወደ my_shutdown.target ይሂዱ። እና በዒላማው ውስጥ ያሉት ስክሪፕቶች በቀጥታ ወደ systemctl ይደውሉ፣ ለምሳሌ systemctl ዳግም አስነሳ
  • ቀለል ያለ አማራጭ, ግን አልወደውም. በሁሉም በይነገጾች መዘጋት/ዳግም ማስነሳት/ሌላ አትጥራ፣ነገር ግን በቀጥታ ወደ ኢላማው systemctl ጥራ my_shutdown.target

የመጀመሪያውን አማራጭ መርጫለሁ. በ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

ምንጭ: hab.com

አስተያየት ያክሉ