Como criar um cron job no linux
Nesta postagem vamos aprender a criar um cronjob no linux. Vamos criar uma tarefa agendada para fazer uma chamada a cada 1 minuto executar uma requisição http em uma URL.
Devemos primeiro listar todas as tarefa agendadas atualmente configuradas para o nosso usuário. Para isso basta digitar o comando:
sudo crontab -l
Isso vai listar todos as tarefas agendadas para o seu usuário. No meu caso como eu não possuo nenhum job configurado, então a saída é a seguinte:
no crontab for root
Agora vamos configurar a nossa tarefa agendada.
Para isso basta digitar:
sudo crontab -e
Este comando vai abrir a nossa lista de tarefas agendadas e assim podemos adicionar uma nova entrada nesta lista. Para adicionar uma nova entrada, ela deve estar no formato <padrão-do-temporizador> <comando-a-executar>
. Conforme exemplificado abaixo:

Mas qual é este padrão do temporizador?
Sintaxe do temporizador do cron
Esta é uma referência rápida à sintaxe do cron e também mostra as opções suportadas pelo node-cron.
┌──────────── minuto
| ┌────────── hora
| | ┌──────── dia do mês
│ │ │ ┌────── mês
│ │ │ │ ┌──── dia da semana
│ │ │ │ │
│ │ │ │ │
* * * * *
Ou pode utilizar alguma ferramenta para ajudar a montar a expressão do cronjob.
Para descobrir um padrão válido geralmente eu utilizo o crontab guru lá podemos entender melhor como funciona este padrão, e possui alguns exemplos de expressões mais comuns.
Um exemplo prático
Para fazer uma chamada a um endpoint a cada um minuto, devemos portando adicionar uma nova entrada no crontab.
Para fazer essa chamada do endpoint vamos utilizar o CURL
desta forma temos:
sudo crontab -e
Depois no prompt que se abriu basta colocar a seguinte expressão:
* * * * * curl http://localhost:3000/
Depois basta salvar este arquivo, e se tiver tudo certo você vai começar a ver as chamadas sendo executadas neste endpoint, a cada 1 minuto.
Para o caso acima o que fizemos é utilizar um comando de shell, porém se desejarmos podemos chamar por exemplo, um script em javascript. Para isso é necessário que seja criado um arquivo e que esse arquivo possua um hashbang na primeira linha do arquivo, informando qual binário responsável por executar o comando. Segue um exemplo equivalente ao que fizemos com o curl só que agora utilizando o Javascript.
#!/usr/bin/env node
const URL = 'http://localhost:3000';
try {
fetch(URL)
.then((response) => {
if (!response.ok) {
throw new Error(`HTTP error! Status: ${ response.status }`);
}
return response;
})
.then((response) => {
console.log(response);
});
} catch (err) {
console.log(`Houve um erro ao fazer requisição. Detalhe: ${err}`)
}
Repare a primeira linha do arquivo, em que eu deixo claro como este arquivo deve ser manipulado.
Depois para executar este javascript em meu cron, basta que eu faça o seguinte configuração do meu cron.
* * * * * node /home/<diretório-para-arquivo>/test.js
Outra coisa para notar é que neste exemplo estou utilizando a api de fetch do v8 que só foi introduzido no nodejs na versão 18.0.0 por padrão (não experimental) então se não conseguir executar com sucesso, atualize a versão do seu nodejs para uma versão que possui suporte, ou adapte o exemplo acima para utilizar alguma lib de terceiros (axios, jquery, requests etc). Para instalar a dependência será necessário utilizar o comando npm install