Para que las tareas en segundo plano de Nextcloud se ejecuten automáticamente con systemd, configure un servicio de ejecución única que se ejecute cron.phpcomo el usuario del servidor web y, a continuación, habilite un temporizador que inicie dicho servicio cada cinco minutos. Las comprobaciones clave son: que el temporizador esté habilitado y tenga una hora de ejecución programada, que el servicio apunte a las rutas correctas de Nextcloud y PHP, y que el registro del servicio muestre una salida exitosa. Un servicio de ejecución única puede aparecer como "inactivo (muerto)" entre ejecuciones; esto puede ser normal una vez que finaliza.
Esta configuración es para una instalación convencional de Nextcloud en Ubuntu usando systemd, con los archivos de Nextcloud disponibles en el host. Si Nextcloud se ejecuta dentro de Docker, Snap o un dispositivo como Nextcloud All-in-One, use el método de programación documentado de esa distribución en lugar de apuntar una unidad host a una ruta exclusiva del contenedor. Los ejemplos a continuación usan /var/www/nextcloudy www-data; reemplácelos con la ruta de instalación real y el usuario HTTP en su servidor.
Lo que el temporizador debería lograr
Nextcloud cron.phpejecuta tareas en segundo plano en cola, como mantenimiento y tareas de la aplicación. El temporizador de systemd es el reloj; el servicio es el comando que se ejecuta cuando finaliza el temporizador. Necesitas ambos. Crear los archivos sin habilitar el temporizador deja la programación inactiva, mientras que habilitar un temporizador que apunte a una ruta incorrecta de PHP o Nextcloud puede provocar fallos repetidos en la ejecución.
Nextcloud recomienda usar cron del sistema para las tareas en segundo plano en producción. Su manual de administración actual también documenta los temporizadores de systemd como alternativa. El ejemplo de programación se inicia cinco minutos después del arranque y luego programa otra ejecución cinco minutos después de cada activación del servicio. Esto evita que el usuario tenga que acceder a la interfaz web.
1. Confirme la ruta de instalación, el usuario y la interfaz de línea de comandos de PHP.
Antes de editar las unidades, localice el directorio real de Nextcloud y compruebe qué comando PHP espera la instalación del servidor web. En una instalación típica de archivo Ubuntu, la ruta puede ser /var/www/nextcloud, el usuario web suele ser www-datay la CLI de PHP es /usr/bin/php. Verifique en lugar de asumir:
ls -l /var/www/nextcloud/cron.php
command -v php
php -v
Si su directorio de Nextcloud se encuentra en otra ubicación, sustitúyalo en ambos comandos de unidad a continuación. Si el servidor web utiliza una versión de PHP diferente, utilice el ejecutable CLI de esa versión en ExecStarty ExecCondition. Un servicio systemd no hereda la variable PATH ni el entorno del intérprete de comandos interactivo, por lo que las rutas explícitas son más fiables.
Pruebe la comprobación de estado con el mismo usuario que utilizará systemd:
sudo -u www-data /usr/bin/php -f /var/www/nextcloud/occ status -e
El comando de Nextcloud occdebe ejecutarse como usuario HTTP para preservar la propiedad y los permisos correctos de los archivos. Si esta prueba informa un error de PHP, modo de mantenimiento o un archivo faltante, corríjalo primero; el temporizador no puede compensar un comando de Nextcloud que falle.
2. Crear el servicio de un solo uso
Crear /etc/systemd/system/nextcloudcron.service:
sudo nano /etc/systemd/system/nextcloudcron.service
Ingrese a esta unidad, ajustando la ruta y el usuario si su instalación es diferente:
[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
ExecConditionComprueba si Nextcloud funciona correctamente antes de ejecutar la tarea en segundo plano. Si la condición falla, systemd omite la ejecución; consulte el registro para saber el motivo. KillMode=processPermite que los programas externos iniciados por una tarea en segundo plano continúen después de que finalice el proceso cron principal. El ejemplo actual de Nextcloud no requiere una [Install]sección en este archivo de servicio.
Su uso /usr/bin/phpsolo es apropiado si se trata del intérprete de línea de comandos correcto en su servidor. Por ejemplo, un repositorio PHP personalizado puede instalar un binario con versión específica. Utilice la misma versión de PHP compatible que requiere Nextcloud y que utiliza la configuración de su servidor web.
3. Crea el temporizador
Crear /etc/systemd/system/nextcloudcron.timer:
sudo nano /etc/systemd/system/nextcloudcron.timer
Agregar:
[Unit]
Description=Run Nextcloud cron.php every 5 minutes
[Timer]
OnBootSec=5 min
OnUnitActiveSec=5 min
Unit=nextcloudcron.service
[Install]
WantedBy=timers.target
OnBootSecPrograma la primera ejecución cinco minutos después de que systemd se inicie al arrancar el sistema. OnUnitActiveSecPrograma otra ejecución cinco minutos después de la última activación del servicio. El temporizador no es lo mismo que el servicio: habilite e inicie la .timerunidad para que la programación se ejecute automáticamente.
4. Reinicie systemd y habilite el temporizador.
Pídele a systemd que lea los nuevos archivos de unidad y, a continuación, habilita e inicia el temporizador con un solo comando:
sudo systemctl daemon-reload
sudo systemctl enable --now nextcloudcron.timer
Comprueba el temporizador:
systemctl status nextcloudcron.timer
systemctl list-timers --all | grep nextcloudcron
El temporizador debe estar cargado y activo, y list-timersdebe mostrar una hora futura debajo de SIGUIENTE. Si está deshabilitado, no está cargado o no tiene activación siguiente, confirme que el nombre del archivo termina en .timer, la [Install]sección contiene WantedBy=timers.targety ejecutó daemon-reloaddespués de guardar los archivos.
5. Ejecuta una prueba e inspecciona su resultado.
Puedes iniciar el servicio una vez sin esperar al siguiente ciclo del temporizador:
sudo systemctl start nextcloudcron.service
sudo systemctl status nextcloudcron.service
sudo journalctl -u nextcloudcron.service -n 50 --no-pager
Busque el resultado del servicio y cualquier error de PHP o Nextcloud. Una vez finalizado el comando, nextcloudcron.servicees posible que regrese a la inactive (dead)pantalla anterior, ya que se trata de una tarea única. Esto no significa necesariamente que haya fallado. El temporizador debería permanecer activo y programar la siguiente ejecución; el registro debería mostrar si la ejecución anterior finalizó correctamente.
En la configuración de administración de Nextcloud, abra el área de estado de trabajos en segundo plano y confirme que la hora de ejecución del último trabajo avanza después de que se active el temporizador. La advertencia general debería desaparecer cuando Nextcloud detecte actividad reciente en segundo plano. Espere al menos un intervalo después de activar el temporizador antes de considerar que la programación no se ha ejecutado.
Diagnosticar los patrones de falla comunes
| Lo que ves | Qué comprobar | Siguiente paso |
| El temporizador está “inactivo” o deshabilitado. | Si la unidad de temporizador estaba habilitada y en marcha. | Ejecuta sudo systemctl enable --now nextcloudcron.timery luego verifica.systemctl list-timers |
| El temporizador está activo, pero el servicio falla. | El registro del servicio, el ejecutable PHP, la ruta de Nextcloud y el usuario del servicio. | Ejecuta la prueba de estado como www-data; corrige el primer error de PHP o de permisos de archivo reportado. |
| El servicio está inactivo entre ejecuciones. | La siguiente hora del temporizador y la última entrada del registro del servicio. | Si el servicio finalizó correctamente y el temporizador permanece activo, esto es normal para una unidad de un solo uso. |
El servicio finaliza sin ejecutarsecron.php | El ExecConditionresultado y si Nextcloud está en modo de mantenimiento | Resuelva el fallo de condición y compruebe el estado de Nextcloud antes de iniciar la tarea manualmente de nuevo. |
| La página de administración sigue indicando que cron no se ha ejecutado. | Si el servicio realmente invoca la instancia correcta y si cambia su último tiempo de ejecución | Espere a que transcurra el intervalo de tiempo establecido, revise los registros y verifique que está comprobando la misma instalación de Nextcloud. |
Para obtener más detalles, revise los registros de servicio recientes y el archivo de registro de 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
La lista de tareas muestra el trabajo registrado, pero por sí sola no demuestra que el temporizador se esté ejecutando. Utilice conjuntamente la hora de la última y la próxima activación del temporizador, el registro de servicio y el indicador de última ejecución de Nextcloud.
Cuándo usar un planificador diferente
Los temporizadores de Systemd funcionan bien cuando el servidor ejecuta systemd y se desea una programación local gestionada por el servicio. Si ya se utiliza un demonio cron estándar y se puede verificar su crontab, también se admite una entrada de cron del sistema que realice la misma llamada cron.php. www-dataNo se deben programar ambos métodos para la misma instancia de Nextcloud; las invocaciones superpuestas pueden desperdiciar recursos y complicar la resolución de problemas.
La programación de AJAX depende de que los usuarios visiten Nextcloud y es menos fiable para un servidor con mucha actividad o multiusuario. Las llamadas de Webcron se realizan cron.phpa través de HTTP y pueden ser adecuadas para una instancia muy pequeña donde no se dispone de acceso al sistema, pero Nextcloud advierte que la ejecución web limita la cantidad de trabajo que se puede realizar por llamada. Si Nextcloud está en un contenedor o gestionado por un dispositivo, utilice su programador o configuración de contenedor compatible; un servicio de host que utilice /var/www/nextcloudno funcionará si esa ruta no está presente en el host.
Una configuración correcta incluye un temporizador habilitado con una hora de inicio recurrente, ejecuciones de servicio que finalizan sin errores de PHP y una hora de última ejecución de Nextcloud que avanza. Si se cumplen estas tres condiciones, pero una tarea específica de la aplicación sigue apareciendo retrasada, es posible que el planificador esté trabajando mientras esa tarea espera su propia programación, ventana de mantenimiento o condiciones de cola. Diagnostique esa tarea por separado antes de modificar el intervalo del temporizador.
Referencias oficiales