Automatizando tarefas no GNU/Linux

Dentre as várias situações do dia a dia no trabalho, as rotinas executadas de forma repetitiva estão entre as mais exaustivas. Por exemplo, suponha que você tenha um serviço web que necessite enviar relatórios dos acessos dos usuários a cada 5 minutos, ou apenas precisa verificar a disponibilidade do serviço periodicamente. Com certeza, fazer esta atividade manualmente será bastante trabalhosa e na pior das hipóteses, você ainda pode esquecer.

Felizmente, quando tratamos de rotinas em administração de Sistemas GNU/Linux, um complemento fundamental para nossos scripts é a possibilidade de agendamento de tarefas (automatização). O Sistema conta com os serviços cron e crontab, que permitem a realização de tarefas periodicamente, em horários e dias pré-determinados por você.

A ideia deste artigo é exatamente servir de guia para que você possa automatizar seus scripts e outras rotinas, auxiliando nas atividades do dia a dia do trabalho.


O que é Cron e Crontab?

De uma maneira geral, esses dois serviços são os responsáveis pelo agendamento e execução de tarefas que o usuário espera que sejam executadas com certa periodicidade. 

Assim, a automatização de tarefas em sistemas GNU/Linux é feita por meio de destes recursos: crontab e cron. Além destes serviços, cada usuário possui um arquivo chamado crontab, que é o local onde são gravadas as regras que serão seguidas pelo cron. O arquivo crontab é editado pelo comando crontab.

O nome cron vem da palavra grega “chronos”, que significa “tempo”. A primeira versão do programa teve origem no sistema operacional Unix, no fim dos anos 70 como um experimento de universidade. Depois de diversas versões, o cron foi aprimorado, e hoje é incluído por padrão nos sistemas baseados em Unix, como as distribuições Linux, BSD e macOS.

cron funciona como um serviço do sistema operacional, um daemon — um processo em segundo plano que está sempre em execução. Ele é executado no momento da inicialização do sistema, e permanece ativo para executar as tarefas cron ou cron jobs que forem configurados.

Já o crontab é um arquivo que contém informações sobre quando um comando ou script deve ser executado e quem é o responsável pela ação. Trata-se de um arquivo de texto simples que tem um formato diferenciado para que o cron o entenda e trabalhe em sintonia com ele.

Em outras palavras, o arquivo Crontab seria uma agenda e o Cron, o dono dessa agenda que verifica minuto a minuto se há alguma tarefa à ser executada.


Formato do arquivo crontab

Uma linha do arquivo crontab possui o seguinte formato:

Para entender melhor esse exemplo, vamos ver o que cada parte do comando representa para a tarefa cron:

  • 0 – indica que o cron job será executado no minuto 0
  • 6 – indica que o cron job será executado na hora 6
  • * – indica que o cron job será executado do primeiro ao último dia do mês
  • * – indica que o cron job será executado do primeiro ao último mês
  • * – indica que o cron job será executado do primeiro ao último dia da semana
  • comando – é o comando a ser executado pelo cron job

Os cinco primeiros campos determinam a periodicidade de execução do comando. Abaixo segue uma explicação do significado de cada um destes campos:

CampoSignificadoValores
1Minutos0 a 59
2Hora0 a 23
3Dia do mês1 a 31
4Mês1 a 12
5Dia da semana0 a 7, sendo que os números 0 e 7 indicam o domingo
6Comando a ser executadoqualquer comando válido do sistema

Os dias da semana podem também ser indicados por sua abreviação: sun, mon, tue, wed, thu, fri, sat.

Isto é o básico, mas o aplicativo cron oferece mais alguns recursos muito úteis para facilitar ainda mais, são atalhos especiais para formatar o cron job. A tabela abaixo relaciona mais alguns parâmetros que podemos usar na crontab com seu significado:

Atalho especialSignificadoEquivale
@rebootExecuta somente uma vez na inicialização do sistema
@yearlyExecuta uma vez no ano0 0 1 1 *
@annuallyO mesmo que @yearly0 0 1 1 *
@monthlyExecuta uma vez por mês0 0 1 * *
@dailyExecuta uma vez por dia0 0 * * *
@midnightO mesmo que @daily0 0 * * *
@hourlyExecuta uma vez por hora0 * * * *

A diretiva @reboot é particularmente útil, pois em cada sistema nós temos tarefas que precisam ser executadas na inicialização da máquina e este parâmetro é um atalho muito conveniente para representar estas atividades.

