برای طرح سوال و دسترسی به آموزش ها  کانال ما در تلگرام بپویندید  

اجرای یه برنامه زمان دار با لینوکس مثلا ۳ دقیقه بعد روشن شدن

گاهی پیش میادش که یه برنامه رو می‌خواید تو زمان خاصی یه برنامه رو تو لینوکس اجرا کنید خب کار سختی نیستش ولی به دو تا ویژگی سیستم نیاز دارید، یکی تایمر و دیگری سرویس‌ها اینجوری راحت می‌تونید مشخص سیستم عامل تو چه زمانی برنامه شما رو اجرا کنه، من خودم مثلا برنامه solaar رو که برای کیبورد لاجتیک هستش بعد سه دقیقه می‌خوام ببندم. چون تنظیمات مورد نیازم اعمال شده این مثال رو برای این موضوع انتخاب کردم شما می‌تونید کل کارتون رو یه bash script کنید و این کار رو انجام بدید.

 

مرحله اول تعریف یه service تو لینوکس

تعریف سرویس تو لینوکس خیلی رایجه و کار سختی نیستش و مثال رو براتون می‌ذارم توضیحش می‌دم.

# /etc/systemd/system/solaar-kill.service
[Unit]
Description=Kill Solaar after boot

[Service]
Type=oneshot
ExecStart=/usr/bin/pkill solaar

خب خط اول ادرس فایل رو به صورت کامنت نوشتم این مسیر پیش فرض برای سرویس هاست با نام فایل دلخواه خودم.
بعد توضیحات هستش.

بعدش رسرویس مشخص شده یک بار قرار اجرا بشه می‌تونید اینو عوض کنید.

و در انتها نوشتم که چه کاری کنید می‌تونید اینجا bash script خودتون رو بذارید، فقط یادتون نره: ۱. نباید آدرسش تغییر کنه بعد استفاده تو سرویس، ۲. حتما دسترسی اجرا رو داشته باشه

تمام به همین راحتی سرویس تعریف شد ولی فعالش نمی‌کنیم چون نیاز هستش با تایمر اجرا بشه:

مرحله دوم تعریف یه timer در systemd

این مرحله یه تایمر اضافه می‌کنیم؛

# /etc/systemd/system/solaar-kill.timer
[Unit]
Description=Timer to run solaar-kill.service 3 minutes after boot

[Timer]
OnBootSec=3min
Unit=solaar-kill.service

[Install]
WantedBy=timers.target

خط اول مشخصا آدرس دلخواه من هستش مثل service دقیقا منتها این بار اسم باید به timer ختم بشه نه به کلمه service .
بعدش توضیحات رو نوشتم
بعد زمان اجرا رو نوشتم که سه دقیقه بعد بالا اومدن سیستم اجرا بشه.
بعدش سرویس مورد نظرم که قبلا تعریف کردم  رو می‌نویسم حواستون باشه اسم فایل انتخابی شما باید یکی باشه.

و مرحله آخر این تایمر رو نیاز به صورت خودکار فعال می‌کنه یعنی از بودنش اطمینان حاصل می‌کنه.

اما به جز OnBootSec چه چیز های دیگه‌ای میشه استفاده کرد:

گزینه‌های زمان‌بندی در بخش [Timer]

کلید توضیح مثال
OnBootSec زمان‌گذاری نسبت به زمان بوت سیستم OnBootSec=5min
OnStartupSec زمان‌گذاری نسبت به زمان شروع systemd (قبل از ورود به حالت multi‑user) OnStartupSec=30s
OnActiveSec زمان‌گذاری نسبت به زمان فعال شدن آخرین بار واحد (service یا timer) OnActiveSec=1h
OnUnitActiveSec مشابه OnActiveSec ولی برای واحد هدف (target) مشخص OnUnitActiveSec=2h
OnUnitInactiveSec زمان‌گذاری نسبت به زمان غیرفعال شدن آخرین بار واحد هدف OnUnitInactiveSec=15min
OnCalendar زمان‌بندی بر پایه تقویم (روز، ساعت، ماه و …) OnCalendar=*-*-* 02:00:00
OnClockChange اجرا وقتی ساعت سیستم تغییر می‌کند (مثلاً به‌روزرسانی NTP) OnClockChange=yes
OnTimezoneChange اجرا وقتی منطقه زمانی تغییر می‌کند OnTimezoneChange=yes
AccuracySec حداکثر انحراف زمانی که systemd می‌تواند برای بهینه‌سازی ترکیب timerها اعمال کند AccuracySec=1min
RandomizedDelaySec افزودن تاخیر تصادفی به مقدار مشخص (برای پخش بار) RandomizedDelaySec=30s
Persistent اگر سیستم در زمان برنامه‌ریزی شده خاموش باشد، پس از روشن شدن دوباره اجرا شود Persistent=yes
WakeSystem اجازه می‌دهد timer سیستم را از حالت خواب بیدار کند WakeSystem=yes
Unit نام سرویسی که توسط timer فراخوانی می‌شود (در همان بخش) Unit=solaar‑kill.service
RemainAfterElapse پس از اجرا، وضعیت فعال باقی بماند (معمولاً برای سرویس‌های یک‌بار) RemainAfterElapse=yes

 

این‌ها اکثر کلیدهای قابل استفاده در بخش [Timer] هستند؛ می‌توانید ترکیبی از آن‌ها را برای زمان‌بندی دقیق‌تر به کار ببرید.

به همین سادگی به همین خوشمزگی 😁 یه جوک برنامه‌نویسی آخرش بگم ببینم کی متوجه میشه:

چرا برنامه‌نویس‌ها همیشه ساعت ۳ صبح بیدار می‌مانند؟
چون وقتی systemd timer درست تنظیم می‌شود، دیگر نیازی به «خوابیدن با sleep 180» ندارند!


انتشار

در

,

توسط

برچسب‌ها:

نظرات

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *