Lorsque la page d'administration de Nextcloud indique que ses tâches en arrière-plan n'ont pas été exécutées récemment, le nettoyage, les notifications et autres tâches planifiées peuvent prendre du retard. Sur un serveur systemd, la solution consiste généralement à exécuter Nextcloud cron.phpavec le compte du serveur web via un service systemd, puis à planifier ce service avec un minuteur activé. Le manuel d'administration actuel de Nextcloud fournit un exemple à deux unités ; les chemins d'accès et le compte de service doivent correspondre à votre installation.
Vérifiez d'abord ce qui ne fonctionne pas.
Les tâches en arrière-plan de Nextcloud s'exécutent lorsqu'elles sont lancées. Un servicecron.php systemd définit la commande à exécuter ; une minuterie démarre ce service selon une planification. Si le service s'exécute manuellement mais que la minuterie ne se déclenche jamais, vérifiez l'activation de la minuterie. Si la minuterie se déclenche mais que le service échoue, examinez sa commande, son environnement PHP et ses permissions.
Vérifiez le répertoire Nextcloud et l'utilisateur HTTP avant toute modification. Cet exemple suppose l'utilisation de `/etc/nextcloud` /var/www/nextcloudet `/etc/nextcloud` www-data, courants sur Debian et Ubuntu. Le compte peut être `/etc/nextcloud` wwwrun, apache`/etc/nextcloud` ou un autre utilisateur sur d'autres systèmes. Nextcloud exige que ses tâches en ligne de commande soient exécutées avec l'utilisateur HTTP afin de garantir la cohérence des droits d'accès aux fichiers. Consultez la documentation de Nextcloud relative à la commande `occ` .
Testez le même exécutable PHP et le même script cron que ceux que vous prévoyez d'utiliser avec systemd :
sudo -u www-data /usr/bin/php -f /var/www/nextcloud/cron.php
Remplacez le compte, le chemin PHP et le chemin Nextcloud par ceux de votre hébergeur. Si la commande signale une erreur PHP, une extension manquante, un problème d'autorisation, un mode maintenance ou une défaillance de connexion à la base de données, résolvez ce problème en premier lieu ; le minuteur ne peut pas corriger une commande ayant échoué.
Confirmez que Nextcloud utilise les tâches système cron
Ouvrez les paramètres d'administration → Paramètres de base → Tâches en arrière-plan et sélectionnez Cron s'il n'est pas déjà sélectionné. Vous pouvez également exécuter cette commande depuis le répertoire Nextcloud :
cd /var/www/nextcloud
sudo -E -u www-data php occ background:cron
Nextcloud précise que la sélection de Cron dans les paramètres d'administration n'est pas strictement nécessaire si cron.phpla commande est exécutée en ligne de commande, car le script configure automatiquement le mode. La définir explicitement permet de clarifier le mode de production souhaité. Nextcloud recommande l'utilisation de cron système en production ; sa documentation sur les tâches en arrière-plan mentionne également les minuteurs systemd comme alternative.
Réparer le service systemd
Créez ou mettez à jour le fichier /etc/systemd/system/nextcloudcron.serviceavec le contenu suivant. Utilisez le chemin complet vers PHP afin que systemd ne dépende pas d'un shell interactif PATH.
[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
Modifiez Userle compte du serveur web et les deux chemins d'accès pour pointer vers les emplacements PHP et Nextcloud correspondants. La condition vérifie que l'instance fonctionne normalement avant d'exécuter la tâche. Si la condition échoue, systemd peut ignorer le service ; vérifiez si Nextcloud est en mode maintenance et consultez le journal avant de supprimer ou de modifier la condition. Conservez la clause `<service>` KillMode=process, car l'exemple de Nextcloud l'utilise pour que les programmes externes lancés par cron puissent continuer à s'exécuter après l'arrêt du processus cron. L'unité de service ne nécessite pas de [Install]section `<service>`.
Réparer et activer la minuterie
Créer /etc/systemd/system/nextcloudcron.timer. Cette planification démarre cinq minutes après le démarrage et attend ensuite cinq minutes après chaque activation de service :
[Unit]
Description=Run Nextcloud cron.php every 5 minutes
[Timer]
OnBootSec=5 min
OnUnitActiveSec=5 min
Unit=nextcloudcron.service
[Install]
WantedBy=timers.target
Rechargez systemd pour qu'il lise les fichiers d'unité, puis activez et démarrez le minuteur en une seule commande :
sudo systemctl daemon-reload
sudo systemctl enable --now nextcloudcron.timer
L'activation de cette option permet au minuteur de démarrer automatiquement au prochain démarrage ; l' --nowactivation immédiate le démarre. Ne pas activer le service lui-même comme s'il s'agissait d'un minuteur récurrent. Le minuteur est l'unité de configuration timers.target. Le manuel actuel de Nextcloud explique ces paramètres d'intervalle et la commande d'activation requise ; les versions précédentes du manuel contenaient une section d'installation obsolète pour ce service, veuillez donc suivre l'exemple actuel.
Tracez une exécution manquée et vérifiez la correction
Vérifiez l'état du minuteur et la prochaine exécution programmée :
systemctl status nextcloudcron.timer
systemctl list-timers nextcloudcron.timer
Le minuteur devrait indiquer « En attente » ou « Actif », et la liste devrait afficher la prochaine heure d'activation. Ensuite, examinez la dernière exécution du service :
systemctl status nextcloudcron.service
journalctl -u nextcloudcron.service --since today
Un minuteur peut rester actif même si chaque exécution de service échoue ; vérifiez donc les deux unités. Si le service est absent ou si systemd rejette le fichier, exécutez la commande ` systemctl --no-timer` systemd-analyze verify /etc/systemd/system/nextcloudcron.service /etc/systemd/system/nextcloudcron.timer, corrigez l'erreur de syntaxe ou de chemin signalée, puis rechargez systemd. Si le service s'arrête de manière inattendue, les journaux système indiquent souvent un chemin PHP invalide, un utilisateur incorrect, une condition d'échec ou une erreur d'exécution de Nextcloud. Si le minuteur n'a pas de prochaine exécution prévue, vérifiez le nom exact du fichier du minuteur, exécutez la commande `systemctl --no-timer` daemon-reloadet confirmez qu'il a bien été activé avec `systemctl --no-timer` systemctl is-enabled nextcloudcron.timer.
Après la prochaine activation du minuteur, vérifiez à nouveau l'état des tâches en arrière-plan de Nextcloud. Il devrait afficher une durée d'exécution récente plutôt qu'un avertissement d'obsolescence. Si le minuteur et le service indiquent tous deux une exécution réussie, mais que la page d'administration affiche toujours un avertissement d'obsolescence, consultez les journaux de l'instance et la version de PHP utilisée par le serveur web ; la version de PHP en ligne de commande peut différer de celle utilisée par le serveur web. Cette configuration concerne la planification systemd sur un hôte Linux classique. Les installations conteneurisées et les appliances peuvent gérer cron via leur propre superviseur de services ; utilisez donc la méthode prise en charge par la plateforme plutôt que d'ajouter des unités hôtes qui ne peuvent pas accéder aux fichiers du conteneur.