گاهی پیش میادش که یه برنامه رو میخواید تو زمان خاصی یه برنامه رو تو لینوکس اجرا کنید خب کار سختی نیستش ولی به دو تا ویژگی سیستم نیاز دارید، یکی تایمر و دیگری سرویسها اینجوری راحت میتونید مشخص سیستم عامل تو چه زمانی برنامه شما رو اجرا کنه، من خودم مثلا برنامه 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» ندارند!


دیدگاهتان را بنویسید لغو پاسخ