Quando a página de administração do Nextcloud indica que suas tarefas em segundo plano não foram executadas recentemente, a limpeza, as notificações e outras tarefas agendadas podem ficar atrasadas. Em um servidor systemd, a solução geralmente é executar o Nextcloud cron.phpcomo o servidor web a partir de um serviço systemd e, em seguida, agendar esse serviço com um temporizador ativado. O Manual de Administração atual do Nextcloud fornece um exemplo com duas unidades; os caminhos e a conta de serviço devem corresponder à sua instalação.
Verifique primeiro o que está falhando.
Os jobs em segundo plano do Nextcloud são executados quando o cron.phpcomando é invocado. Um serviço do systemd define o comando a ser executado; um temporizador inicia esse serviço em um cronograma. Se o serviço for executado manualmente, mas o temporizador nunca for acionado, concentre-se na ativação do temporizador. Se o temporizador for acionado, mas o serviço falhar, inspecione seu comando, ambiente PHP e permissões.
Confirme o diretório Nextcloud e o usuário HTTP corretos antes de editar qualquer coisa. Este exemplo pressupõe `/usr/local/bin` /var/www/nextcloude `/usr www-data/local/bin`, comuns no Debian e Ubuntu. A conta pode ser `/ usr/local/bin` wwwrun, apache`/usr/local/bin` ou outro usuário em sistemas diferentes. O Nextcloud exige que seus comandos de linha de comando sejam executados como o usuário HTTP para que a propriedade dos arquivos permaneça consistente. Consulte a documentação do Nextcloud sobre o `occ` .
Teste o mesmo executável PHP e o mesmo script cron que você pretende que o systemd utilize:
sudo -u www-data /usr/bin/php -f /var/www/nextcloud/cron.php
Substitua a conta, o caminho do PHP e o caminho do Nextcloud pelo seu host. Se o comando reportar um erro de PHP, extensão ausente, problema de permissão, modo de manutenção ou falha na conexão com o banco de dados, resolva isso primeiro; o temporizador não pode corrigir um comando com falha.
Confirme se o Nextcloud usa o cron do sistema.
Abra as configurações de administração → Configurações básicas → Tarefas em segundo plano e selecione Cron , caso ainda não esteja selecionado. Você também pode executar este comando a partir do diretório do Nextcloud:
cd /var/www/nextcloud
sudo -E -u www-data php occ background:cron
O Nextcloud observa que selecionar o Cron nas configurações de administração não é estritamente necessário se cron.phpo script for executado a partir da linha de comando, pois ele define o modo automaticamente. Definir o modo explicitamente deixa claro qual será o modo de produção pretendido. O Nextcloud recomenda o cron do sistema para produção; sua documentação sobre tarefas em segundo plano também menciona os timers do systemd como uma alternativa de agendamento.
Repare o serviço systemd
Crie ou atualize /etc/systemd/system/nextcloudcron.servicecom o seguinte conteúdo. Use o caminho completo para o PHP para que o systemd não dependa do shell interativo 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
Altere Userpara a conta do servidor web e ambos os caminhos para os locais correspondentes do PHP e do Nextcloud. A condição verifica se a instância está operando normalmente antes de executar a tarefa. Se a condição falhar, o systemd poderá ignorar o serviço; verifique se o Nextcloud está em modo de manutenção e inspecione o journal antes de remover ou alterar a condição. Mantenha o `<service-undefined>` KillMode=process, pois o exemplo do Nextcloud o utiliza, para que programas externos iniciados pelo cron possam continuar após o término do processo cron. A unidade de serviço não precisa de uma [Install]seção `<service-undefined>`.
Repare e ative o temporizador.
Criar /etc/systemd/system/nextcloudcron.timer. Este agendamento inicia cinco minutos após a inicialização e aguarda cinco minutos após cada ativação de serviço:
[Unit]
Description=Run Nextcloud cron.php every 5 minutes
[Timer]
OnBootSec=5 min
OnUnitActiveSec=5 min
Unit=nextcloudcron.service
[Install]
WantedBy=timers.target
Recarregue o systemd para que ele leia os arquivos de unidade e, em seguida, habilite e inicie o temporizador em um único comando:
sudo systemctl daemon-reload
sudo systemctl enable --now nextcloudcron.timer
Habilitar o serviço faz com que o temporizador inicie em inicializações futuras; --nowhabilitá-lo imediatamente o inicia. Não habilite o serviço em si como se fosse um temporizador recorrente. O temporizador é a unidade que pertence à seção `<interval>` timers.target. O manual atual do Nextcloud explica essas configurações de intervalo e o comando de ativação necessário; versões mais antigas do manual incluíam uma seção de instalação obsoleta para o serviço, portanto, siga o exemplo da unidade atual.
Rastreie uma execução perdida e verifique a correção.
Verifique o estado do temporizador e a próxima execução agendada:
systemctl status nextcloudcron.timer
systemctl list-timers nextcloudcron.timer
O cronômetro deve mostrar o status "aguardando" ou "ativo", e a lista deve exibir o próximo horário de ativação. Em seguida, verifique a última execução do serviço:
systemctl status nextcloudcron.service
journalctl -u nextcloudcron.service --since today
Um temporizador pode permanecer ativo mesmo quando cada execução do serviço falha, portanto, revise ambas as unidades. Se o serviço estiver ausente ou o systemd rejeitar o arquivo, execute ` systemd-analyze verify /etc/systemd/system/nextcloudcron.service /etc/systemd/system/nextcloudcron.timersystemctl get service`, corrija o problema de sintaxe ou caminho relatado e, em seguida, recarregue o systemd novamente. Se o serviço for encerrado sem sucesso, a saída do journal geralmente identifica um caminho PHP inválido, usuário incorreto, condição de falha ou erro de tempo de execução do Nextcloud. Se o temporizador não tiver uma próxima execução, verifique o nome exato do arquivo do temporizador, execute `systemctl get service` daemon-reloade confirme se ele foi ativado com `systemctl enable service` systemctl is-enabled nextcloudcron.timer.
Após a próxima ativação do temporizador, verifique novamente o status dos trabalhos em segundo plano do Nextcloud. Ele deve mostrar um horário de execução recente, em vez de um aviso de desatualização. Se o temporizador e o serviço relatarem execuções bem-sucedidas, mas a página de administração ainda parecer desatualizada, verifique os logs da instância e a versão do PHP usada pelo servidor web; o PHP da linha de comando pode ser diferente do ambiente de execução web. Esta configuração aborda o agendamento do systemd em um host Linux normal. Instalações em contêineres e appliances podem gerenciar o cron por meio de seu próprio supervisor de serviço; portanto, use o método compatível com a plataforma em vez de adicionar unidades de host que não podem acessar os arquivos do contêiner.