مانیتورینگ کرون

عبارت‌های کرون (Cron Expression): راهنمای کامل با مثال.

نویسنده: تیم noc724۴ دقیقه مطالعهبه‌روزرسانی: ۲۶ مهر ۱۴۰۵

عبارت کرون پنج فیلد کوتاهه که «کی» رو توصیف می‌کنه. فشرده و قدرتمنده و خیلی راحت می‌شه یه اشتباه ظریف توش کرد؛ کاری که باید روزی یه بار اجرا بشه، با یه ستاره‌ی جابه‌جا می‌تونه کل دقیقه‌های ساعت ۳ صبح اجرا بشه. این راهنما هر فیلد رو توضیح می‌ده و زمان‌بندی‌هایی آماده‌ی کپی بهتون می‌ده.

نکته‌های کلیدی

  • کرون استاندارد پنج فیلد داره: دقیقه، ساعت، روز ماه، ماه و روز هفته.
  • *، ,، - و / تقریباً هر زمان‌بندی‌ای رو می‌سازن.
  • * 3 * * * بین ۰۳:۰۰ تا ۰۳:۵۹ شصت بار اجرا می‌شه؛ احتمالاً منظورتون 0 3 * * * بوده.
  • کرون از منطقه‌ی زمانی سرور استفاده می‌کنه، مگر اینکه پلتفرم چیز دیگه‌ای بگه.
  • بعضی ابزارها (Quartz، زمان‌بندهای ابری) فیلد ثانیه یا سال اضافه می‌کنن؛ قبل از کپی کردن چک کنید.
قطعی پیش میاد. زود باخبر شید!

noc724 سایت، سرور و APIهای شما رو شبانه‌روز چک می‌کنه و همون لحظه‌ای که چیزی خراب شد با پیامک، تلگرام یا بله خبرتون می‌کنه.

ثبت‌نام رایگان

پنج فیلد

┌───────── دقیقه (0-59)
│ ┌─────── ساعت (0-23)
│ │ ┌───── روز ماه (1-31)
│ │ │ ┌─── ماه (1-12 یا JAN-DEC)
│ │ │ │ ┌─ روز هفته (0-7 یا SUN-SAT؛ صفر و هفت یعنی یکشنبه)
│ │ │ │ │
* * * * *  command

کار وقتی اجرا می‌شه که زمان فعلی با همه‌ی فیلدها جور باشه؛ با یه استثنا برای دو فیلد روز که پایین‌تر توضیح داده شده.

کاراکترهای ویژه

کاراکترمعنیمثالاجرا
*هر مقداری* * * * *هر دقیقه
,فهرست0 8,12,18 * * *ساعت ۸، ۱۲ و ۱۸
-بازه0 9-17 * * *هر ساعت از ۹ تا ۱۷
/گام*/10 * * * *هر ۱۰ دقیقه
a-b/nگام داخل بازه0 8-20/4 * * *۸، ۱۲، ۱۶ و ۲۰

گام‌ها از شروع بازه شمرده می‌شن: */7 در فیلد دقیقه یعنی ۰، ۷، ۱۴ ... ۵۶ و دوباره ۰؛ نه «هر ۷ دقیقه» به‌صورت پیوسته از مرز ساعت.

زمان‌بندی‌های آماده

عبارتزمان‌بندی
*/5 * * * *هر ۵ دقیقه
0 * * * *هر ساعت، سر ساعت
30 2 * * *هر روز ساعت ۰۲:۳۰
0 9 * * 1-5دوشنبه تا جمعه ساعت ۹
0 0 * * 0هر یکشنبه نیمه‌شب
0 6 1 * *روز اول هر ماه ساعت ۶
0 0 1 1 *سالی یه بار، اول ژانویه نیمه‌شب
15 14 * * 6شنبه‌ها ساعت ۱۴:۱۵

در ایران که هفته‌ی کاری معمولاً شنبه تا چهارشنبه است، «روزهای کاری ساعت ۹» می‌شه 0 9 * * 6,0-3.

می‌تونید عبارت‌ها رو با ابزار ساخت عبارت Cron بسازید و چک کنید.

میان‌برها

خیلی از نسخه‌های کرون میان‌برهای اسم‌دار رو قبول می‌کنن:

