စနစ်ဖြင့်၊ အပြန်အလှန်အကျိုးပြုသော ဇာတ်ညွှန်းများနှင့် အချိန်တိုင်းကိရိယာများ

စနစ်ဖြင့်၊ အပြန်အလှန်အကျိုးပြုသော ဇာတ်ညွှန်းများနှင့် အချိန်တိုင်းကိရိယာများ

နိဒါန်း

Linux အတွက် တီထွင်သည့်အခါ၊ စနစ်အား ဖွင့်ထားသောအခါ သို့မဟုတ် ပိတ်သွားသောအခါတွင် လုပ်ဆောင်သည့် အပြန်အလှန်အကျိုးပြုသော script များကို ဖန်တီးရန် တာဝန်ဖြစ်သည်။ System V တွင်၎င်းသည်လွယ်ကူသော်လည်း systemd ဖြင့်ချိန်ညှိမှုများပြုလုပ်သည်။ ဒါပေမယ့် သူ့မှာ ကိုယ်ပိုင် timers ရှိနိုင်ပါတယ်။

ဘာကြောင့် ပစ်မှတ်တွေ လိုအပ်တာလဲ။

ပစ်မှတ်သည် system V -init တွင် runlevel ၏ analogue အဖြစ်ဆောင်ရွက်သည်ဟုမကြာခဏရေးထားသည်။ အခြေခံအားဖြင့် သဘောမတူပါ။ ၎င်းတို့ထဲမှ ပိုများပြီး သင်သည် packages များကို အုပ်စုများခွဲနိုင်ပြီး ဥပမာအားဖြင့်၊ command တစ်ခုတည်းဖြင့် ဝန်ဆောင်မှုအုပ်စုတစ်စုကို စတင်ပြီး အပိုလုပ်ဆောင်ချက်များကို လုပ်ဆောင်နိုင်သည်။ ထို့အပြင် ၎င်းတို့တွင် အထက်တန်းအဆင့်မရှိ၊ မှီခိုမှုသာရှိသည်။

အပြန်အလှန်အကျိုးသက်ရောက်သော script ကိုဖွင့်ထားသောအခါ (အင်္ဂါရပ်အကျဉ်းချုပ်) ကိုဖွင့်ထားသောအခါပစ်မှတ်၏ဥပမာ

ပစ်မှတ်ကိုယ်တိုင်၏ ရှင်းလင်းချက်-

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

အရေးကြီးဆုံးအချက်မှာ system startup တွင်ရောက်ရှိသင့်သောပစ်မှတ် final.target ကိုရွေးချယ်ရန်ဖြစ်သည်။ စတင်သည့် လုပ်ငန်းစဉ်အတွင်း၊ systemd သည် မှီခိုအားထားမှုများကို ဖြတ်သန်းပြီး လိုအပ်သမျှကို စတင်ပါမည်။
final.target ကို ရွေးရန် မတူညီသော နည်းလမ်းများ ရှိပါသည်၊ ဤအတွက် loader option ကို ကျွန်တော် အသုံးပြုခဲ့သည်။

နောက်ဆုံးလွှတ်တင်ပုံမှာ ဤကဲ့သို့ဖြစ်သည်-

  1. bootloader စတင်သည်။
  2. bootloader သည် final.target parameter ကိုဖြတ်သန်းခြင်းဖြင့် firmware ကိုစတင်သည်။
  3. Systemd သည် system ကိုစတင်သည်။ ၎င်းတို့၏မှီခိုမှုများမှတဆင့် installer.target သို့မဟုတ် work.target သို့ ဆက်တိုက်သွားသည် (ဥပမာ၊ multi-user.target)။ နောက်ဆုံးတွင် system ကိုအလိုရှိသောမုဒ်တွင်အလုပ်လုပ်စေသည်။

စတင်ခြင်းအတွက် firmware ကို ပြင်ဆင်နေပါသည်။

Firmware ဖန်တီးသည့်အခါ၊ လုပ်ငန်းစတင်ချိန်တွင် စနစ်အခြေအနေကို ပြန်လည်ရယူပြီး ပိတ်သည့်အခါ ၎င်းကို သိမ်းဆည်းရန် အမြဲတမ်းလုပ်ဆောင်ရမည့်တာဝန်ဖြစ်သည်။ State ဆိုသည်မှာ configuration files၊ database dumps၊ interface settings စသည်တို့ကို ဆိုလိုသည်။

Systemd သည် လုပ်ငန်းစဉ်များကို တူညီသောပစ်မှတ်တွင် အပြိုင်လုပ်ဆောင်သည်။ scripts များ၏ startup sequence ကိုဆုံးဖြတ်ရန်ခွင့်ပြုသောမှီခိုမှုများရှိသည်။

