⏰ 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 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:
- Minuto de execução (vai de 0 até 59)
- Hora da execução (vai de 0 até 23)
- Dia do mês em que será executado (vai de 1 até 31)
- Mês em que será executado (vai de 1 até 12)
- Dia da semana (e.g. Segunda, Quarta, Domingo, ...) (vai de 0 até 7, começando por Domingo)
- 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
.
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
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.
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.
Muito massa o conteúdo @DevOne adicionalmente é muito bom monitorar a execução de seus jobs.
tem um post bem legal sobre isso aqui.
https://www.tabnews.com.br/RafaelMesquita/9-ferramentas-de-monitoramento-de-cron-job
Boa introdução ao assunto. Cronjobs realmente ajudam demais.
Existem alguns sites que ajudam a montar os comandos, o que é uma mão na roda pra quem não tem muita experiência.
Dica de um dos sites: https://crontab.guru/
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.
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.
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,...
Alguém sabe de uma forma para fazer uma busca em um banco e alimentar outro banco atlas e consequentemente um banco local?