میان‌برمعادل
@hourly0 * * * *
@daily / @midnight0 0 * * *
@weekly0 0 * * 0
@monthly0 0 1 * *
@yearly / @annually0 0 1 1 *
@rebootیه بار موقع شروع کرون

اشتباه‌های رایج

یادتون رفته دقیقه رو مشخص کنید

* 3 * * * یعنی هر دقیقه در طول ساعت ۳. برای «یه بار ساعت ۰۳:۰۰» بنویسید 0 3 * * *.

محدود کردن هر دو فیلد روز

اگه هم روز ماه و هم روز هفته تعیین شده باشن، کار وقتی اجرا می‌شه که یکی جور باشه. 0 9 13 * 5 هر سیزدهم ماه *و* هر جمعه اجرا می‌شه؛ نه فقط جمعه‌ی سیزدهم. اگه هر دو رو لازم دارید، یکی رو محدود کنید و اون یکی رو داخل اسکریپت چک کنید.

تاریخ‌های غیرممکن

0 0 31 2 * هیچ‌وقت اجرا نمی‌شه؛ فوریه ۳۱ روز نداره. «روز آخر ماه» در کرون استاندارد قابل بیان نیست؛ روزهای ۲۸ تا ۳۱ اجرا کنید و بذارید اسکریپت چک کنه فردا روز اوله یا نه:

0 23 28-31 * * [ "$(date -d tomorrow +\%d)" = "01" ] && /opt/app/month-end.sh

منطقه‌ی زمانی و ساعت تابستانی

کرون از ساعت محلی سرور پیروی می‌کنه. روی سرورهایی که ساعت تابستانی دارن، کاری که در ساعت حذف‌شده زمان‌بندی شده ممکنه اجرا نشه و کاری که در ساعت تکراری هست ممکنه دو بار اجرا بشه. تنظیم سرورها روی UTC هر دو مشکل رو حل می‌کنه؛ بعضی نسخه‌های کرون متغیر CRON_TZ رو هم پشتیبانی می‌کنن.

گویش‌های مختلف

Quartz (جاوا)، Spring و بعضی زمان‌بندهای ابری از شش یا هفت فیلد استفاده می‌کنن که ثانیه اولشونه و گاهی ? به معنی «مقدار خاصی نه» دارن. عبارتی که بین سیستم‌ها کپی بشه ممکنه بی‌صدا معنی دیگه‌ای پیدا کنه.

تست یه عبارت

  1. فیلد به فیلد بلند بخونیدش: «دقیقه صفر، ساعت ۳، هر روز، هر ماه، هر روز هفته».
  2. قبل از دیپلوی، چند زمان اجرای بعدی رو با یه ابزار ساخت عبارت ببینید.
  3. اولین اجرای واقعی رو توی لاگ کرون دنبال کنید.
  4. یه مانیتور Heartbeat اضافه کنید تا زمان‌بندی‌ای که هیچ‌وقت اجرا نمی‌شه، به‌جای دیده نشدن هشدار بده.

پرسش‌های پرتکرار

  • کوچک‌ترین واحد کرون استاندارد یه دقیقه است. دو خط بذارید که یکی‌شون قبل از دستور sleep 30 داره، یا از systemd timer استفاده کنید که ثانیه رو پشتیبانی می‌کنه.

  • نه. اگه سرور در زمان مقرر خاموش بوده، اون اجرا رد می‌شه. anacron و systemd timerها با Persistent=true می‌تونن کارهای جاافتاده رو بعد از روشن شدن اجرا کنن.

  • یکشنبه. هم صفر و هم هفت یعنی یکشنبه و یک یعنی دوشنبه.

اشتراک‌گذاری مقاله:ایکستلگراملینکدینفیسبوکردیت
noc724

نویسنده

تیم noc724

تیم فنی مانیتورینگ آپتایم

ما noc724 رو می‌سازیم و اداره می‌کنیم؛ سرویس مانیتورینگ آپتایمی که سایت، سرور و API رو از چند شهر ایران چک می‌کنه. این راهنماها از مشکل‌هایی میان که خودمون و کاربرهامون موقع آنلاین نگه داشتن سرویس‌ها باهاشون روبه‌رو می‌شیم.

تماس با تیم

تخصص:مانیتورینگ کرون

سؤالی دارید؟تماس با پشتیبانی
پیشنهادی دارید؟بفرستید

تازه‌ترین مقاله‌ها