መግቢያ
ለሊኑክስ ሲገነቡ ስርዓቱ ሲበራ ወይም ሲዘጋ የሚከናወኑ በይነተገናኝ ስክሪፕቶችን የመፍጠር ተግባር ይነሳል። በስርዓት 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ን ለመምረጥ የተለያዩ መንገዶች አሉ, ለዚህ የመጫኛ አማራጭን ተጠቀምኩ.
የመጨረሻው ማስጀመሪያ ይህንን ይመስላል።
- ቡት ጫኚው ይጀምራል
- የቡት ጫኚው የመጨረሻውን የዒላማ መለኪያ በማለፍ firmware ን ማስጀመር ይጀምራል
- Systemd ስርዓቱን መጀመር ይጀምራል. በቅደም ተከተል ወደ installer.target ወይም work.target ከመሰረታዊ.ዒላማው በነሱ ጥገኞች በኩል ይሄዳል (ለምሳሌ፣ multi-user.target)። የኋለኛው ደግሞ ስርዓቱን በሚፈለገው ሁነታ ላይ ያመጣል
ለመጀመር firmware በማዘጋጀት ላይ
ፈርምዌርን በሚፈጥሩበት ጊዜ ስራው በሚነሳበት ጊዜ የስርዓቱን ሁኔታ ወደነበረበት መመለስ እና ሲዘጋ ማስቀመጥ ሁልጊዜ ይነሳል. ግዛት ማለት የውቅር ፋይሎች፣ የውሂብ ጎታ ማከማቻዎች፣ የበይነገጽ መቼቶች፣ ወዘተ ማለት ነው።
Systemd ሂደቶችን በትይዩ በተመሳሳይ ዒላማ ያካሂዳል። የስክሪፕቶችን ጅምር ቅደም ተከተል ለመወሰን የሚያስችሉዎት ጥገኞች አሉ።
በእኔ ፕሮጀክት ውስጥ እንዴት እንደሚሰራ (
- ስርዓቱ ይጀምራል
- የ settings_restore.አገልግሎት አገልግሎት ተጀምሯል።የሴቲንግ.txt ፋይል በመረጃ ክፍል ውስጥ መኖሩን ያረጋግጣል። እዚያ ከሌለ የማጣቀሻ ፋይል በእሱ ቦታ ላይ ተቀምጧል, በመቀጠል, የስርዓት ቅንጅቶች ወደነበሩበት ይመለሳሉ.
- የአስተዳዳሪ የይለፍ ቃል
- የአስተናጋጅ ስም ፣
- የጊዜ ክልል
- አካባቢያዊ
- ሁሉም ሚዲያ ጥቅም ላይ እየዋለ መሆኑን ይወስናል። በነባሪ, የምስሉ መጠን ትንሽ ነው - ወደ ሚዲያ ለመቅዳት እና ለመቅዳት ቀላልነት. በሚነሳበት ጊዜ፣ አሁንም ጥቅም ላይ ያልዋለ ቦታ እንዳለ ይፈትሻል። ካለ, ዲስኩ እንደገና ተከፍሏል.
- ማሽን-መታወቂያ ከ MAC አድራሻ በማመንጨት ላይ። በDHCP በኩል ተመሳሳይ አድራሻ ለማግኘት ይህ አስፈላጊ ነው።
- የአውታረ መረብ ቅንብሮች
- የምዝግብ ማስታወሻዎችን መጠን ይገድባል
- ውጫዊው ድራይቭ ለስራ እየተዘጋጀ ነው (ተዛማጁ አማራጭ ከነቃ እና ድራይቭ አዲስ ከሆነ)
- postgresq ጀምር
- የመልሶ ማግኛ አገልግሎት ይጀምራል። Zabbix እራሱን እና የውሂብ ጎታውን ለማዘጋጀት ያስፈልጋል፡-
- አስቀድሞ የዛቢክስ ዳታቤዝ መኖሩን ያረጋግጣል። ካልሆነ፣ ከመነሻ ማጠራቀሚያዎች (ከዛቢክስ ጋር ተጨምሮ) የተፈጠረ ነው።
- የሰዓት ሰቆች ዝርዝር ተፈጠረ (በድር በይነገጽ ውስጥ ለማሳየት ያስፈልጋል)
- የአሁኑ አይፒ ተገኝቷል፣ በችግር ውስጥ ይታያል (ወደ ኮንሶሉ የመግባት ግብዣ)
- ግብዣው ይለወጣል - ለስራ ዝግጁ የሚለው ሐረግ ይታያል
- 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