يا هلا والله بالجميع! اليوم بتكلم عن شيء بيخلي حياتك أسهل كمبرمج أو حتى كمستخدم عادي يحتاج يشغل سكريبتات بشكل دوري. الموضوع هو الجدولة الزمنية، أو زي ما نسميها في عالم لينكس: CRON Jobs.
وش هي CRON Jobs؟
ببساطة، الـ CRON هو زي المنبه الذكي حق السيرفر. تقول له: "يا كرون، كل يوم الساعة 3 الفجر، شغل لي السكريبت الفلاني"، وهو يسويها لك وأنت نايم أو مشغول بأشياء أهم. يعني يخليك تأتمت الشغل وتنساه.
ملاحظة: CRON موجودة بشكل أساسي في أنظمة التشغيل الشبيهة بيونكس (مثل لينكس وماك). إذا كنت على ويندوز، فيه حلول مشابهة اسمها "Task Scheduler".
ليه أحتاج CRON؟
- النسخ الاحتياطي (Backups): خلي السيرفر يسوي نسخة احتياطية لقواعد البيانات أو الملفات كل ليلة.
- تحديث البيانات: تسحب بيانات من API خارجي كل ساعة؟ كرون يسويها.
- تنظيف الملفات المؤقتة: السيرفر يمتلي ملفات مؤقتة؟ سكريبت ينظفها بشكل دوري.
- إرسال التقارير: توليد تقرير يومي أو أسبوعي وإرساله بالإيميل.
فهم صيغة CRON (Cron Syntax)
هذا هو الجزء الأساسي. كل أمر كرون يتكون من 5 نجوم (أو حقول) تحدد متى يتنفذ الأمر، وبعدها يجي الأمر نفسه. الشكل العام كذا:
* * * * * command-to-execute
خلنا نفصلها:
- الدقيقة (Minute): من 0 إلى 59.
- الساعة (Hour): من 0 إلى 23 (صيغة 24 ساعة).
- يوم من الشهر (Day of Month): من 1 إلى 31.
- الشهر (Month): من 1 إلى 12 (أو أسماء الشهور المختصرة مثل
jan,feb). - يوم من الأسبوع (Day of Week): من 0 إلى 7 (0 و 7 كلاهما يمثل الأحد، 1 يمثل الاثنين). أو أسماء الأيام المختصرة مثل
sun,mon).
أمثلة على الصيغة:
0 3 * * * /path/to/script.sh
هذا بيشغل السكريبت الساعة 3:00 الفجر كل يوم.30 14 * * 1 /usr/bin/python3 /app/report_generator.py
هذا بيشغل سكريبت بايثون الساعة 2:30 الظهر (14:30) كل يوم اثنين.*/15 * * * * /usr/bin/php /var/www/html/artisan schedule:run
هذا بيشغل أمر كل 15 دقيقة (الدقيقة 0، 15، 30، 45 من كل ساعة). علامة/تعني "كل".0 0 1 * * /home/user/monthly_backup.sh
هذا بيشغل سكريبت النسخ الاحتياطي الشهري في أول يوم من كل شهر، الساعة 12:00 منتصف الليل.0 0 1,15 * * /home/user/bi_monthly_task.sh
هذا بيشغل سكريبت في اليوم الأول والخامس عشر من كل شهر، الساعة 12:00 منتصف الليل. علامة,تعني "و".0 0 * * 1-5 /home/user/weekday_task.sh
هذا بيشغل سكريبت كل يوم من الاثنين إلى الجمعة (أيام العمل)، الساعة 12:00 منتصف الليل. علامة-تعني "من إلى".
كيف تضيف CRON Job؟
الطريقة الأكثر شيوعاً هي استخدام الأمر crontab -e في الطرفية (Terminal).
- افتح الطرفية واكتب:
crontab -e - لأول مرة، قد يطلب منك اختيار محرر نصوص (مثل
nanoأوvim). اختر اللي تفضله. - بيفتح لك ملف يشبه ملفات التحرير العادية. انزل لآخر الملف وأضف سطر الكرون الجديد.
- احفظ الملف واطلع منه. (في
nanoتضغطCtrl+Oللحفظ، ثمCtrl+Xللخروج. فيvimتضغطEscثم:wqثمEnter).
بعد ما تحفظ، الكرون راح يبدأ يشتغل تلقائياً في الوقت اللي حددته.
نصائح ذهبية عشان ما تتوهق:
- المسارات الكاملة (Full Paths): دائماً استخدم المسار الكامل للسكريبت أو الأمر اللي بتشغله. يعني بدل
script.sh، اكتب/home/user/scripts/script.sh. ونفس الشيء للأوامر، بدلpythonاكتب/usr/bin/python3. السبب أن بيئة الكرون ما تعرف المسارات زي بيئتك العادية. - تحويل المخرجات (Redirect Output): السكريبتات ممكن تنتج مخرجات (output) أو أخطاء (errors). الكرون بيرسل لك إيميل بكل هذا إذا ما وجهته لمكان ثاني. عشان تتجنب إيميلات الكرون المزعجة، وجه المخرجات لـ
/dev/nullكذا:* * * * * /path/to/script.sh > /dev/null 2>&1هذا يعني: وجه المخرجات العادية (
stdout) لـ/dev/null(مكان يرمي فيه أي شيء)، ووجه مخرجات الأخطاء (stderr) لنفس مكان مخرجات الـstdout. يعني "اصمت يا كرون!". - بيئة الكرون (Cron Environment): بيئة الكرون بسيطة جداً. إذا سكريبتك يحتاج متغيرات بيئة معينة (مثل
PATHأو أي متغير آخر)، لازم تعرفها داخل ملف الكرون نفسه أو داخل السكريبت. - التصاريح (Permissions): تأكد أن السكريبت اللي بتشغله عنده تصريح التنفيذ (
executable permission). تقدر تعطيه التصريح بالأمر:chmod +x /path/to/script.sh. - سجل الكرون (Cron Logs): إذا ما اشتغل الكرون، تأكد من سجلات النظام. في أنظمة لينكس، ممكن تلقاها في
/var/log/syslogأو/var/log/cron(يعتمد على التوزيعة). ابحث عن كلمةCRON.
اختصارات مفيدة لـ CRON (Special Strings)
فيه اختصارات تسهل عليك الشغل بدل ما تكتب النجوم:
@reboot: يشغل الأمر مرة واحدة عند إعادة تشغيل السيرفر.@yearlyأو@annually: يشغل الأمر مرة في السنة (في 1 يناير الساعة 00:00).@monthly: يشغل الأمر مرة في الشهر (في اليوم الأول من الشهر، الساعة 00:00).@weekly: يشغل الأمر مرة في الأسبوع (الأحد، الساعة 00:00).@dailyأو@midnight: يشغل الأمر مرة في اليوم (الساعة 00:00).@hourly: يشغل الأمر مرة في الساعة (في بداية كل ساعة).
@daily /home/user/daily_cleanup.sh
مثال عملي: سكريبت لتنظيف الملفات القديمة
لنفترض عندك سكريبت بايثون اسمه cleanup.py في المسار /home/user/scripts/cleanup.py، وظيفته يحذف الملفات اللي عمرها أكثر من 30 يوم من مجلد معين. وتبغاه يشتغل كل يوم الساعة 4:30 الفجر.
محتوى السكريبت (كمثال):
import os
import time
TARGET_DIR = "/var/www/html/uploads"
DAYS_TO_KEEP = 30
NOW = time.time()
for f in os.listdir(TARGET_DIR):
f_path = os.path.join(TARGET_DIR, f)
if os.path.isfile(f_path):
# Check if file is older than DAYS_TO_KEEP
if os.stat(f_path).st_mtime < NOW - (DAYS_TO_KEEP * 86400):
print(f"Deleting {f_path}")
os.remove(f_path)
كيف تضيفه للكرون؟
- تأكد أن السكريبت عنده تصريح تنفيذ:
chmod +x /home/user/scripts/cleanup.py - افتح الكرون:
crontab -e - أضف السطر التالي:
30 4 * * * /usr/bin/python3 /home/user/scripts/cleanup.py > /dev/null 2>&1 - احفظ واطلع.
كذا السكريبت بيشتغل كل يوم الساعة 4:30 الفجر وينظف لك المجلد بدون ما تحرك ساكن.
وبكذا نكون غطينا أساسيات CRON Jobs. الموضوع بسيط ومفيد جداً. استخدموه صح وبيوفر عليكم وقت وجهد كبير. بالتوفيق!