O que são cron jobs? Vantagens e desvantagens
Na vida real, no mundo físico, pessoas e empresas têm que realizar tarefas repetitivas com determinadas frequências.
Algumas delas por fazerem parte de nossas rotinas, tornam-se habituais e automáticas. Para outras, menos frequentes, usamos lembretes, agendas e recursos que ajudam-nos a lembrar delas.
Em informática, esse cenário também acontece e algumas vezes, a execução precisa e exata, é um ponto ainda mais crucial do que no mundo real, como por exemplo, a execução de uma rotina de backup de um importante banco de dados da empresa.
Para resolver demandas como essa, há um recurso nativo dos sistemas baseados no Unix, que é fundamental – os cron jobs! Vamos falar a respeito?
O que são cron jobs?
Cron jobs ou tarefas agendadas, como é usado em português pelo pessoal do meio, ou ainda tarefas cron, em uma mistura menos comum do inglês e português, consiste de um recurso presente nos sistemas operacionais baseados no Unix, como é o caso das diferentes distribuições Linux.
Mais do que um recurso, o cron é um daemon, que por sua vez é formado pelo conjunto de programas ou serviços que funcionam em background (segundo plano), sem estarem vinculados a um usuário, nem mesmo ao root (administrador) e que não dependem deles (usuários) para serem iniciados.
Na verdade, um daemon é a primeira coisa carregada nos sistemas Unix, sendo que no caso do Linux e dependendo da distribuição, pode ser o init (FreeBSD), o init.d (Ubuntu), o systemd (Debian), ou o launchd (Mac OS X).
Logo que é inicializado o sistema operacional, o primeiro daemon é carregado, tanto que na lista de PIDs (proccess identification) do sistema operacional, cada um desses daemons sempre será 1, por ser o primeiro iniciado.
De modo prático e sintético, um daemon tem o papel de controlar serviços, programas, hardware, etc.
Ele inicializa, encerra e monitora tudo que acontece no sistema operacional.
Há daemons para tudo, incluindo o cron, que permite estabelecer o momento exato e a frequência com que determinadas coisas aconteçam, mais precisamente comandos sejam executados, sem que haja intervenção direta de um usuário ou administrador para que tais ações ocorram.
Na verdade, há intervenção pelo menos uma vez, quando a tarefa agendada é criada. A partir daí, sempre será executada de acordo com os parâmetros estipulados na sua criação.
Como usar cron jobs?
Utilizar uma tarefa cron, é bastante simples.
Para não depender de painéis de controle, o modo mais simples, é via terminal e linha de comando e que no caso de uma conta de hospedagem, um VPS ou mesmo um servidor dedicado, é feito usando o SSH.
Em geral, ao digitar no terminal “crontab -e”, para sistemas Linux, automaticamente a lista de tarefas agendadas do usuário logado, será exibida em modo de edição, ou seja, permite que sejam removidas, alteradas ou incluídas novas tarefas.
Quando um usuário tem privilégios sobre outros, como é o caso do usuário root (administrador), é possível incluir o usuário cujas tarefas agendadas se quer editar, através da seguinte linha de comando:
crontab -u usuario -e
Se não houver nenhuma tarefa agendada para o usuário em questão, um arquivo crontab (cron table) vazio será aberto.
Abaixo, uma linha típica de uma tarefa agendada, segundo a qual um shell script localizado em /home/seuusuario e de nome backup.sh, é executado todos os dias às 23:59h:
59 23 * * * /home/seuusuario/backup.sh
Eis os elementos que compõem uma linha de cron job:
# ┌────────────── minutos (0-59)
# │ ┌──────────── horas (0-23)
# │ │ ┌────────── dia do mês (1-31)
# │ │ │ ┌──────── mês (1-12)
# │ │ │ │ ┌────── dia da semana (0-6, sendo 0=domingo; 6=sábado)
# │ │ │ │ │
# │ │ │ │ │
# * * * * * comando a ser executado
Ler e interpretar uma linha correspondente a um cron, significa observar os parâmetros usados nas cinco primeiras posições e que devem ser separadas por espaços em branco e que determinam quando e com que frequência o comando a seguir deve ser executado.
O asterisco quando usado na posição correspondente, significa que toda unidade (minuto, hora, dia, mês, dia da semana) deve ser considerada para execução do comando.
A primeira posição, indica os minutos e, portanto, assume valores entre 0 e 59.
Quando um asterisco consta na primeira posição, então a execução deve ocorrer a cada minuto. No exemplo a seguir, um shell script exemplo, deve rodar a cada 30 minutos (hora e hora e meia), todas as horas, do dia primeiro de todos os meses, independente do dia da semana.
0,30 * 1 * * /home/seuusuario/exemplo.sh
A segunda posição, refere-se ao parâmetro de hora. No exemplo a seguir, um shell script exemplo, deve ser executado, todos os minutos, entre 15:00h e 15:59h, do décimo dia de todos os meses, independente do dia da semana.
* 15 10 * * /home/seuusuario/exemplo.sh
Os mais observadores, notaram pelos dois exemplos anteriores, que o terceiro parâmetro, refere-se ao dia do mês. No próximo exemplo, o nosso shell script deverá ser executado nos dias 10 e 20 de todos os meses, precisamente às 23:10h e 23:50h, independente do dia da semana.
10,50 23 10,20 * /home/seuusuario/exemplo.sh
O quarto parâmetro, é o que especifica o mês e sendo assim, no próximo exemplo, o script deverá ser executado no último minuto, do último dia do ano, não importando o dia da semana.
59 23 31 12 * /home/seuusuario/exemplo.sh
Por fim, o último parâmetro é relativo aos dias da semana. Em nosso último exemplo, o shell script deve ser executado todo sábado, passados 5 minutos de todas as horas entre 00:00 e 06:00h, independente do dia e do mês em questão.
5 0-6 * * 6 /home/seuusuario/exemplo.sh
Por todos os exemplos acima, também é possível deduzir que é possível ter mais de um valor para cada parâmetro e nesses casos, separam-se cada um deles, por uma vírgula.
A outra dedução aparente, é que intervalos podem ser usados, usando o valor inicial e final do intervalo, separados por um “-” (hífen), como é o caso do último exemplo.
Se você tem dificuldades para determinar os parâmetros exatos a ser usados em uma situação específica, o Crontab Guru contém uma ampla lista de situações de momentos e frequências para realização de eventos cron.
É uma boa prática incluir linhas de comentário antes de cada linha de tarefa cron, explicando de modo suscinto o que a tarefa a seguir faz, especialmente quando se tem muitas linhas no arquivo.
Inicia-se a linha de comentário, usando o “#” (tralha, hash ou “jogo da velha”), o que indica ao sistema que o que vem a seguir é comentário e, portanto, desconsiderado desconsiderado pelo sistema, não importando o seu conteúdo.
Vantagens do uso de cron jobs
Naturalmente, por tudo que vimos até aqui, as principais vantagens já estão aparentes para a maioria. Mas a fim de que não fiquem dúvidas, vamos listar e comentar as principais:
-
Automatização – essa é a vantagem mais aparente e o grande trunfo de uma cron job. Se ela não existisse, muito do que compreende o trabalho de administração de um servidor ou mesmo de uma simples estação de trabalho, teria que ser feito manualmente;
-
Organização / administração – essa é uma consequência imediata da automatização de tarefas que uma tarefa agendada acarreta. Toda ação recorrente, mais ou menos frequente, pode ser incluída em uma tarefa cron, tornando a administração do ambiente mais organizada e simples;
-
Controle – um administrador de servidor de hospedagem, por exemplo, pode ele mesmo controlar as tarefas de cada usuário ou contar com scripts que rodam a intervalos regulares e que fazem o controle e monitoramento dos crons de cada usuário. Além disso, usando o próprio conceito de daemon, que é de controlar e monitorar outros processos e serviços do ambiente, é possível realizar ações objetivando iniciar ou reiniciar serviços, interromper outros, efetuar limpezas e praticamente qualquer ação que se deseje, em momentos bem específicos;
-
Precisão – a garantia de executar ações nos momentos exatos que sejam necessários, como por exemplo, o horário preciso da execução de uma rotina de backup ou de uma atualização;
-
Segurança – como decorrência de boa parte das vantagens acima, um sistema bem pensado em termos de tarefas críticas, tende a ser mais seguro, bem como ações fundamentais ao bom funcionamento do ambiente, podem ser previamente programadas, independentemente da presença e atividade de um administrador.
Desvantagens do uso de cron jobs
E se você é daqueles que se surpreende e acha que algo tão maravilhoso não pode ter o lado ruim, não se assuste, mas tem.
É importante que fique claro que o recurso em si não traz problemas, mas a forma como pode ser usado, pode trazer consequências severas em condições mais extremas.
A maior parte dos possíveis problemas, vêm do uso abusivo e incorreto, principalmente em servidores de hospedagem compartilhada, onde por vezes há um grande número de usuários e pelo fato de que nem todos estão familiarizados com a sua implantação e nas consequências que o uso incorreto pode trazer.
-
Sobrecarga – especialmente nos ambientes com muitos usuários e em que muitos deles tenham grandes quantidades de tarefas agendadas. ocorrendo em intervalos muito pequenos (todos os minutos, de todas as horas e em todos os dias), o número de processos gerados pode ser muito grande, alocando muita memória e/ou processos do PHP, MySQL e outros serviços do servidor;
-
Lentidão – o acumulo de processos decorrente do item acima, tem outra consequência imediata que é a lentidão do servidor. Mas ela não é gerada apenas por excesso de processos, mas por processos que por si só geram muita demanda por processamento, como ao executar alguma rotina com loop infinito, por exemplo. Esse é um caso típico de execução de scripts ou comandos inadequados ao ambiente;
-
Inodes – por padrão, cada script ou comando executado, gera automaticamente uma mensagem de e-mail enviada para a conta padrão do usuário e que se não forem limpas a intervalos regulares, podem produzir uma grande quantidade de inodes, ao ponto de impedir que dados sejam gravados no servidor, mesmo havendo espaço disponível em suas unidades de armazenamento em disco.
Conclusão
Cron jobs ou tarefas agendadas, constituem um importante recurso dos sistemas operacionais baseados no Unix, facilitanto a administração, o controle, a segurança, entre outros aspectos de um servidor.