Executando verificação de segurança...
37

⏰ CRON JOBS

O que são cron jobs?

O Cron Daemon é um utilitário embutido do Linux.
Esse cara ler o arquivo crontab (cron table) e executa comandos e scripts em tempos e/ou em intervalos predefinidos.

Muito comum em casos de geração de backup, atualização de ferramentas, entre outras possibilidades e o que mais você imaginar.

Um ótimo paralelo para os Cron Jobs é o seu alarme!

Como seu alarme funciona?

Bom, você define um horário específico, em um dia específico com ou sem repetição e, se tiver, você pode até especificar se é por semana ou em quais dias da semana exatamente.

Quando o alarme é criado e chega o dia D (dia e hora programado para acontecer), boooom, uma mágica acontece, seu smartphone simplesmente começa a tocar incansavelmente e você bate em todos os lugares de sua comoda tentando dormir um pouco mais e essa coisa zuadenta não para de tocar.

Bom, deu para entender.

No caso dos Crons Jobs, ao invés de tocar um alarme (o que é possível), ele executa literalmente qualquer comando que você tiver imaginação de criar.

O alarme do smartphone usa cron jobs por debaixo dos panos? (bonus)
de certa forma, você pode considerar que o sistema operacional Android utiliza algo semelhante aos cron jobs por baixo dos panos para agendar tarefas e executar processos em segundo plano. Embora não seja exatamente o mesmo mecanismo encontrado em sistemas Unix/Linux, que é onde o cron job é mais comum, o Android possui seu próprio sistema de agendamento de tarefas chamado AlarmManager.

O AlarmManager permite que os desenvolvedores programem a execução de tarefas em momentos específicos ou após determinados intervalos de tempo, mesmo quando o aplicativo não está em primeiro plano. Isso é usado para várias finalidades, como sincronização de dados, notificações agendadas, atualizações em segundo plano e outras tarefas que exigem execução em momentos específicos.

Portanto, embora o Android não utilize diretamente os cron jobs como em sistemas Unix/Linux, ele possui um mecanismo semelhante (AlarmManager) para agendar tarefas e executar processos em segundo plano.

Como funcionam?

Vamos lá!

Vamos começar com a CLI chamada de crontab:

Nosso primeiro passo será:

listar nossos Cron Jobs

que vou passar a chamar de agendamentos.

Para fazer isso, podemos executar o seguinte comando:

crontab -l

Caso você não tenha nenhum agendamento criado, você terá um output parecido com:

no crontab for <username>

Claro, só mudando o <username> para o usuário da sua máquina.

Caso você deseje especificar o usuário, você pode passar a flag -u com seu usuário, como por exemplo:

crontab -u <username> -l

Novamente, apenas mudando <username> para o nome do seu usuário.

Agora, caso você tenha algum agendamento criado, será listado mais ou menos dessa forma:

*/1 * * * * /path/to/script

Agora, queremos

criar um novo cron job (ou agendamento)

Para isso, podemos utilizar a mesma CLI e digitar:

crontab -u <username (opcional)> -e

após fazer isso, ele irá perguntar qual editor você deseja utilizar.

Caso você deseje utilizar um editor específico, você pode informar manualmente:

EDITOR=/usrbin/vim.basic crontab -e

Então, ele irá abrir seu editor.

Agora, precisamos entender como criar um novo cron job.

Existe uma Syntax bem simples para isso, na verdade:

* * * * * CMD
^ ^ ^ ^ ^
| | | | |     Valores permitidos
| | | | |     -------
| | | | ----- Dia da semana (0 - 7) (Domingo=0 até 7)
| | | ------- Mês (1 - 12)
| | --------- Dia do mês (1 - 31)
| ----------- Hora (0 - 23)
------------- Minuto (0 - 59)

Temos 6 coisas que devemos configurar, onde cada um desses asteriscos representa uma parte do agendamento, e esse CMD é onde fica o comando ou o script que você deseja executar.

Aqui está algo mais visual ainda sobre esses campos:

  1. Minuto de execução (vai de 0 até 59)
  2. Hora da execução (vai de 0 até 23)
  3. Dia do mês em que será executado (vai de 1 até 31)
  4. Mês em que será executado (vai de 1 até 12)
  5. Dia da semana (e.g. Segunda, Quarta, Domingo, ...) (vai de 0 até 7, começando por Domingo)
  6. O script ou comando que você quer executar.

