پیامک، تلگرام یا بله؟ انتخاب کانال هشدار بدون خستگی از هشدار
کدوم هشدارهای قطعی با پیامک برن و کدوم با تلگرام یا بله، چطور بر اساس فوریت مسیریابی کنیم و چطور هشدارهای مهم زیر هشدارهای بیمورد گم نشن.
کاری که توی ترمینال بینقص اجرا میشه، ممکنه همون لحظهای که کرون اجراش میکنه شکست بخوره. بیشتر این خرابیها موقع ویرایش crontab به وجود میان: یه اشتباه تایپی توی فیلدهای زمان، یه مسیر نسبی، متغیری که فقط توی شل خودتون وجود داره، یا اصلاً ویرایش crontab یه کاربر دیگه.
این راهنما نشون میده crontab رو چطور امن ویرایش کنید، چرا کارها بعد از ویرایش از کار میافتن، و چطور مطمئن بشید تغییرتون واقعاً کار میکنه، نه اینکه فقط امیدوار باشید.
crontab -e ویرایش کنید؛ این دستور فایل رو قبل از نصب بررسی میکنه.crontab -l از جدول فعلی بکاپ بگیرید.PATH و SHELL رو خودتون تنظیم کنید.noc724 سایت، سرور و APIهای شما رو شبانهروز چک میکنه و همون لحظهای که چیزی خراب شد با پیامک، تلگرام یا بله خبرتون میکنه.
crontab (جدول کرون) فهرستی از دستورهای زمانبندیشدهی هر کاربره. هر خط یه زمانبندی رو به یه دستور وصل میکنه و سرویس کرون جدولهای نصبشده رو میخونه و دستورها رو سر وقت اجرا میکنه.
دو راه برای تغییرش هست:
crontab -e یه نسخهی موقت از جدول رو توی ادیتور باز میکنه. وقتی ذخیره کنید و بیرون بیاید، ابزار crontab سینتکس رو چک میکنه و نسخهی جدید رو نصب میکنه./var/spool/cron/) این بررسی رو دور میزنه، ممکنه مالکیت یا دسترسی فایل رو خراب کنه و سادهترین راه برای اینه که کرون بیصدا جدول رو نادیده بگیره.برای crontab کاربرها از crontab -e استفاده کنید. کارهای سراسری سیستم جاشون توی /etc/crontab یا /etc/cron.d/ هست که با دسترسی root و یه ادیتور معمولی ویرایش میشن؛ حواستون باشه این فایلها توی هر خط یه فیلد اضافه برای کاربر دارن.
یه فرق مهم هم بین ویرایش و *جایگزین کردن* هست: crontab jobs.txt کل جدول رو با محتوای یه فایل عوض میکنه. برای اتوماسیون عالیه، ولی اگه دستی و توی حساب اشتباه تایپ بشه خطرناکه.
crontab -e ادیتور اختصاصی نداره. اول متغیر VISUAL، بعد EDITOR رو نگاه میکنه و اگه هیچکدوم نبود سراغ پیشفرض سیستم میره (معمولاً vi، گاهی nano). ببینید الان چی تنظیم شده:
echo "VISUAL=$VISUAL EDITOR=$EDITOR"EDITOR=nano crontab -eمتغیر رو به فایل شروع شلتون اضافه کنید (~/.bashrc برای Bash و ~/.zshrc برای Zsh) و یه شل جدید باز کنید:
echo 'export EDITOR=nano' >> ~/.bashrcروی سیستمهای مبتنی بر دبیان، دستور select-editor انتخابتون رو توی ~/.selected_editor ذخیره میکنه و crontab -e از اون به بعد ازش استفاده میکنه.
ایمیجهای سبک معمولاً nano یا حتی vi ندارن. یا یکی نصب کنید، یا فایل رو جای دیگه بسازید و با crontab file نصبش کنید؛ فقط قبلش از جدول قبلی یه نسخه نگه دارید.
هر خط کار، پنج فیلد زمان داره و بعدش دستور میاد:
# ┌ دقیقه (0-59)
# │ ┌ ساعت (0-23)
# │ │ ┌ روز ماه (1-31)
# │ │ │ ┌ ماه (1-12)
# │ │ │ │ ┌ روز هفته (0-7، صفر و هفت یعنی یکشنبه)
# │ │ │ │ │
30 2 * * * /usr/local/bin/backup.sh| عملگر | معنی | مثال |
|---|---|---|
* | همهی مقدارها | * * * * * - هر دقیقه |
, | فهرست | 0 9,17 * * * - ساعت ۹ و ۱۷ |
- | بازه | 0 9-17 * * 1-5 - هر ساعت، ساعت کاری، روزهای کاری |
/ | گام | */15 * * * * - هر ۱۵ دقیقه |
وقتی هر دو فیلد روز محدود شده باشن، کرون کار رو وقتی اجرا میکنه که یکی از اونها برقرار باشه، نه هر دو. 0 0 1 * 1 هم روز اول هر ماه اجرا میشه *و* هم هر دوشنبه.
بیشتر نسخههای کرون میانبرهایی مثل @reboot، @hourly، @daily، @weekly و @monthly رو قبول میکنن. خوندنشون راحتتره، ولی قبل از استفاده مطمئن بشید کرون شما پشتیبانیشون میکنه.
اگه حوصلهی شمردن فیلدها رو ندارید، عبارت رو با ابزار ساخت عبارت Cron بسازید و نتیجه رو کپی کنید.
crontab -l > ~/crontab-backup-$(date +%F).txtاگه چیزی خراب شد، crontab ~/crontab-backup-2026-10-18.txt نسخهی قبلی رو برمیگردونه.
دقیقاً همونطور اجراش کنید که کرون اجرا میکنه: با مسیر کامل، از یه پوشهی بیطرف و ترجیحاً با محیط خالی.
cd / && env -i HOME="$HOME" SHELL=/bin/sh PATH=/usr/bin:/bin /usr/local/bin/backup.shاگه اینجا شکست بخوره، زیر کرون هم شکست میخوره.
بعد از ذخیره، crontab پیام installing new crontab رو نشون میده. اگه خطا گزارش کرد، پیشنهاد میده دوباره ادیتور رو باز کنه؛ قبول کنید و بهجای دور ریختن تغییرات، همون خط رو درست کنید. بعد جدول رو لیست کنید تا ببینید واقعاً چی نصب شده:
crontab -lیه اجرای نزدیک (مثلاً دو دقیقه بعد) زمانبندی کنید، توی لاگ ببینید اجرا شده، بعد زمانبندی واقعی رو بذارید.
یکی از فیلدهای زمان مقدار غیرممکن داره (دقیقهی 60، ماه 13)، یه فیلد جا افتاده یا یه کاراکتر اضافه وارد شده. پیام خطا شمارهی خط رو میگه؛ وقتی crontab پیشنهاد ویرایش دوباره داد، درستش کنید.
خیلی از نسخههای کرون خط آخری رو که با «خط جدید» تموم نشه نادیده میگیرن. آخر فایل یه خط خالی بذارید.
توی crontab، % بدون escape دستور رو تموم میکنه و بقیهاش رو ورودی استاندارد حساب میکنه. date +%F داخل یه کار باید به شکل date +\%F نوشته بشه.
sudo crontab -e جدول root رو ویرایش میکنه، نه جدول شما رو. اونوقت کارهایی که به فایلها، کلیدها یا دسترسیهای شما نیاز دارن با کاربر اشتباه اجرا میشن. وقتی واقعاً منظورتون حساب دیگهایه از crontab -u name -e استفاده کنید و با crontab -u name -l چک کنید.
اگه فایل /etc/cron.allow وجود داشته باشه، فقط کاربرهای داخلش میتونن crontab داشته باشن؛ وگرنه هر کسی که توی /etc/cron.deny نباشه اجازه داره. پیام «you are not allowed» یعنی کاربر توی یکی از این فهرستها نیست.
کرون فایل .bashrc یا .profile شما رو نمیخونه. PATH معمولاً فقط /usr/bin:/bin هست، SHELL برابر /bin/sh هست و متغیرهایی که توی ترمینال export کردید اونجا وجود ندارن. دستورهایی که توی /usr/local/bin، یه virtualenv یا یه version manager هستن، «پیدا نمیشن».
کارها از پوشهی خونهی کاربر شروع میشن. ./run.sh یا python script.py توی ترمینال کار میکنه چون اتفاقاً توی پوشهی درست هستید؛ زیر کرون نه. هم برای برنامه و هم برای هر فایلی که باهاش کار میکنه مسیر کامل بنویسید.
آرایهها، [[ ]]، source و بقیهی امکانات Bash زیر /bin/sh شکست میخورن. بالای crontab بنویسید SHELL=/bin/bash، یا کار رو با /bin/bash /path/script.sh شروع کنید.
بدون redirect، کرون سعی میکنه خروجی رو برای کاربر ایمیل کنه؛ روی بیشتر سرورها ایمیلی تنظیم نشده، پس خطاها گم میشن. هر دو جریان خروجی رو به فایل بفرستید:
*/10 * * * * /opt/app/sync.sh >> /var/log/app-sync.log 2>&1خطهای متغیر بالای کارهایی میان که بهشون نیاز دارن و روی همهی خطهای پایینی اثر میذارن:
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAILTO=""
APP_ENV=production
0 3 * * * /opt/app/bin/nightly-report >> /var/log/nightly-report.log 2>&1کرون متغیرها رو توی این مقداردهیها باز نمیکنه؛ PATH=$PATH:/opt/bin دقیقاً همین متن رو ذخیره میکنه. مقدار کامل رو بنویسید. وقتی یه کار به بیشتر از دو سه متغیر نیاز داشت، تنظیماتش رو ببرید توی یه اسکریپت wrapper و خط crontab رو کوتاه نگه دارید.
ابزارهای پیکربندی و اسکریپتهای دیپلوی هیچوقت نباید ادیتور باز کنن. دو الگوی امن:
crontab /srv/deploy/app.crontabفایل توی مخزن کد، تنها مرجع درست میشه و هر تغییر مثل کد بازبینی میشه.
( crontab -l 2>/dev/null | grep -v 'nightly-report' ; echo '0 3 * * * /opt/app/bin/nightly-report' ) | crontab -grep -v اول نسخهی قدیمی همون کار رو حذف میکنه، پس اگه اسکریپت دو بار اجرا بشه کار تکراری ساخته نمیشه.
کاری که گاهی طولانیتر از فاصلهی اجراش طول میکشه، ممکنه همزمان دو بار اجرا بشه. flock فقط اجازهی اجرای یه نسخه رو میده:
*/5 * * * * flock -n /tmp/sync.lock /opt/app/sync.sh >> /var/log/app-sync.log 2>&1نصب شدن crontab فقط ثابت میکنه زمانبندی پذیرفته شده. چیزی دربارهی اینکه کار شروع شد، تموم شد یا کارش رو درست انجام داد نمیگه. لاگها بعد از اتفاق کمک میکنن، ولی هیچکس ساعت ۳ صبح لاگ نمیخونه.
مانیتورینگ Heartbeat این شکاف رو پر میکنه: کار بعد از تموم شدن یه آدرس اختصاصی رو صدا میزنه و اگه این تماس سر وقت نرسه، هشدار میگیرید.
0 3 * * * /opt/app/backup.sh && curl -fsS -m 10 https://YOUR-HEARTBEAT-URL > /dev/null&& یعنی پینگ فقط وقتی فرستاده میشه که بکاپ موفق بوده؛ پس هم اجرای ناموفق و هم اجرایی که اصلاً شروع نشده هشدار میده. مانیتورینگ کرون جاب در noc724 همینطور کار میکنه و هشدار رو با پیامک، تلگرام یا بله میفرسته.
ویرایش امن crontab خلاصه میشه به یه روال کوتاه: بکاپ بگیرید، دستور رو همونطور که کرون اجرا میکنه امتحان کنید، با crontab -e ویرایش کنید، چیزی رو که نصب شده بخونید و اجرای اول رو ببینید. بیشتر مشکلهای «قبل از ویرایش کار میکرد» مشکل محیط اجرا هستن (مسیرها، شل و متغیرها)، نه خود کرون. و چون کرون هیچوقت خبر نمیده که یه کار بیصدا متوقف شده، برای هر کار مهم یه چک Heartbeat بذارید.
دستور crontab -e رو اجرا کنید. جدول کاربر شما رو توی ادیتوری که VISUAL یا EDITOR تعیین کرده باز میکنه و بعد از ذخیره نصبش میکنه.
crontab -l جدول شما رو نشون میده و sudo crontab -u name -l جدول یه کاربر دیگه رو. کارهای سیستمی توی /etc/crontab و /etc/cron.d/ هستن.
نه. crontab -e خودش به سرویس خبر میده و جدول جدید ظرف یه دقیقه خونده میشه. فایلهای /etc/cron.d/ هم روی بیشتر سیستمها خودکار دوباره خونده میشن.
crontab -r بدون هیچ سؤالی کل جدول رو پاک میکنه. اول با crontab -l بکاپ بگیرید؛ و حواستون باشه -r روی کیبورد چقدر به -e نزدیکه.
معمولاً به خاطر محیط اجرا: PATH کوتاه، /bin/sh بهجای Bash، متغیرهای جاافتاده یا مسیرهای نسبی. مسیر کامل بنویسید و متغیرها رو توی crontab یا یه اسکریپت wrapper تنظیم کنید.
نویسنده
تیم noc724
تیم فنی مانیتورینگ آپتایم
ما noc724 رو میسازیم و اداره میکنیم؛ سرویس مانیتورینگ آپتایمی که سایت، سرور و API رو از چند شهر ایران چک میکنه. این راهنماها از مشکلهایی میان که خودمون و کاربرهامون موقع آنلاین نگه داشتن سرویسها باهاشون روبهرو میشیم.
تماس با تیمتخصص:مانیتورینگ کرون
کدوم هشدارهای قطعی با پیامک برن و کدوم با تلگرام یا بله، چطور بر اساس فوریت مسیریابی کنیم و چطور هشدارهای مهم زیر هشدارهای بیمورد گم نشن.
چرا مانیتورهای آپتایم هشدار اشتباه میدن (اختلال شبکه، timeout، محدودیت نرخ، تغییر محتوا) و تنظیماتی که اینها رو حذف میکنه و هشدار واقعی رو سریع نگه میداره.
چطور یه چرخهی آنکال ساده و سیاست ارجاع هشدار بچینیم که هر هشدار حیاتی جواب داده بشه، بدون اینکه یه تیم کوچیک فرسوده بشه.