لتشغيل مهام Nextcloud في الخلفية تلقائيًا باستخدام systemd، قم بتهيئة خدمة لمرة واحدة تعمل cron.phpبصلاحيات مستخدم خادم الويب، ثم فعّل مؤقتًا لتشغيل هذه الخدمة كل خمس دقائق. أهم الفحوصات هي: تفعيل المؤقت وتحديد وقت التشغيل التالي، وإشارة الخدمة إلى مسارات Nextcloud وPHP الصحيحة، وإظهار سجل الخدمة خروجًا ناجحًا. قد تظهر الخدمة لمرة واحدة "غير نشطة (متوقفة)" بين عمليات التشغيل؛ وهذا أمر طبيعي بعد انتهاء الخدمة.
هذا الإعداد مخصص لتثبيت Nextcloud التقليدي على Ubuntu باستخدام systemd، مع توفر ملفات Nextcloud على الجهاز المضيف. إذا كان Nextcloud يعمل داخل Docker أو Snap أو جهاز مثل Nextcloud All-in-One، فاستخدم طريقة جدولة التوزيعة الموثقة بدلاً من توجيه وحدة مضيفة إلى مسار خاص بالحاويات فقط. تستخدم الأمثلة أدناه المسارين /var/www/nextcloudو www-data؛ استبدلهما بمسار التثبيت الفعلي ومستخدم HTTP على خادمك.
ما الذي يجب أن يحققه المؤقت
يُشغّل Nextcloud cron.phpمهامًا مُجدولة في الخلفية، مثل الصيانة ومهام التطبيق. يعمل مؤقت systemd كساعة، والخدمة هي الأمر الذي يُنفّذ عند انتهاء المؤقت. أنت بحاجة إلى كليهما. إنشاء الملفات دون تفعيل المؤقت يُبقي الجدول غير نشط، بينما تفعيل مؤقت يُشير إلى مسار PHP أو Nextcloud خاطئ قد يُؤدي إلى فشل متكرر في التشغيل.
توصي Nextcloud باستخدام cron النظامي لتشغيل المهام الخلفية في بيئة الإنتاج. كما يوثّق دليل الإدارة الحالي مؤقتات systemd كبديل. يبدأ الجدول الزمني المُقترح بعد خمس دقائق من بدء التشغيل، ثم يُجدول تشغيلًا آخر بعد خمس دقائق من كل تفعيل للخدمة. وهذا يُغني عن الاعتماد على زيارة المستخدم لواجهة الويب.
1. تأكد من مسار التثبيت والمستخدم وواجهة سطر أوامر PHP
قبل تعديل الوحدات، حدد موقع مجلد Nextcloud الفعلي وتحقق من أمر PHP الذي يتوقعه تثبيت خادم الويب. في تثبيت أرشيف نموذجي لنظام Ubuntu، قد يكون المسار هو `/usr/web/ /var/www/nextclouduser`، وغالبًا ما يكون اسم مستخدم الويب هو `/usr/web/user` www-data، ويكون أمر سطر أوامر PHP هو `/usr/ web/user` /usr/bin/php. تحقق من ذلك بدلًا من الافتراض.
ls -l /var/www/nextcloud/cron.php
command -v php
php -v
إذا كان مجلد Nextcloud الخاص بك موجودًا في مكان آخر، فاستبدل هذا المجلد في كلا أمري الوحدة أدناه. إذا كان خادم الويب يستخدم إصدار PHP مختلفًا، فاستخدم ملف CLI التنفيذي لهذا الإصدار في الأمرَين `.systemd` ExecStartو` ExecCondition.systemd` لا يرث مسار PATH أو بيئة التشغيل الخاصة بالصدفة التفاعلية، لذا فإن استخدام مسارات صريحة أكثر موثوقية.
اختبر حالة التحقق باستخدام نفس المستخدم الذي سيستخدمه نظام systemd:
sudo -u www-data /usr/bin/php -f /var/www/nextcloud/occ status -e
يجب تشغيل أمر Nextcloud occبصلاحيات مستخدم HTTP للحفاظ على ملكية الملفات والأذونات الصحيحة. إذا أبلغ هذا الاختبار عن خطأ في PHP، أو وضع الصيانة، أو ملف مفقود، فقم بإصلاح ذلك أولاً؛ إذ لا يمكن للمؤقت التعويض عن فشل أمر Nextcloud.
2. إنشاء خدمة لمرة واحدة
يخلق /etc/systemd/system/nextcloudcron.service:
sudo nano /etc/systemd/system/nextcloudcron.service
أدخل هذه الوحدة، مع تعديل المسار والمستخدم إذا كان التثبيت الخاص بك مختلفًا:
[Unit]
Description=Nextcloud cron.php job
[Service]
User=www-data
ExecCondition=/usr/bin/php -f /var/www/nextcloud/occ status -e
ExecStart=/usr/bin/php -f /var/www/nextcloud/cron.php
KillMode=process
ExecConditionيتحقق النظام من عمل Nextcloud بشكل طبيعي قبل تشغيل المهمة في الخلفية. إذا لم يتحقق الشرط، يتخطى systemd عملية التشغيل؛ راجع سجل النظام لمعرفة السبب. KillMode=processيسمح هذا النظام للبرامج الخارجية التي تبدأها مهمة في الخلفية بالاستمرار بعد انتهاء عملية cron الرئيسية. لا يتطلب مثال Nextcloud الحالي [Install]قسمًا في ملف الخدمة هذا.
يُنصح باستخدام /usr/bin/phpهذه الطريقة فقط عندما يكون هذا هو مُفسِّر سطر الأوامر الصحيح على خادمك. على سبيل المثال، قد يقوم مستودع PHP مُخصَّص بتثبيت ملف تنفيذي مُرقَّم. استخدم نفس إصدار PHP المُتوافق الذي يتطلبه Nextcloud والذي يستخدمه تكوين خادم الويب الخاص به.
3. إنشاء المؤقت
يخلق /etc/systemd/system/nextcloudcron.timer:
sudo nano /etc/systemd/system/nextcloudcron.timer
يضيف:
[Unit]
Description=Run Nextcloud cron.php every 5 minutes
[Timer]
OnBootSec=5 min
OnUnitActiveSec=5 min
Unit=nextcloudcron.service
[Install]
WantedBy=timers.target
OnBootSecيُجدول التشغيل الأول بعد خمس دقائق من بدء تشغيل systemd عند الإقلاع. OnUnitActiveSecويُجدول تشغيلًا آخر بعد خمس دقائق من آخر تفعيل للخدمة. يختلف المؤقت عن الخدمة نفسها: فعّل الوحدة وابدأ .timerتشغيلها لتشغيل الجدول تلقائيًا.
4. أعد تحميل systemd وقم بتفعيل المؤقت
اطلب من نظام systemd قراءة ملفات الوحدة الجديدة، ثم قم بتمكين المؤقت وبدء تشغيله في أمر واحد:
sudo systemctl daemon-reload
sudo systemctl enable --now nextcloudcron.timer
تحقق من المؤقت:
systemctl status nextcloudcron.timer
systemctl list-timers --all | grep nextcloudcron
يجب تحميل المؤقت وتفعيله، ويجب list-timersأن يُظهر وقتًا مستقبليًا أسفل "التالي". إذا كان معطلاً، أو غير مُحمّل، أو لا يحتوي على تفعيل تالٍ، فتأكد من أن اسم الملف ينتهي بـ "." .timer، وأن [Install]القسم يحتوي على " . WantedBy=timers.target"، وأنك قمت بتشغيله daemon-reloadبعد حفظ الملفات.
5. قم بإجراء اختبار واحد وافحص نتيجته
يمكنك تشغيل الخدمة مرة واحدة دون انتظار دقات المؤقت التالية:
sudo systemctl start nextcloudcron.service
sudo systemctl status nextcloudcron.service
sudo journalctl -u nextcloudcron.service -n 50 --no-pager
ابحث عن نتيجة الخدمة وأي أخطاء في PHP أو Nextcloud. بعد انتهاء الأمر، nextcloudcron.serviceقد يعود النظام إلى نقطة البداية inactive (dead)لأنه مهمة تُنفذ لمرة واحدة. هذا لا يعني بالضرورة فشلها. يجب أن يبقى المؤقت نشطًا ويُجدول التشغيل التالي؛ ويجب أن يُظهر سجل النظام ما إذا كان التشغيل السابق قد انتهى بنجاح.
في إعدادات إدارة Nextcloud، افتح قسم حالة مهام الخلفية وتأكد من أن وقت تنفيذ المهمة الأخيرة يتقدم بعد انتهاء المؤقت. سيختفي تحذير النظرة العامة عندما يكتشف Nextcloud نشاطًا حديثًا في الخلفية. انتظر فترة زمنية واحدة على الأقل بعد تفعيل المؤقت قبل الجزم بأن الجدول الزمني لم يُنفذ.
تشخيص أنماط الأعطال الشائعة
| ما تراه | ما الذي يجب فحصه؟ | الخطوة التالية |
| المؤقت "غير نشط" أو معطل | ما إذا كانت وحدة المؤقت قد تم تمكينها وبدأت العمل | قم بتشغيله sudo systemctl enable --now nextcloudcron.timer، ثم تحققsystemctl list-timers |
| المؤقت نشط، لكن الخدمة تفشل | سجل الخدمة، ملف PHP القابل للتنفيذ، مسار Nextcloud، ومستخدم الخدمة | قم بتشغيل اختبار الحالة كـ www-data؛ أصلح أول خطأ تم الإبلاغ عنه في PHP أو خطأ في أذونات الملف |
| تكون الخدمة غير نشطة بين عمليات التشغيل | وقت المؤقت التالي وآخر إدخال في سجل الخدمة | إذا تم إنهاء الخدمة بنجاح وظل المؤقت نشطًا، فهذا أمر طبيعي بالنسبة لوحدة تعمل لمرة واحدة. |
تنتهي الخدمة دون تشغيلهاcron.php | النتيجة ExecConditionوما إذا كان Nextcloud في وضع الصيانة | قم بحل مشكلة الفشل وتحقق من حالة Nextcloud قبل إعادة تشغيل المهمة يدويًا. |
| لا تزال صفحة الإدارة تُشير إلى أن cron لم يتم تشغيله | ما إذا كانت الخدمة تستدعي النسخة الصحيحة بالفعل، وما إذا كان وقت تنفيذها الأخير يتغير | انتظر فترة زمنية محددة، ثم افحص السجلات، وتأكد من أنك تتحقق من نفس تثبيت Nextcloud. |
للحصول على مزيد من التفاصيل، راجع سجلات الخدمة الأخيرة وملف سجل Nextcloud:
sudo journalctl -u nextcloudcron.service --since "30 minutes ago" --no-pager
sudo -u www-data /usr/bin/php -f /var/www/nextcloud/occ background-job:list
تُظهر قائمة المهام العمل المُسجّل، لكنها لا تُعدّ دليلاً كافياً على أن المؤقت يعمل. استخدم وقتي التنشيط الأخير والتالي للمؤقت، وسجل الخدمة، ومؤشر آخر تشغيل في Nextcloud معاً.
متى يجب استخدام مُجدول مختلف
تعمل مؤقتات Systemd بكفاءة عندما يُشغّل الخادم نظام systemd وترغب في جدولة محلية تُدار بواسطة الخدمة. إذا كنت تُشغّل بالفعل برنامج cron قياسيًا ويمكنك التحقق من ملف crontab الخاص به، فسيتم دعم إدخال cron النظامي الذي يستدعي نفس الأمر cron.php. www-dataتجنّب جدولة كلا الطريقتين لنفس مثيل Nextcloud؛ لأن الاستدعاءات المتداخلة قد تُهدر الموارد وتُعقّد عملية استكشاف الأخطاء وإصلاحها.
يعتمد جدولة AJAX على زيارات المستخدمين لـ Nextcloud، وهو أقل موثوقية للخوادم المشغولة أو متعددة المستخدمين. تُجرى استدعاءات Webcron cron.phpعبر HTTP، وقد تكون مناسبة للخوادم الصغيرة جدًا حيث لا يتوفر الوصول إلى النظام، ولكن Nextcloud تُشير إلى أن تنفيذ الويب يُحد من حجم العمل الذي يُمكن تنفيذه لكل استدعاء. إذا كان Nextcloud مُحوسبًا في حاوية أو مُدارًا بواسطة جهاز، فاستخدم مُجدوله أو إعدادات الحاوية المُدعمة؛ /var/www/nextcloudلن تعمل خدمة المضيف التي تستخدم هذه الطريقة إذا لم يكن هذا المسار موجودًا على المضيف.
يتضمن الإعداد السليم مؤقتًا مُفعّلًا بوقت تشغيل متكرر، وتشغيلات خدمة تُنجز دون أخطاء PHP، ووقت تشغيل Nextcloud الأخير الذي يتقدم. إذا تحققت الشروط الثلاثة، ولكن لا تزال مهمة تطبيق معينة متأخرة، فقد يكون المُجدوِل يعمل بينما تنتظر تلك المهمة جدولها الزمني، أو فترة الصيانة، أو شروط قائمة الانتظار. شخّص تلك المهمة بشكل منفصل قبل تغيير فاصل المؤقت.
المراجع الرسمية