الأمر يعمل في طرفيّتك ولا يُنتج شيئًا في الثالثة فجرًا. وcron ليس معطوبًا. إنه يشغّل أمرك في بيئة لا تشبه صدفتك في شيء تقريبًا، وذلك الفرق هو الجواب كلّه.
انظر ما الذي حدث
grep CRON /var/log/syslog | tail -20
إن لم تكن مهمّتك هناك إطلاقًا فـcron لم يحاول أصلًا. وإن كانت هناك فقد شغّلها cron وأخطأ شيءٌ آخر.
١. المتغيّر PATH شبه فارغ
صدفتك تعرف أين php. أمّا cron فلا — ومساره عادةً /usr/bin:/bin فحسب. استعمل المسار الكامل دائمًا.
which php
# /usr/bin/php8.3
# in the crontab
0 3 * * * /usr/bin/php8.3 /var/www/site/cron.php
٢. المُخرَج لا يذهب إلى مكان
مهمّةٌ بلا إعادة توجيه تُرسل مُخرَجها إلى بريد غير مضبوط، فتختفي الأخطاء. أرسله إلى ملفّ، فيشرح الفشل التالي نفسه بنفسه.
0 3 * * * /usr/bin/php8.3 /var/www/site/cron.php >> /var/log/site-cron.log 2>&1
٣. المستخدم الخطأ
مهمّةٌ في جدول الجذر تكتب ملفّاتٍ يملكها الجذر، فلا يقدر خادم الويب على تغييرها. ضعها في جدول المستخدم الذي يملك الموقع.
crontab -u youruser -l
٤. علامة النسبة المئوية
في جدول cron تعني
% سطرًا جديدًا. فصيغةُ تاريخ مثل +%Y-%m-%d تصير بصمت ثلاثة أسطر وينكسر الأمر. هرّبها هكذا: \%.وجرّبها كما سيجرّبها cron
env -i /bin/sh -c "/usr/bin/php8.3 /var/www/site/cron.php"
هذا يشغّلها ببيئة فارغة، وهو ما يفعله cron. فإن فشلت هنا فستفشل في الثالثة.
وجدولة WordPress ليست cron: تعمل مع تحميل الصفحات، فموقعٌ هادئ لا يشغّل مهامّه أبدًا. أطفئ WP_CRON ونادِ wp-cron.php من مهمّة cron حقيقية.
