آموزش زمانبندی خودکار کارها با Cron روی سرور مجازی
خیلی از کارهای سرور تکراری هستند: هر شب بکاپ بگیر، هر ساعت یک اسکریپت اجرا کن، هر هفته لاگهای قدیمی را پاک کن. ابزار استاندارد لینوکس برای این کار «cron» است.
ساختار زمانبندی cron
هر خط cron از پنج بخش زمانی و سپس دستور تشکیل شده است:
* * * * * دستور
| | | | |
| | | | +--- روز هفته (0-7، صفر و هفت = یکشنبه)
| | | +--------- ماه (1-12)
| | +--------------- روز ماه (1-31)
| +--------------------- ساعت (0-23)
+--------------------------- دقیقه (0-59)
مثالهای کاربردی
0 3 * * * # هر شب ساعت ۳ بامداد
*/10 * * * * # هر ۱۰ دقیقه یکبار
0 * * * * # ابتدای هر ساعت
30 2 * * 0 # هر یکشنبه ساعت ۲:۳۰
0 0 1 * * # اول هر ماه
0 9-17 * * 1-5 # هر ساعت از ۹ تا ۱۷، شنبه تا چهارشنبه میلادی
علامت */ یعنی «هر چند واحد یکبار» و خط تیره یعنی بازه.
افزودن یک کار زمانبندیشده
crontab -e
بار اول از شما میپرسد کدام ویرایشگر را میخواهید؛ nano سادهترین است. سپس در انتهای فایل خط خود را اضافه کنید:
0 3 * * * /usr/bin/bash /root/backup.sh >> /var/log/backup.log 2>&1
ذخیره کنید (Ctrl+O سپس Ctrl+X). برای دیدن لیست کارها:
crontab -l
چهار قانون طلایی cron
۱. همیشه مسیر کامل بنویسید
cron محیط کاربری شما را ندارد و متغیر PATH آن محدود است. پس بهجای python3 بنویسید /usr/bin/python3. برای پیدا کردن مسیر:
which python3
which php
۲. خروجی را در لاگ ذخیره کنید
بدون لاگ نمیفهمید چرا کار انجام نشده. عبارت >> file.log 2>&1 هم خروجی عادی و هم خطاها را ذخیره میکند.
۳. اسکریپت را دستی تست کنید
قبل از گذاشتن در cron، دقیقاً همان خط را در ترمینال اجرا کنید و مطمئن شوید کار میکند.
۴. مراقب ساعت سرور باشید
cron با ساعت سیستم کار میکند. ساعت را بررسی و در صورت نیاز تنظیم کنید:
date
timedatectl set-timezone Asia/Tehran
نمونههای واقعی
بکاپ شبانه دیتابیس
فایل /root/backup.sh:
#!/bin/bash
DATE=$(date +%Y-%m-%d)
mysqldump -u root -pPASSWORD mydb | gzip > /root/backups/db-$DATE.sql.gz
# حذف بکاپهای قدیمیتر از ۷ روز
find /root/backups -name "db-*.sql.gz" -mtime +7 -delete
chmod +x /root/backup.sh
و در crontab:
0 3 * * * /bin/bash /root/backup.sh >> /var/log/backup.log 2>&1
ریاستارت هفتگی یک سرویس
0 4 * * 0 /usr/bin/systemctl restart myapp
پاکسازی فایلهای موقت
0 5 * * * /usr/bin/find /tmp -type f -mtime +3 -delete
تمدید خودکار گواهی SSL
0 2 * * * /usr/bin/certbot renew --quiet
روش سادهتر: پوشههای آماده
اگر زمان دقیق مهم نیست، کافی است اسکریپت را در یکی از این پوشهها بگذارید و اجرایی کنید:
/etc/cron.hourly/
/etc/cron.daily/
/etc/cron.weekly/
/etc/cron.monthly/
عیبیابی: چرا cron اجرا نشد؟
- سرویس فعال است؟
systemctl status cron - لاگ سیستم را ببینید:
grep CRON /var/log/syslog | tail -20 - مسیرها کامل هستند؟ رایجترین اشتباه همین است.
- فایل اجرایی است؟
chmod +x script.sh - در خط آخر crontab یک خط خالی وجود دارد؟ نبودش گاهی باعث نادیده گرفته شدن آخرین خط میشود.
- اگر از
%استفاده میکنید (مثلاً در date)، باید با بکاسلش فرار داده شود:\%
جایگزین مدرن: systemd timer
برای کارهای حساستر، systemd timer امکانات بیشتری دارد؛ مثلاً اگر سرور در زمان اجرا خاموش بوده، با Persistent=true بعد از روشن شدن کار را جبران میکند. برای اکثر کاربردها cron کافی است.
جمعبندی
cron ساده اما قدرتمند است. مهمترین نکتهها: مسیر کامل، ذخیره لاگ و تست دستی قبل از زمانبندی. با همین ابزار میتوانید بکاپگیری خودکار راه بیندازید — موضوعی که در مقاله راهنمای بکاپگیری از سرور مجازی کاملتر توضیح داده شده است.
اگر هنوز سرور ندارید، میتوانید از صفحه پلنهای سرور مجازی ایران یک سرور با تحویل آنی تهیه کنید؛ سرور بلافاصله پس از پرداخت و در کمتر از یک دقیقه تحویل داده میشود.
سرور مجازی ایران با تحویل آنی میخواهید؟
تحویل خودکار در کمتر از یک دقیقه، دیتاسنتر داخل ایران، دسترسی کامل root و پشتیبانی 24 ساعته.
مشاهده پلنها و قیمتها