# Configurar e Gerir Cron Jobs

Source: https://support.kapsulehost.com/pt-pt/cron-jobs

Um trabalho cron executa um comando de acordo com um horário, em segundo plano, quer alguém esteja a visitar o seu site quer não. Este guia aborda a adição de um trabalho no KPanel, a escrita correta do horário e do comando para esta plataforma, a substituição do agendador integrado pouco fiável do WordPress e a localização da saída quando um trabalho não faz o que esperava.

## Onde Fica o Cron no KPanel

O cron pertence a um site, por isso acede-se a partir do site e não a partir do menu principal:

1. Inicie sessão no [KPanel](https://kpanel.kapsulehost.com) e clique em **Websites** na barra lateral esquerda.
2. Clique no site pretendido.
3. No menu do próprio site, abra **Definições** e depois **Cron**.

O endereço direto é `/websites/<site-id>/cron`. Verá uma tabela com os trabalhos existentes, ou um estado vazio se o site não tiver nenhum.

![A página Cron de um site no KPanel, listando os trabalhos agendados nesse site](https://support.kapsulehost.com/help/screenshots/cron-jobs.13aef775.webp)

## Adicionar um Trabalho

Clique em **Adicionar Tarefa Cron** no canto superior direito. O formulário tem três campos.

### Horário

Seis botões predefinidos preenchem a expressão por si:

| Botão | Expressão |
|---|---|
| A cada minuto | `* * * * *` |
| A cada 5 min | `*/5 * * * *` |
| A cada hora | `0 * * * *` |
| Diariamente 2AM | `0 2 * * *` |
| Semanalmente domingo | `0 2 * * 0` |
| Mensalmente 1º | `0 2 1 * *` |

Ou introduza a sua própria em **Expressão cron**. Os cinco campos, por ordem, são minuto, hora, dia do mês, mês, dia da semana:

```
minute  hour  day-of-month  month  day-of-week
```

- `0 3 * * *` executa às 3:00 todos os dias.
- `*/15 * * * *` executa a cada quinze minutos.
- `0 9 * * 1` executa às 9:00 todas as segundas-feiras.
- `30 1 1 * *` executa à 1:30 no dia um de cada mês.
- `0 */6 * * *` executa a cada seis horas, em ponto.

### Etiqueta

Um nome que reconhecerá mais tarde, como `WordPress cron` ou `Nightly stock sync`. É o que a tabela de trabalhos lhe mostra, por isso torne-o descritivo: `job 3` não ajuda ninguém às 2 da manhã.

### Comando

O comando de shell a executar. Clique em **Save** para criar o trabalho.

> **Warning:** Use caminhos completos. O cron executa com um ambiente mínimo e sem nenhum dos perfis da sua shell, por isso um `php` simples ou um diretório relativo que funciona quando está ligado por SSH falhará aqui silenciosamente. Escreva sempre o caminho completo.

## Escrever o Comando

Os trabalhos executam-se como o próprio utilizador de sistema do seu site, por isso o seu diretório pessoal é a âncora correta e `~` resolve-se corretamente. Os ficheiros do seu site encontram-se em:

```
~/htdocs/yourdomain.co.nz
```

Pode confirmar o caminho exato no separador **Definições**, depois **SFTP** do site, que o apresenta em **Ficheiros do site**.

Comandos típicos:

```
cd ~/htdocs/yourdomain.co.nz && /usr/bin/wp cron event run --due-now
```

```
cd ~/htdocs/yourdomain.co.nz && /usr/bin/php bin/send-queued-emails.php
```

```
/usr/bin/curl -fsS https://yourdomain.co.nz/api/nightly-report
```

> **Tip:** Teste o comando antes de o agendar. Cole-o na secção **WordPress**, depois **Console** do site se for um comando `wp`, ou execute-o por SSH. Um trabalho que nunca iria funcionar é muito mais fácil de detetar na linha de comandos do que às 3 da manhã num ficheiro de registo.

## Substituir o Agendador Integrado do WordPress

O WordPress vem com o seu próprio pseudo-agendador, o WP-Cron, que só é acionado quando alguém carrega uma página. Num site com pouco tráfego, as publicações agendadas saem atrasadas e os e-mails ficam em fila por enviar. Num site movimentado, cada visitante paga o custo de verificar o horário.

Um verdadeiro trabalho cron resolve ambos os problemas. O KPanel faz toda a substituição por si:

1. Abra o site e depois o separador **WordPress**.
2. Abra a secção **WP-Cron**.
3. Clique em **Ativar cron do sistema**.

Isso adiciona um horário que executa o WP-Cron a cada cinco minutos e define `DISABLE_WP_CRON` para que os carregamentos de página deixem também de o acionar. **Remover cron do sistema** no mesmo ecrã reverte ambas as partes.

Se preferir fazê-lo manualmente, são dois passos:

**Desativar a versão acionada por visitantes.** Adicione isto a `wp-config.php`, acima da linha `/* That's all, stop editing! */`, usando **Definições**, depois **Gestor de Ficheiros**:

```php
define( 'DISABLE_WP_CRON', true );
```

**Adicionar o trabalho real.** Em **Definições**, depois **Cron**:

- Horário: `*/5 * * * *`
- Etiqueta: `WordPress cron`
- Comando: `cd ~/htdocs/yourdomain.co.nz && /usr/bin/wp cron event run --due-now`

> **Warning:** Não salte a parte de `DISABLE_WP_CRON`. Com ambos a funcionar, qualquer tarefa agendada pode disparar duas vezes: e-mails duplicados, processamento de encomendas duplicado, cobranças duplicadas num plugin de subscrição. Use a ação de um clique na secção WP-Cron e isto nunca lhe acontecerá.

## WooCommerce e Filas em Segundo Plano

O WooCommerce usa uma fila em segundo plano para alterações de estado de encomendas, renovações de subscrições, e-mails e atualizações de stock. Depende do WP-Cron, pelo que é exatamente a carga de trabalho que sofre num site com pouco tráfego.

Uma vez implementado o horário real, a fila é processada a cada cinco minutos. Acompanhe isto em **WooCommerce**, depois **Status**, depois **Scheduled Actions** no wp-admin.

Uma loja de volume elevado pode passar para `*/2 * * * *`. Ir abaixo disso raramente ajuda: gasta-se mais tempo a iniciar processos do que a realizar trabalho. Consulte [Configurar o WooCommerce](https://support.kapsulehost.com/pt-pt/wordpress-woocommerce).

## Gerir Trabalhos Existentes

A tabela de trabalhos mostra **Label**, **Schedule**, **Command**, **Última execução** e **Status**, com duas ações em cada linha:

- **Disable** suspende um trabalho sem o eliminar, e transforma-se em **Enable** para o reativar. Use isto quando estiver a testar se um trabalho está a causar um problema.
- **Delete** remove-o permanentemente. Pedir-se-lhe-á confirmação, e as execuções agendadas param de imediato.

> **Important:** Eliminar um trabalho cron não pode ser desfeito. O horário é removido do servidor nesse mesmo momento. Se pretende apenas pará-lo temporariamente, use **Disable**.

## Encontrar a Saída

Todos os trabalhos criados pela KapsuleHost têm a sua saída capturada automaticamente. A saída padrão e os erros são adicionados a um ficheiro de registo num diretório `cron-logs` no diretório pessoal do utilizador do seu site, um ficheiro por trabalho.

Esse registo é a resposta a quase todas as perguntas do tipo "o meu trabalho executou-se?", porque regista o que o comando imprimiu e qualquer erro que tenha gerado.

Para o ler, ligue-se por SSH e procure em `~/cron-logs/`. O SSH usa autenticação por chave, por isso adicione primeiro a sua chave pública a partir do separador **Definições**, depois **Chaves SSH** do site: consulte [Adicionar Chaves SSH](https://support.kapsulehost.com/pt-pt/adding-ssh-keys).

> **Note:** As contas do Gestor de Ficheiros e do SFTP estão confinadas ao diretório do seu site, `~/htdocs/yourdomain.co.nz`, e `cron-logs` fica um nível acima. Isso é deliberado: mantém um contratado com acesso SFTP fora de tudo exceto do website. Use o SSH nativo para aceder aos registos, ou redirecione a saída para o diretório do seu site conforme mostrado abaixo.

Se preferir ter a saída algures onde o Gestor de Ficheiros a possa abrir, redirecione-a você mesmo:

```
cd ~/htdocs/yourdomain.co.nz && /usr/bin/wp cron event run --due-now >> ~/htdocs/yourdomain.co.nz/wp-content/cron.log 2>&1
```

`2>&1` envia os erros para o mesmo ficheiro que a saída normal. Sem isso, os erros não vão para lado nenhum.

> **Warning:** Tudo o que estiver dentro do diretório do seu site pode, em princípio, ser pedido através da web. Coloque um registo redirecionado em `wp-content` em vez da raiz do site, dê-lhe um nome que ninguém adivinharia, e elimine-o assim que terminar a depuração.

## Boas Práticas

- **Escalone os seus horários.** Seis trabalhos todos definidos para `0 2 * * *` iniciam-se todos ao mesmo tempo. Distribua-os: `0 2`, `10 2`, `20 2`.
- **Não use a cada minuto a menos que precise mesmo disso.** `*/5` é suficiente para quase tudo, incluindo WordPress e WooCommerce.
- **Mantenha os trabalhos curtos.** Um trabalho que demore mais tempo do que o seu intervalo irá sobrepor-se à execução seguinte.
- **Redirecione a saída de tudo o que seja ruidoso**, para que um trabalho verboso não encha o seu disco.
- **Reveja a lista ocasionalmente.** Trabalhos deixados para trás por um plugin que removeu continuam a executar-se.

## Resolução de Problemas

**O trabalho nunca parece executar-se.** Verifique primeiro o caminho. Abra o ficheiro de registo. Depois confirme se o estado é **Active** e não **Disabled**. Depois execute o mesmo comando por SSH e veja o que diz.

**"command not found" no registo.** Falta um caminho completo. Use `/usr/bin/php`, `/usr/bin/wp`, `/usr/bin/curl` em vez do nome simples.

**Permissão negada.** O trabalho executa-se como o utilizador de sistema do seu site. Esse utilizador precisa de ser proprietário, ou pelo menos conseguir ler, tudo o que o comando toca. Verifique as permissões em [Usar o Gestor de Ficheiros](https://support.kapsulehost.com/pt-pt/file-manager).

**As tarefas do WordPress continuam a executar-se atrasadas.** Confirme que ambas as partes da substituição estão em vigor: o horário existe em **Definições**, depois **Cron**, e `DISABLE_WP_CRON` está definido. A secção **WP-Cron** no separador **WordPress** mostra o estado atual de ambos.

**O trabalho executa-se mas o site fica lento enquanto o faz.** Mude-o para uma hora mais calma, ou divida o trabalho em lotes mais pequenos. O uso de recursos ao nível do site é visível em **Desempenho**: consulte [Melhorar a Velocidade do Website](https://support.kapsulehost.com/pt-pt/website-speed).

**Um trabalho deixou de funcionar depois de uma atualização de plugin.** O caminho do comando pode ter mudado. Verifique o registo e depois atualize o comando na tabela de trabalhos eliminando o trabalho antigo e adicionando um corrigido.
