آموزش crontab و نمونه‌های آماده زمان‌بندی

cron کارهای تکراری سرور را خودکار می‌کند: بکاپ، پاک‌سازی، به‌روزرسانی داده و ... . قالب آن ساده ولی پر از تله‌های کوچک است؛ این راهنما هم نمونه‌ها و هم دلایل رایج اجرا نشدن را دارد.

DevOpsمقدماتی7 دقیقه

۱ساختار یک خط cron

پنج فیلد زمان به‌علاوهٔ دستور:

text
# ┌───────── دقیقه (0-59)
# │ ┌─────── ساعت (0-23)
# │ │ ┌───── روز ماه (1-31)
# │ │ │ ┌─── ماه (1-12)
# │ │ │ │ ┌─ روز هفته (0-7، صفر و هفت = یکشنبه)
# │ │ │ │ │
# * * * * *  command

۲ویرایش و مشاهده

هر کاربر crontab خودش را دارد. برای کارهایی که نیاز به root دارند از sudo crontab -e استفاده کنید.

bash
crontab -e     # ویرایش
crontab -l     # نمایش
sudo crontab -l -u www-data
crontab -r     # حذف همهٔ کارها (خطرناک)

crontab -r همهٔ کارها را بدون تأیید پاک می‌کند و فاصلهٔ آن با -e فقط یک حرف است.

۳نمونه‌های پرکاربرد

این‌ها را به‌عنوان الگو استفاده کنید.

text
* * * * *        /opt/scripts/check.sh              # هر دقیقه
*/5 * * * *      /opt/scripts/sync.sh               # هر ۵ دقیقه
0 * * * *        /opt/scripts/hourly.sh             # هر ساعت
30 3 * * *       /opt/scripts/backup.sh             # هر شب ۳:۳۰
0 4 * * 0        /opt/scripts/weekly.sh             # یکشنبه‌ها ۴ صبح
0 2 1 * *        /opt/scripts/monthly.sh            # اول هر ماه ۲ بامداد
0 9-17 * * 1-5   /opt/scripts/work-hours.sh         # ساعات کاری هفته (دوشنبه تا جمعه)
@reboot          /opt/scripts/on-boot.sh            # هنگام بوت
@daily           /opt/scripts/daily.sh              # هر روز نیمه‌شب

۴ذخیره خروجی و خطا

بدون تغییر مسیر خروجی، cron نتیجه را ایمیل می‌کند یا دور می‌ریزد. خروجی و خطا را در فایل لاگ بریزید.

bash
30 3 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1
30 3 * * * /opt/scripts/quiet.sh > /dev/null 2>&1

۵اشتباه رایج ۱: مسیر و محیط

cron محیط ساده و PATH کوتاه دارد. همیشه مسیر کامل دستورها را بدهید یا PATH را در بالای crontab تنظیم کنید.

bash
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAILTO=admin@example.com

0 3 * * * /usr/bin/docker exec db mysqldump ... > /backup/db.sql

۶اشتباه رایج ۲: علامت درصد

در crontab علامت % به معنی خط جدید است. باید با بک‌اسلش escape شود.

bash
# اشتباه: نام فایل از % به بعد بریده می‌شود
0 3 * * * mysqldump db > /backup/db_$(date +%F).sql

# درست
0 3 * * * mysqldump db > /backup/db_$(date +\%F).sql

۷بررسی اینکه cron اجرا شد

لاگ cron در syslog یا journal است.

bash
grep CRON /var/log/syslog | tail
sudo journalctl -u cron --since today | tail
systemctl status cron

۸چرا کار من اجرا نمی‌شود؟ چک‌لیست

اسکریپت اجرایی است (chmod +x)؟ مسیر کامل استفاده شده؟ خط انتهای فایل crontab خط جدید دارد؟ نام فایل در /etc/cron.d بدون نقطه است؟ از % بدون escape استفاده نشده؟ دستور را ابتدا با env -i و همان محیط کم اجرا کنید.

bash
env -i /bin/bash -c '/opt/scripts/backup.sh'   # شبیه‌سازی محیط cron

پرسش‌های پرتکرار دربارهٔ آموزش crontab و نمونه‌های آماده زمان‌بندی

چطور cron را هر ۳۰ ثانیه اجرا کنم؟

cron حداقل واحد یک دقیقه دارد. برای ۳۰ ثانیه دو خط بگذارید که یکی با sleep 30 شروع شود، یا از systemd timer با OnUnitActiveSec=30s استفاده کنید.

تفاوت crontab کاربر و /etc/cron.d چیست؟

فایل‌های /etc/cron.d فیلد اضافه‌ای برای نام کاربر دارند (بعد از پنج فیلد زمان) و برای بستهٔ نرم‌افزاری مناسب‌اند. crontab -e برای هر کاربر به‌صورت جدا است.