ငါ့ပရောဂျက်မှာ ဘယ်လိုအလုပ်လုပ်လဲ ( https://habr.com/ru/post/477008/ https://github.com/skif-web/monitor)

  1. စနစ်စတင်သည်။
  2. settings_restore.service ဝန်ဆောင်မှုကို စတင်လိုက်ပါပြီ။ ၎င်းသည် ဒေတာကဏ္ဍရှိ settings.txt ဖိုင်၏ ပါဝင်မှုကို စစ်ဆေးသည်။ ၎င်းတွင်မရှိပါက၊ ရည်ညွှန်းဖိုင်ကို ၎င်း၏နေရာတွင် ထားရှိမည်ဖြစ်သည်။ ထို့နောက်၊ စနစ်ဆက်တင်များကို ပြန်လည်ရယူသည်-
    • administrator စကားဝှက်
    • အိမ်ရှင်အမည်၊
    • အချိန်ဇုန်
    • ဒေသ
    • မီဒီယာအားလုံးကို အသုံးပြုခြင်းရှိမရှိ ဆုံးဖြတ်သည်။ ပုံမှန်အားဖြင့်၊ ပုံအရွယ်အစားသည် သေးငယ်သည် - မီဒီယာသို့ ကူးယူရန်နှင့် မှတ်တမ်းတင်ရန် လွယ်ကူစေရန်။ စတင်ချိန်တွင်၊ ၎င်းသည် အသုံးမပြုရသေးသော နေရာရှိမရှိ စစ်ဆေးသည်။ ရှိလျှင်, disk ကို repartitioned ။
    • MAC လိပ်စာမှ machine-id ကိုထုတ်ပေးခြင်း။ ၎င်းသည် DHCP မှတစ်ဆင့် တူညီသောလိပ်စာကို ရယူရန်အတွက် အရေးကြီးပါသည်။
    • ကွန်ရက်ဆက်တင်များ
    • သစ်လုံးများ၏ အရွယ်အစားကို ကန့်သတ်ထားသည်။
    • ပြင်ပဒရိုက်ကို အလုပ်အတွက် ပြင်ဆင်နေပါသည် (သက်ဆိုင်ရာ ရွေးချယ်ခွင့်ကို ဖွင့်ထားပြီး ဒရိုက်သည် အသစ်ဖြစ်ပါက)
  3. postgresq ကိုစတင်ပါ။
  4. ပြန်လည်ရယူခြင်းဝန်ဆောင်မှုစတင်သည်။ zabbix ကိုယ်တိုင်နှင့် ၎င်း၏ဒေတာဘေ့စ်ကို ပြင်ဆင်ရန် လိုအပ်သည်-
    • zabbix ဒေတာဘေ့စ် ရှိနှင့်ပြီးသား ရှိမရှိ စစ်ဆေးပါ။ မဟုတ်ပါက၊ ၎င်းကို ကနဦးသတ်မှတ်ခြင်း အမှိုက်ပုံများ (zabbix ပါ၀င်သည်) မှ ဖန်တီးထားသည်။
    • အချိန်ဇုန်များစာရင်းကို ဖန်တီးထားသည် (၎င်းတို့ကို ဝဘ်အင်တာဖေ့စ်တွင် ပြသရန် လိုအပ်သည်)
    • လက်ရှိ IP ကို ​​တွေ့ရှိပြီး ပြဿနာတွင် ပြသနေသည် (ကွန်ဆိုးလ်သို့ ဝင်ရောက်ရန် ဖိတ်ကြားချက်)
  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

သင်တွေ့မြင်ရသည့်အတိုင်း၊ ကျွန်ုပ်၏ script ကို ဦးစွာအလုပ်လုပ်စေရန် မှီခိုအားထားမှုများကို ထည့်သွင်းပြီးမှသာ ကွန်ရက်တက်လာပြီး 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 နှင့် ကျွန်ုပ်၏ setting_restore ကိုစတင်ပြီးနောက်တွင်ဖြစ်သည်။ သို့သော် zabbix ဝန်ဆောင်မှုများမစတင်မီ။

logrotate အတွက် timer ဝန်ဆောင်မှု

Systemd သည် CRON ကိုအစားထိုးနိုင်သည်။ အလေးအနက်ထား။ ထို့အပြင်၊ တိကျမှုမှာ တစ်မိနစ်အထိမဟုတ်သော်လည်း တစ်စက္ကန့်အထိ (လိုအပ်ပါက မည်သို့လုပ်ဆောင်မည်နည်း) သို့မဟုတ် ဖြစ်ရပ်တစ်ခုမှ အချိန်ကုန်သွားခြင်းဟုခေါ်သော ငွီးငှေ့နေသည့်အချိန်တိုင်းကို သင်ဖန်တီးနိုင်သည်။
၎င်းသည် ကျွန်ုပ်ဖန်တီးခဲ့သည့် စက်စတင်ချိန်မှ အချိန်ကို ရေတွက်သည့် ငွီနီသော အချိန်တိုင်းကိရိယာဖြစ်သည်။
၎င်းသည် ဖိုင် ၂ ဖိုင် လိုအပ်မည်ဖြစ်သည်။
logrotateTimer.service - ဝန်ဆောင်မှု၏ အမှန်တကယ်ဖော်ပြချက်-

[Unit]
Description=run logrotate

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

ရိုးရှင်းသည် - launch command ၏ဖော်ပြချက်။
ဒုတိယဖိုင် logrotateTimer.timer သည် တိုင်မာများ အလုပ်လုပ်သည့်နေရာဖြစ်သည်-

[Unit]
Description=Run logrotate

[Timer]
OnBootSec=15min
OnUnitActiveSec=15min

[Install]
WantedBy=timers.target

ဒီမှာ ဘာလဲ-

  • timer ဖော်ပြချက်
  • ပထမဆုံး စတင်ချိန်၊ စနစ်စတင်ချိန်မှ စတင်သည်။
  • ထပ်မံလွှင့်တင်မည့်ကာလ
  • timer ဝန်ဆောင်မှုအပေါ် မူတည်. အမှန်တော့၊ ဒါက timer ကို ပြုလုပ်ပေးတဲ့ string ဖြစ်ပါတယ်။

ပိတ်သည့်အခါ အပြန်အလှန်အကျိုးပြုသော ဇာတ်ညွှန်းနှင့် သင်၏ပိတ်ပစ်ရန် ပစ်မှတ်

အခြားသော ဖွံ့ဖြိုးတိုးတက်မှုတွင်၊ လုပ်ဆောင်ချက်များစွာကို လုပ်ဆောင်ရန်အတွက် ကျွန်ုပ်၏ကိုယ်ပိုင်ပစ်မှတ်မှတစ်ဆင့် စက်ကိုပိတ်ရန် ပိုမိုရှုပ်ထွေးသောဗားရှင်းကို လုပ်ဆောင်ရမည်ဖြစ်သည်။ RemainAfterExit ရွေးချယ်မှုဖြင့် oneshot ဝန်ဆောင်မှုကို ဖန်တီးရန် များသောအားဖြင့် အကြံပြုထားသော်လည်း ၎င်းသည် သင့်အား အပြန်အလှန်အကျိုးပြုသော script တစ်ခုဖန်တီးခြင်းမှ တားဆီးပေးပါသည်။

သို့သော်အမှန်မှာ ExecOnStop ရွေးချယ်မှုမှထုတ်လွှတ်သော command များကို TTY ပြင်ပတွင်လုပ်ဆောင်နေခြင်းဖြစ်သည်။ စစ်ဆေးရန် လွယ်ကူသည် - tty command ကို paste လုပ်ပြီး ၎င်း၏ output ကို သိမ်းဆည်းပါ။

ထို့ကြောင့် ကျွန်ုပ်သည် ကျွန်ုပ်၏ပစ်မှတ်ဖြင့် ပိတ်ပစ်ခြင်းကို အကောင်အထည်ဖော်ခဲ့ပါသည်။ 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 script ကိုလုပ်ဆောင်ရန်-

[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

  • ဤဇာတ်ညွှန်းတွင် ကျွန်ုပ်သည် လိုအပ်သော လုပ်ဆောင်ချက်များကို လုပ်ဆောင်ပါသည်။ ပြောင်းလွယ်ပြင်လွယ်နှင့် အဆင်ပြေစေရန် ပစ်မှတ်သို့ script အများအပြားကို သင်ထည့်နိုင်သည်။

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 ခုရှိပါတယ်။

  • သင့် script နှင့် reboot၊ shutdown နှင့် အခြားသော commands (၎င်းတို့သည် systemctl ၏ ​​symlinks များဖြစ်နေဆဲ) ကို အစားထိုးပါ။ script အတွင်း၊ my_shutdown.target သို့ သွားပါ။ ပစ်မှတ်အတွင်းရှိ script များသည် systemctl ကိုတိုက်ရိုက်ခေါ်ဆိုပါ၊ ဥပမာ၊ systemctl ပြန်လည်စတင်ပါ။
  • ပိုရိုးရှင်းတဲ့ ရွေးချယ်မှုတစ်ခု၊ ဒါပေမယ့် ကျွန်တော်မကြိုက်ဘူး။ အင်တာဖေ့စ်အားလုံးတွင်၊ shutdown/reboot/other ကိုမခေါ်ပါနှင့်၊ သို့သော် ပစ်မှတ် systemctl isolate my_shutdown.target ကို တိုက်ရိုက်ခေါ်ဆိုပါ။

ပထမရွေးချယ်မှုကို ငါရွေးချယ်ခဲ့တယ်။ systemd တွင်၊ reboot (poweroff ကဲ့သို့) သည် systemd သို့ symlink များဖြစ်သည်။

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

ထို့ကြောင့်၊ ၎င်းတို့ကို သင့်ကိုယ်ပိုင် script များဖြင့် အစားထိုးနိုင်သည်-
reboot လုပ်ပါ

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

source: www.habr.com

DDoS ကာကွယ်ရေး၊ VPS VDS ဆာဗာများပါသည့် ဆိုက်များအတွက် ယုံကြည်စိတ်ချရသော hosting ကို ဝယ်ယူပါ။ 🔥 DDoS ကာကွယ်မှု၊ VPS VDS ဆာဗာများပါရှိသော ယုံကြည်စိတ်ချရသော ဝဘ်ဆိုက် hosting ကို ဝယ်ယူပါ | ProHoster