⏰ 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:
- 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
.
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