A fim de utilizar estes atalhos especiais, bastam dois campos: o parâmetro em si e o comando. Por exemplo, para executar o backup do banco de dados diariamente, acrescente a seguinte linha ao arquivo crontab:

Neste caso, o script db_backup.sh deve ser criado pelo administrador com as diretivas apropriadas para o backup do banco de dados.

Uma informação bastante importante que não deve ser esquecida. Se o seu computador estiver desligado no horário da execução do comando, o cron não fará um novo agendamento, ou seja, esta situação deverá ser tratada manualmente. A única exceção é a diretiva @reboot, que faz com que o comando especificado seja executado quanto a máquina for ligada.


Gerenciando cron jobs (edição do crontab)

Agora que você já conhece o formato e estrutura básica de um cron job, precisamos apenas editá-lo. O próximo passo é saber como configurar a sua execução pelo cron. É nessa parte que entra o arquivo crontab, que permite o gerenciamento das tabelas em que ficam os cron jobs.

Em outras palavras, a partir do crontab você consegue adicionar, remover, editar e listar os cron jobs.

O crontab é bastante útil para gerenciar as tarefas cron sem ter que modificar arquivos do sistema. Isso ocorre porque normalmente o crontab gerencia somente as tarefas cron do próprio usuário e não do sistema como um todo. Os arquivos crontab dos usuários são gravados no diretório /var/spool/cron/crontabs.

É muito fácil adicionar tarefas cron usando o crontab. Basicamente, existem 3 comandos que você precisa saber:

  • crontab -e – esse é o comando mais importante, usado para editar a tabela cron.
  • crontab -l – esse é o comando usado para listar a tabela cron e suas tarefas.
  • crontab -r – esse comando é usado para remover a tabela cron do usuário.
crontab-help
comando: crontab –help
crontab-edition
comando: crontab -e

Conforme pode ver na imagem acima, ao usar o comando crontab -e, pela primeira vez, você vai receber a opção de selecionar um editor de texto para editar a tabela cron. Por padrão, é recomendado que você utilize o editor nano, que é um editor de texto com interface em terminal mais fácil de usar. Mas, você poderá utilizar o que for de sua preferência.

Dica: para mudar editor basta modificar ou remover o arquivo .selected_editor que está no diretório de usuário, ou digitar “export EDITOR=”nome do editor que você quer usar” antes de usar o comando crontab -e.

Depois de selecionar o editor, você vai visualizar o arquivo com os cron jobs atuais. Porém, se for a primeira vez que você estiver executando o comando, o arquivo vai apresentar as instruções de formato de um cron job, que vimos previamente, na imagem abaixo.

Arquivo de instruções cron job

Nota: as linhas que iniciam com “#” são somente instruções de uso do crontab e não comandos. Se preferir, pode até excluir estas linhas.

Agora, basta adicionar o cron job na última linha e salvar o arquivo para aplicar as modificações na crontab. Pronto, tarefa cron foi adicionada à crontab e será executada de acordo com a programação feita por você.

Abaixo seguem alguns exemplos de comandos agendados:

comando: crontab -l

Quando criada com a crontab, a tabela com as tarefas cron é armazenada em /var/spool/cron/crontabs/usuário

Em todo o caso, mesmo se você tiver acesso root, é recomendado a utilização do crontab. Mas, se você quiser criar um cron job para ser executado como uma tarefa do sistema, será necessário modificar manualmente nos diretórios /etc/cron.d ou /etc/cron.{hourly|daily|weekly|monthly}, ou na tabela /etc/crontab.


Ferramentas online para apoio

Existem outras ferramentas visuais online, que poderão facilitar na criação dos cron jobs.

Esta é uma maneira bastante prática para compreender melhor o funcionando tanto do crontab quanto de cron jobs. Além de visualizar o significado de cada expressão da tarefa, é possível ver as datas em que o cron vai executar as tarefas e confirmar se o cron job está de acordo com o esperado.


Verificando o funcionamento do cron

Assim como qualquer outro trabalho, não basta configurar e colocar o comando na crontab e “esquecer da vida”, é necessário gerar alertas ou verificar a saída gerada pelo arquivo para ver se tudo está funcionando. Sendo assim, depois de adicionar a tarefa cron à tabela cron, é importante checar se ela está sendo executada conforme esperado. Através da análise destas mensagens, podemos decidir o que fazer.

