Como criar um cron job no linux

Como criar um cron job no linux
Photo by Agê Barros / Unsplash

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