المقدمة
إذا كنت قد قمت يومًا بإعداد cron job
على خادم VPS بنظام أوبونتو، قد تكون واجهت مشكلات جعلتك تحتار. من المشكلات الشائعة هي عندما يحاول cron job
تنفيذ سكريبت دون جدوى، مما يؤدي إلى ملفات ناتجة بحجم صفر أو عمليات غير مكتملة. في هذه المقالة، نستكشف سيناريو حقيقي حيث يفشل سكريبت Ruby في نسخ قاعدة بيانات MySQL احتياطيًا عبر cron job
، مما يترك المستخدمين في حيرة من أمرهم حول سبب عمل أمرهم بشكل جيد في سطر الأوامر لكن ليس عند الجدولة.
فهم المشكلة
في الحالة التي تم مناقشتها، تم إعداد cron job
لتنفيذ سكريبت Ruby الذي يقوم بالمهام التالية:
- نسخ احتياطي لقاعدة بيانات MySQL: يستخدم
mysqldump
لعمل نسخ احتياطي للقاعدة المحددة فيdatabase.yml
. - ضغط الملفات: يتم ضغط ملف النسخ الاحتياطي باستخدام gzip لتوفير المساحة.
- نقل الملفات: يتم إرسال الملف المضغوط إلى خادم بعيد باستخدام SFTP.
على الرغم من أن السكريبت يعمل بشكل جيد عند تشغيله مباشرة من سطر الأوامر، إلا أن cron job
أدى إلى توليد ملف فارغ. أدناه نسخة مبسطة من الأمر الذي كان يسبب المشكلة.
PATH=/usr/bin
10 3 * * * ruby /home/deploy/bin/datadump.rb
لماذا يحدث هذا؟
جوهر المشكلة يكمن في البيئة التي ينفذ فيها cron job
. عندما يتم تشغيل سكريبت أو أمر عبر cron
، فإنه يتم في بيئة مقيدة قد لا تقلد دائمًا جلسة الطرفية الخاصة بالمستخدم. يمكن أن يؤدي ذلك إلى سلوكيات غير متوقعة، خاصة عندما:
- دليل العمل: قد لا تعمل
cron jobs
في دليل العمل المتوقع. - المتغيرات البيئية: قد لا تكون المتغيرات البيئية معينة متاحة عند تشغيل سكريبت عبر
cron
.
الحل
الخطوة 1: تحقق من دليل العمل
عندما ينفذ cron job
الخاص بك، فإنه لا يعمل في سياق بيئة المستخدم المعتادة. غالبًا، قد لا يتوفر له نفس الدليل المنزلي أو دليل العمل. إحدى الطرق لضمان تصرف السكريبت بنفس الطريقة هي تحديد دليل العمل بشكل صريح.
كيفية تحديد دليل العمل:
- يمكنك استخدام أمر
cd
في بدايةcron job
الخاص بك:
10 3 * * * cd /home/deploy/bin && ruby datadump.rb
الخطوة 2: استخدم المسارات المطلقة
قد تظهر مشكلة أخرى إذا كان السكريبت الخاص بك يولد ملفات باستخدام مسارات نسبية. قد لا تمتلك بيئة تنفيذ cron job
الأذونات اللازمة لإنشاء الملفات في الدلائل الافتراضية. لحل ذلك:
- استخدم المسارات المطلقة لعمليات الملف داخل السكريبت الخاص بك بدلاً من المسارات النسبية.
على سبيل المثال، قم بتعديل توليد الملف:
dump = "/home/deploy/backups/myapp-#{Time.now.strftime(TIMESTAMP)}.sql.gz"
الخطوة 3: تعيين الأذونات الصحيحة
تحقق من أن المستخدم الذي يقوم بتشغيل cron job
(في هذه الحالة، deploy
) لديه الأذونات اللازمة لـ:
- دليل الإخراج حيث يتم إنشاء ملفات النسخ الاحتياطي.
- الوصول إلى أي ملفات أو دلائل أخرى يتفاعل معها السكريبت.
الخطوة 4: سجل المخرجات لأغراض تصحيح الأخطاء
يمكن أن توفر سجلات العمليات في السكريبتات نظرة قيمة على ما يحدث عندما يقوم cron
بتشغيل الوظيفة. تأكد من تسجيل:
- رسائل تشير إلى بدء وإنهاء المهام.
- أي أخطاء تم مواجهتها أثناء التنفيذ.
يمكنك أيضًا إعادة توجيه المخرجات القياسية والأخطاء إلى ملف سجل ضمن أمر cron job
الخاص بك:
10 3 * * * ruby /home/deploy/bin/datadump.rb >> /home/deploy/log/cron.log 2>&1
الخطوة 5: المتغيرات البيئية
أخيرًا، تأكد من أن أي متغيرات بيئية مطلوبة تم تعيينها بشكل صحيح. cron job
لن يرث جميع المتغيرات من الصدفة الخاصة بك، مما يمكن أن يؤدي إلى فشل في تنفيذ السكريبت.
الخاتمة
من خلال التحقق من دليل العمل، استخدام المسارات المطلقة، ضمان الأذونات الصحيحة، تسجيل المخرجات لتسهيل تصحيح الأخطاء، ومراجعة المتغيرات البيئية، يمكنك استكشاف وحل المشكلات المتعلقة بـ cron jobs
التي لا تعمل بشكل فعال.
قد تكون مواجهة المشكلات التقنية مع cron jobs
محبطة، ولكن من خلال استكشاف الأخطاء بشكل منهجي، يمكنك استعادة موثوقية المهام المجدولة على نظامك.