Por padrão, o crontab envia uma mensagem de e-mail com a saída do comando executado. Mas, este recurso só é efetivo, se o computador onde foi configurado a crontab, possui algum servidor de e-mails ativo. Caso positivo, você pode definir o endereço de e-mail adicionando a seguinte linha no topo da tabela cron:

crontab-mailto
Arquivo crontab, diretiva MAILTO

Uma boa alternativa à opção de e-mail (quando esta não for possível), é a possibilidade de definir um arquivo de logs para registrar a saída dos comandos. Para fazer isso, basta adicionar adicionar o sufixo exibido na imagem após a tarefa:

crontab-logs
Arquivo crontabs, contendo diretiva para logs

Nota: “/var/log/log_crontab.log” é caminho completo com o arquivo onde deseja salvar os logs.

A vantagem dos logs é que toda vez que uma tarefa for executada, um registro de sua saída será adicionada no arquivo que você especificar, no caso do exemplo acima o arquivo “/var/log/log_crontab.log“.

Alternativamente, você também pode utilizar o log do próprio sistema para verificar o funcionamento das cron jobs. Porém, é necessário conhecer as tarefas já existentes, para facilitar a leitura dos registros do arquivo “/var/log/syslog“. Uma forma de filtrar apenas saídas do cron do sistema é o comando abaixo com permissão de administrador:

Confira um exemplo da saída do comando acima:

comando: grep CRON /var/log/syslog

Há um problema comum na utilização do crontab, que ocorre devido às variáveis de ambiente usadas pelo cron, que são diferentes das variáveis do usuário. Para contornar essa situação, basta adicionar as variáveis de ambiente modificadas no topo do arquivo da tabela.

Por exemplo, se você quer que o cron use bash no lugar do sh, basta incluir a linha abaixo no topo do arquivo:

Também é válido conferira variável do ambiente PATH, que também é diferente para o cron. Por isso, sempre coloque o caminho completo do comando, visto que a variável PATH da execução do comando via cron é diferente daquela do seu ambiente. Por exemplo, ao invés de digitar apenas o comando “ping” informe “/bin/ping”.

Arquivo crontab

Erros de digitação no crontab

Caso durante a digitação você o preenchimento correto, não se preocupe. Pode ficar tranquilo, sempre que você gravar a crontab, se houver algum erro de sintaxe, o sistema te avisa, não grava as alterações e te pergunta se você quer refazer a edição:

crontab-erro
Mensagem quando há erro de sintaxe no preenchimento do crontab

Conclusão

Os recursos do cron, com certeza não se limitam aos mostrados anteriormente neste artigo, unindo a programação de scripts em qualquer linguagem e o que se pode fazer, praticamente não terá limites. Você pode ainda agendar tarefas mais complexas e poupar muito trabalho nessas execuções automáticas.

Uma boa dica para lidar com o cron é testá-lo.

Experimente-o bastante. E mesmo que você seja apenas um usuário doméstico, certamente encontrará alguma utilidade para o cron. Cron e crontab são ferramentas poderosas que podem poupar bastante tempo de trabalho. Por isso, experimente as ferramentas, use um gerador de cron e teste seus comandos. Saber como usar essas ferramentas é essencial para automatizar operações em sistemas Linux.

Pronto, agora você já sabe como agendar tarefas com cron no GNU/Linux usando o crontab. Mas não se esqueça de testar e verificar seus cron jobs antes de colocá-los no seu servidor.


Viu algum erro ou gostaria de adicionar alguma sugestão a essa ou outra matéria? Colabore, clique aqui.


Fonte:

Manuais:

  • man crontab, para saber mais sobre o comando crontab
  • man 5 crontab, para saber mais sobre o formato do arquivo crontab
  • man cron, para saber mais sobre o comando cron

Internet:

Andre H O Santos

Pentester, Especialista em Segurança de Redes e Testes de Invasão, Programador, Consultor e Professor de T.I.. Geek Inveterado, Apaixonado por Segurança da Informação e Louco por GNU/Linux. Dedica grande parte do seu tempo para criar soluções que ajudem dezenas de milhares de pessoas com dicas e artigos em Tecnologia e Segurança da Informação. Possui algumas Certificações em Ethical Hacking, Cabling System, Security+, SIEM Netwitness, SIEM SNYPR Securonix e Proficiência em Soluções de Vulnerability Management da Tenable.

Você pode gostar...

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

thirteen + 9 =