تایمرهای systemd را جایگزین cron کردم

linux۱۸ خرداد ۱۴۰۴۶ دقیقه مطالعه

سال‌ها هر کار زمان‌بندی‌شده‌ای را با cron انجام می‌دادم. ساده است و همه‌جا هست. ولی وقتی تعداد کارها زیاد شد و لازم شد بدانم هر کدام دقیقاً کِی و با چه نتیجه‌ای اجرا شده، کم‌کم به مشکل خوردم. این چند وقت سراغ تایمرهای systemd رفتم و دیگر برنگشتم.

مشکل من با cron چه بود؟

سه چیز اذیتم می‌کرد:

ساختار یک تایمر

هر تایمر در واقع دو فایل است: یک .service که می‌گوید چه چیزی اجرا شود و یک .timer که می‌گوید کِی. مثلاً یک بکاپ شبانه:

# /etc/systemd/system/backup.service
[Unit]
Description=Nightly database backup

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
# /etc/systemd/system/backup.timer
[Unit]
Description=Run backup every night

[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true

[Install]
WantedBy=timers.target

آن Persistent=true همان چیزی است که cron نداشت: اگر سرور موقع ۲:۳۰ خاموش بود، به‌محض روشن‌شدن کارِ از‌دست‌رفته اجرا می‌شود.

فعال‌کردن و دیدن وضعیت

sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer

# تایمرهای فعال را ببین
systemctl list-timers

چیزی که بیشتر از همه دوستش دارم این است که لاگ هر اجرا مستقیم در journal است:

journalctl -u backup.service --since today
دیگر لازم نیست خروجی را خودم به فایل redirect کنم؛ همه‌چیز یک‌جا و قابل فیلتر است.

کِی هنوز سراغ cron می‌روم؟

برای یک کار سرراست روی سیستمی که فقط cron دارد (مثلاً یک کانتینر سبک)، هنوز همان یک خط cron منطقی‌تر است. ولی روی هر سروری که systemd دارد، تایمرها برایم برنده‌اند.


→ بازگشت به یادداشت‌ها