سسٽمڊ، انٽرويو اسڪرپٽ ۽ ٽائمر

سسٽمڊ، انٽرويو اسڪرپٽ ۽ ٽائمر

تعارف

جڏهن لينڪس لاءِ ترقي ڪري رهيا آهيو، انٽرايڪٽو اسڪرپٽ ٺاهڻ جو ڪم جيڪو عمل ڪيو ويندو آهي جڏهن سسٽم کي آن يا بند ڪيو ويندو آهي. سسٽم V ۾ اهو آسان هو، پر سسٽم سان اهو ترتيب ڏئي ٿو. پر ان جا پنهنجا ٽائمر ٿي سگهن ٿا.

اسان کي مقصدن جي ضرورت ڇو آهي؟

اهو اڪثر لکيو ويو آهي ته ٽارگيٽ سسٽم 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

سڀ کان اهم شيء فائنل.target کي چونڊڻ آهي - اهو ٽارگيٽ جنهن تي سسٽم کي شروع ٿيڻ تي پهچڻ گهرجي. شروعاتي عمل جي دوران، سسٽم ڊي انحصار جي ذريعي ويندا ۽ هر شي کي ان جي ضرورت کي لانچ ڪندو.
final.target چونڊڻ جا مختلف طريقا آهن، مون ان لاءِ لوڊر آپشن استعمال ڪيو.

آخري لانچ هن طرح ڏسڻ ۾ اچي ٿو:

  1. بوٽ لوڊر شروع ٿئي ٿو
  2. bootloader firmware کي لانچ ڪرڻ شروع ڪري ٿو final.target پيٽرول پاس ڪندي
  3. سسٽم ڊي سسٽم کي شروع ڪرڻ شروع ڪري ٿو. ترتيب سان وڃي ٿو installer.target يا work.target from basic.target انهن جي انحصار ذريعي (مثال طور، multi-user.target). جنهنڪري سسٽم کي گهربل موڊ ۾ ڪم ڪرڻ لاء آڻيندو

لانچ لاءِ فرم ویئر تيار ڪري رهيو آهي

جڏهن فرمائيندڙ ٺاهيندي، ڪم هميشه شروع ٿئي ٿو سسٽم جي حالت کي بحال ڪرڻ ۽ ان کي محفوظ ڪرڻ جڏهن بند ڪيو وڃي. رياست جو مطلب آهي ترتيب واري فائلون، ڊيٽابيس ڊمپ، انٽرفيس سيٽنگون، وغيره.

Systemd ساڳي ٽارگيٽ ۾ عملن کي متوازي ۾ هلائي ٿو. اهڙا انحصار آهن جيڪي توهان کي اسڪرپٽ جي شروعاتي ترتيب کي طئي ڪرڻ جي اجازت ڏين ٿيون.

اهو منهنجي منصوبي ۾ ڪيئن ڪم ڪندو آهي ( https://habr.com/ru/post/477008/ https://github.com/skif-web/monitor)

  1. سسٽم شروع ٿئي ٿو
  2. Settings_restore.service سروس شروع ڪئي وئي آهي. اها ڊيٽا سيڪشن ۾ settings.txt فائل جي موجودگي جي جانچ ڪري ٿي. جيڪڏهن اهو نه آهي، ته پوء هڪ ريفرنس فائل ان جي جاء تي رکيل آهي، اڳيون، سسٽم سيٽنگون بحال ٿيون:
    • منتظم پاسورڊ
    • ميزبان نالو،
    • ٽائيم زون
    • مقامي
    • اهو طئي ڪري ٿو ته ڇا سڀ ميڊيا استعمال ڪيو پيو وڃي. ڊفالٽ طور، تصوير جي سائيز ننڍي آهي - نقل ڪرڻ ۽ ميڊيا کي رڪارڊ ڪرڻ جي آسانيءَ لاءِ. شروعاتي تي، اهو ڏسڻ لاء چيڪ ڪري ٿو ته اڃا تائين غير استعمال ٿيل جاء آهي. جيڪڏهن موجود آهي، ته ڊسڪ repartitioned آهي.
    • MAC ايڊريس مان مشين-id ٺاهي. اهو ساڳيو پتو DHCP ذريعي حاصل ڪرڻ لاء اهم آهي
    • نيٽ ورڪ سيٽنگون
    • لاگن جي سائيز کي محدود ڪري ٿو
    • خارجي ڊرائيو ڪم لاءِ تيار ڪئي پئي وڃي (جيڪڏهن لاڳاپيل آپشن فعال هجي ۽ ڊرائيو نئين هجي)
  3. پوسٽ گريج شروع ڪريو
  4. بحالي سروس شروع ٿئي ٿي. اهو ضروري آهي ته 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

جئين توهان ڏسي سگهو ٿا، مون انحصار انسٽال ڪيو ته جيئن منهنجو اسڪرپٽ پهريون ڪم ڪري، ۽ صرف پوء نيٽ ورڪ مٿي ٿي ويندو ۽ ڊي بي ايم ايس شروع ٿيندي.

۽ ٻي خدمت (زبڪس تيار ڪرڻ)

#!/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 ۾ آهي، پر پوسٽ گريسڪ ايل ڊي بي ايم ايس ۽ منهنجي setting_restore کي شروع ڪرڻ کان پوءِ. پر زيبڪس سروسز شروع ڪرڻ کان اڳ.

logrotate لاء ٽائمر سروس

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 isolate my_shutdown.target

مون پهريون اختيار چونڊيو. سسٽم ڊي ۾، ريبوٽ (جهڙوڪ پاور آف) سسٽم ڊي ڏانهن سم لنڪس آهن.

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

تبصرو شامل ڪريو