آموزش crontab و نمونههای آماده زمانبندی
cron کارهای تکراری سرور را خودکار میکند: بکاپ، پاکسازی، بهروزرسانی داده و ... . قالب آن ساده ولی پر از تلههای کوچک است؛ این راهنما هم نمونهها و هم دلایل رایج اجرا نشدن را دارد.
۱ساختار یک خط cron
پنج فیلد زمان بهعلاوهٔ دستور:
# ┌───────── دقیقه (0-59)
# │ ┌─────── ساعت (0-23)
# │ │ ┌───── روز ماه (1-31)
# │ │ │ ┌─── ماه (1-12)
# │ │ │ │ ┌─ روز هفته (0-7، صفر و هفت = یکشنبه)
# │ │ │ │ │
# * * * * * command۲ویرایش و مشاهده
هر کاربر crontab خودش را دارد. برای کارهایی که نیاز به root دارند از sudo crontab -e استفاده کنید.
crontab -e # ویرایش
crontab -l # نمایش
sudo crontab -l -u www-data
crontab -r # حذف همهٔ کارها (خطرناک)crontab -r همهٔ کارها را بدون تأیید پاک میکند و فاصلهٔ آن با -e فقط یک حرف است.
۳نمونههای پرکاربرد
اینها را بهعنوان الگو استفاده کنید.
* * * * * /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 نتیجه را ایمیل میکند یا دور میریزد. خروجی و خطا را در فایل لاگ بریزید.
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 تنظیم کنید.
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 شود.
# اشتباه: نام فایل از % به بعد بریده میشود
0 3 * * * mysqldump db > /backup/db_$(date +%F).sql
# درست
0 3 * * * mysqldump db > /backup/db_$(date +\%F).sql۷بررسی اینکه cron اجرا شد
لاگ cron در syslog یا journal است.
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 و همان محیط کم اجرا کنید.
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 برای هر کاربر بهصورت جدا است.