systemd و نوشتن Unit

زمان‌بندی با systemd timer به جای cron

جایگزین مدرن cron

در سیستم‌های مبتنی بر systemd می‌توان به‌جای cron از timer unit برای زمان‌بندی کارها استفاده کرد. مزیت اصلی این روش نسبت به cron، لاگ یکپارچه در journalctl، امکان مشاهده زمان اجرای بعدی، و مدیریت وابستگی بهتر با سایر سرویس‌هاست. هر timer به یک service با همان نام (بدون پسوند .timer) متصل می‌شود.

› فایل backup.service
[Unit]
Description=گرفتن بکاپ روزانه از دیتابیس

[Service]
Type=oneshot
ExecStart=/opt/scripts/backup.sh
› فایل backup.timer
[Unit]
Description=زمان‌بند اجرای روزانه بکاپ

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true

[Install]
WantedBy=timers.target

گزینه Persistent=true بسیار مهم است: اگر سرور در ساعت اجرا خاموش بوده باشد، به محض روشن شدن، کار عقب‌افتاده اجرا می‌شود؛ رفتاری که cron معمولی ندارد. برای فعال‌سازی و بررسی:

sudo systemctl enable --now backup.timer

› مشاهده زمان اجرای بعدی همه تایمرها
systemctl list-timers

› اجرای دستی برای تست، بدون منتظر ماندن تا زمان مقرر
sudo systemctl start backup.service

عبارت OnCalendar از یک زبان بیانی شبیه اما خواناتر از cron پشتیبانی می‌کند؛ برای مثال Mon..Fri 09:00 یعنی هر روز کاری ساعت نه صبح.

تفاوت دیگر timer با cron، وجود دو نوع زمان‌بندی است: OnCalendar برای زمان‌بندی مطلق (مثل «هر روز ساعت سه بامداد») و OnBootSec یا OnUnitActiveSec برای زمان‌بندی نسبی (مثل «۱۰ دقیقه پس از بوت سیستم» یا «هر یک ساعت پس از آخرین اجرا»). این نوع دوم در cron اصلاً وجود ندارد و برای کارهایی که باید با فاصله ثابت از اجرای قبلی خودشان تکرار شوند، بسیار مناسب‌تر از تعیین یک ساعت مطلق است. همچنین چون هر timer با journalctl یکپارچه است، دیگر نیازی نیست مثل cron خروجی هر اجرا را دستی به یک فایل لاگ جداگانه هدایت کنید؛ همه چیز به‌طور خودکار در ژورنال سیستم قابل جست‌وجوست.

برای ذخیره‌ی پیشرفت و شرکت در آزمون، وارد شوید — رایگان است.