Agora, se você quer criar um script que executa todo dia às 7:30 da manhã, você pode escrever:

30 7 * * * echo "Hora de acordar" >> /home/<username>/Desktop/logs

Informamos que será no minuto 30 na hora 7 no dia * (todos) no mês * (todos) e no dia da semana * (todos).

Então, já deu para entender que o asterisco significa "todos".

Para que servem?

Um caso de uso muito comum para esse cara, é a realização de backups.

Bom, eu tenho um background em segurança da informação (estou estudando muito o tema atualmente também), e durante alguns CTF's encontrei cron jobs que executavam um script como sudo e por sua vez esse script realizava um backup da máquina (sem contar o privesc rs).

Mas, ele pode ser utilizado para muitas outras coisas, um exemplo prático e pessoal é o que vou demonstrar abaixo.

Exemplo de uso pessoal

Eu gosto de ter meu sistema sempre atualizado com as últimas versões, uma forma de atualizar é utilizando o apt-get

Então, eu teria que executar um:

sudo apt-get update -y
sudo apt-get upgrade -y

sempre que quisesse atualizar.

Para automatizar isso, utilizei o cron jobs.

Como fiz?

Primeiro de tudo, entrei dentro de /etc e criei uma pasta chamada de cron.custom.

Dentro dessa pasta criei um arquivo (como sudo) chamado update-system.sh.

conteúdo do arquivo
sudo apt-get update -y
sudo apt-get upgrade -y

Então acessei o arquivo /etc/crontab utilizando o vim e criei um novo cron com os seguintes parâmetros:

0 0 * * * root /etc/cron.custom/update-system.sh

Isso significa que o script /etc/cron.custom/update-system.sh irá rodar todo santo dia às 0 horas e 0 minutos ou seja, meia noite.

é possível ver mais um carinha chamado de root que basicamente especifica o usuário que irá executar esse script.

Para nossa segurança, o usuário comum não deve ter permissões para editar o script de update

6

Uma excelente ferramenta que pode ser utilizada em conjunto é o crontab.guru. Com o auxílio desse recurso, torna-se conveniente obter informações sobre como programar a execução de tarefas em dias específicos da semana ou do mês, assim como a criação de jobs que são executados a cada intervalo de 30 minutos, por exemplo.

1
2
1
2

Não fazia ideia que os cron jobs funcionavam assim no linux.

Eu já tinha ouvido falar disso e até usei no meu projeto de tcc uma vez mas foi usando o framework nestjs. No frameork é possível criar importando um módulo de Schedule e depois usando um decorator chamado Cron, e recebe os parâmetros iguais explicados no post.

1

Siim!

Recentemente utilizei esse recurso do Nest.

É uma abstração tão alta que nem passa por nossa cabeça como funciona por debaixo dos panos né!

2
1

Agregou muito com esse post, eu pretendo criar backups automatizados para o meu sistema atual e era exatamente disso que eu precisava. agora oque me falta é arrumar uma forma de criptografar as informações antes de fazer o backup. Estava pesando em usar chaves Assimetricas AES.

2

Que bom que o post foi útil cara!

Bem interessante sua ideia de backup criptografado.

Se for postgres, por exemplo, acredito que ele não tenha algo que faça essa criptografia de forma automatica.

Provavelmente você vai precisar fazer o backup e ai criptografar.

Você poderia utilizar, por exemplo, o GNU PG ou o OpenSSL

1

Na empresa em que trabalho temos cron jobs para automatizar scripts de coleta de dados. É muito flexível e simples de usar.

Esse agendador de tarefas é infinitamente mais simples do que o agendador do Windows. Nesse caso, acredito que com o WSL é possível utilizá-lo como alternativa.

0
1
1

Só um detalhe meio bobo, o cron veio do Linux apesar de ter sido portado para o mesmo na realidade, o cron veio do Unix (herança nos BSD, MacOSX, Inferno, Plan9 ...) e o mesmo tem várias versões como o Dcron, Anacron,...

0
1
1

Bom, você pode criar um script para isso.

Primeiro ele faz a busca ai você alimenta os outros dois bancos de forma concorrente, por exemplo.