Como agendar a execução de um programa no Linux

Muitas vezes necessitamos criar programas que precisam ser executados em um determinado momento do tempo, seja com intervalo semanal, mensal, diário ou até mesmo sem periodicidade.

Digamos, a fim de exemplo, que você leitor, partindo de um dispositivo com Linux embarcado, precise emitir um relatório e ligar uma lâmpada paralelamente, indicando que seu dispositivo está processando o relatório hipotético, com a emissão do relatório ocorrendo durante as noites de quintas e terças-feiras.

Vamos ignorar a emissão do relatório, consideremos que esta feature já está implementada e que basta somente desenvolver a lógica para executar o software nos períodos propostos e ligar o LED. Podemos pensar em algumas abordagens para lidar com desafio, alguns exemplos são:

  • Uso de RTC;
  • Uso da tecnologia NTP;
  • Uso de timers.

Todas as maneiras citadas acima requerem codificação extra, ou seja, é necessário codificar um programa para verificar a data e horário e assim executar nosso software de emissão do relatório. Entretanto, é possível realizar agendamento de tarefas de forma robusta com o utilitário cron, sendo esta uma opção que não demanda a criação de nenhum código extra, bastando apenas criar simples cron jobs.

Com a problemática e abordagem definidas, pode-se determinar que o objetivo desse artigo é mostrar como tirar proveito do cron, agendando tarefas ou cron jobs.  Por razões didáticas, simplificaremos a situação utilizando um dispositivo Linux embarcado, no caso uma Beaglebone Green a qual deverá ligar um led durante o período definido.

Cron: Como agendar a execução de um programa no Linux
Figura 2 – Hardware utilizado – Fonte: Autoria Própria, 2022

Requisitos

    Este artigo é destinado a todas as pessoas que tenham contato ou interesse em trabalhar com Linux e criar automações. Entretanto, é recomendando principalmente para a execução da parte prática, que o leitor tenha conhecimentos nos seguintes assuntos:

  • Básico em Linux;
  • Básico em manipulação do terminal do Linux;
  • Básico em python.

Conhecendo o cron

O cron é daemon incorporado em grande parte dos sistemas derivados do Unix, trata-se de um utilitário que permite o agendamento de tarefas. O cron é iniciado automaticamente por meio do daemon init.d , não sendo necessário se preocupar com sua inicialização.

Sobre o funcionamento, o cron verifica periodicamente em diretórios específicos por arquivos de textos com instruções que devem ser executados pelo utilitário, os denominados Crontab.  Existem variações acerca dos diretórios verificados, o que depende do sistema operacional utilizado e a versão do cron adotado pelo SO

Crontabs e sua sintaxe

Crontab trata-se do arquivo no qual as tarefas (cron jobs) são escritos. Existe toda uma sintaxe própria para o registro de trabalhos, nos próximos parágrafos abordaremos as principais sintaxes.

Basicamente a sintaxe de um cronjob é composta por 5 espaços para configuração do momento de execução seguido pelo comando a ser executado. Cada um dos espaços na configuração do momento de execução contém um significado, os quais podem ser vistos no quadro abaixo.

Na prática, os espaços representados por asterisco devem ser substituídos por algarismos numéricos de acordo com o agendamento desejado, por exemplo, gostaríamos de executar o arquivo log.py todos os dias às 15:25:

25  15  *  *  *   python3 /debian/home/log.py

Apenas o uso de algarismos não compreende todas as funções do cron, existem também caracteres reservados para comportamentos específicos. A relação de caracteres é apresentada abaixo.

CaractereSignificadoAplicável em
,Define dois ou mais horários de agendamentoTodos os campos
Determina um intervalo entre os valoresTodos os campos
/Cria “passos” ou intervalos de tempo pré-definidosTodos os campos
LPossui a função de determinar o último dia da semana ou o último dia do mês a ser executadoDia da semana;Dia do mês.
WPossui a função de indicar o dia da semana (dia útil) mais próximo do valor indicadoDia do mês
#Indica um dia da semana, seguindo uma determinada ordem de ocorrência no mês, por exemplo: 4#3 indica a 3º quinta-feira do mês.Dia da semana;
?Indica que o valor não é especificadoDia da semana;Dia do mês.

Exemplos de sintaxe para Cron Jobs

Abaixo são apresentados exemplos da sintaxe utilizada para criação de cron jobs.

Executar todos os dias às 04:20

20 04 * * ?

Executar a cada três dias partindo do primeiro dia do mês às 11:15

15 11 1/3 * ?

Executa a cada minuto iniciando as 14:00 e terminando às 14:05

0-5 14 * * ?

Editando crontabs

Para editar o crontab do usuário logado, digite no terminal:

Caso seja a primeira vez que você edita um arquivo crontab, é provável que o sistema solicite para você escolher um editor de texto para abrir o arquivo.

Desenvolvimento prático com Cron

Chegou o momento de partimos para a prática, como descrito no início desse artigo, foi utilizado uma Beaglebone Green com uma imagem Debian instalada para o desenvolvimento deste artigo. É interessante mencionar que o procedimento exposto aqui é válido para a maioria das distribuições Linux (com exceção aos acionamentos de GPIOs).

Apenas recapitulando, o objetivo da etapa prática é executar uma simples aplicação que ligue um LED nas noites de quinta e terça-feira durante o horário das 19:00 às 00:00. Para atender nosso objetivo, utilizaremos dois cron jobs sendo um para acionar o LED e o outro terá a função de desativá-lo.

A aplicação responsável por controlar o LED foi desenvolvido em python e você pode encontrá-la aqui .

Antes de abordarmos o script desenvolvido, devemos confirmar se horário na Beaglebone está correto, para isso digite no terminal o seguinte comando:

Após inserção do comando, você deverá visualizar uma mensagem mostrando o horário do sistema, a mensagem deve ser semelhante à imagem exibida abaixo:

Figura 3 – Data do sistema – Fonte: Autoria Própria, 2022

Caso você perceba que o horário esteja incorreto devido a configuração de fuso horário (time zones), recomendo a leitura desse artigo .

Na Beaglebone, utilizaremos o Pino 8 do Conector P8 para acionar o LED, abaixo é possível verificar o esquema elétrico da aplicação.

Cron: Como agendar a execução de um programa no Linux
Figura 4 – Diagrama de conexões – Fonte: Autoria Própria, 2022

Com a placa devidamente conectada ao LED, devemos fazer a codificação do script python. O código é apresentado logo abaixo.

O script utilizado é bem simples, temos uma função principal (main) a qual verifica se o argumento “led” foi enviado no comando de execução e de acordo com o valor fornecido ao argumento o LED é ligado ou desligado. O comando “on” deve ser enviado para ligar e o comando “off” para desligar o LED. Abaixo são apresentados exemplos para controle do LED.

Ligar LED:

Desligar LED:

O controle dos pinos é realizado por meio da biblioteca Adafruit_BBIO. Portanto é necessário instalar a biblioteca, você pode procurar a biblioteca diretamente no pip se desejar, ou pode instalar por meio do arquivo requirements.txt presente no repositório. O quadro abaixo apresenta a instalação via requirements.txt, lembrando que o terminal deverá estar apontado para o diretório no qual o repositório foi baixado.

Com o script devidamente explicado, chegou o momento de criar nossos cron jobs. Abra o terminal e digite o comando abaixo para abrir o arquivo crontab.

Após a execução do comando, você deverá ver uma tela semelhante a essa.

Cron: Como agendar a execução de um programa no Linux
Figura 5 – Crontab – Fonte: Autoria Própria, 2022

Vamos inserir a regra para acionamento do led, insira o seguinte texto na última linha do arquivo crontab.

No meu caso, o script está na pasta chamada “cron-article” a qual foi criada em /home/debian , com o comando ficando da seguinte forma.

Fazendo uma explicação acerca do cron job inserido, temos os valores “0 19 * * 2,3” indicando que a tarefa deve ser executada às 19:00 de todas as terças e quintas-feiras. A próxima etapa da instrução é composta com o comando python3, indicando que queremos executar um script python. Dando sequência, a próxima informação diz respeito ao caminho onde encontra-se o script que desejamos executar. Por fim, é enviado o argumento led.

A próxima etapa é inserir o cron job responsável por desligar o LED no horário estipulado. O comando é similar ao anterior, com modificações na data e argumento de envio, o segundo cron job fica da seguinte forma.

Com o comando exposto, vale mencionar que como desejamos executar esse cron job à meia-noite, deve-se ajustá-lo para ser executado nas quartas e sextas-feiras, pois se mantivermos as datas de terça e quinta feira o LED seria apagado apenas a meia noite de terça e quinta feira.

Após cadastrar os cron jobs, salve o arquivo texto que acabou de modificar, você deverá receber uma mensagem semelhante a apresentada na figura abaixo.

Cron: Como agendar a execução de um programa no Linux
Figura 6 – Instalação bem sucedida de crontab – Fonte: Autoria Própria, 2022

Com a instalação dos novos trabalhos, finalizamos o desenvolvimento prático, temos os cron jobs definidos bastando apenas verificar o acionamento do LED.

Conclusão

Cron é um utilitário capaz de permitir o agendamento de tarefas, sendo incorporado nos sistemas UNIX como um daemon (cron.d), seu funcionamento ocorre por meio da varredura periódica em arquivos de instruções pré-determinados (cron tabs), os quais contém as tarefas que desejamos executar no futuro (cron jobs).

O agendamento das tarefas deve seguir a sintaxe própria do cron, nessa sintaxe é possível definir o momento ou intervalo de execução da tarefa, assim como questões de periodicidade na execução.

     O cron é um utilitário básico, muito utilizado em aplicações que são executadas em sistemas Unix, sendo possível sua execução em sistemas embarcados.

Este artigo cumpre o objetivo exposto no início, que é apresentar de forma prática o uso do cron em aplicações com Linux Embarcado.

Saiba mais

Otimização de Tempo de Boot no Linux Embarcado

Como obter informações de disco livre e ocupado em C no Linux

Compilando uma Distribuição Linux Openembedded

Referências

L, Andrei. Cron Job: Guia Completo para Iniciantes 2022. 2022. Disponível em: https://www.hostinger.com.br/tutoriais/cron-job-guia. Acesso em: 15 jun. 2022.

DEBIAN WIKI. Time-based job scheduling in Debian (cron and friends). Disponível em: https://wiki.debian.org/cron. Acesso em: 15 jun. 2022.
ADMIN’S CHOICE. Crontab – Quick Reference. Disponível em: https://www.adminschoice.com/crontab-quick-reference. Acesso em: 10 jun. 2022.

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Home » Software » Como agendar a execução de um programa no Linux
Comentários:
Notificações
Notificar
guest
2 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Giovanni
Giovanni
15/07/2022 22:49

Muito bom o artigo!

Silvana Maria Tardochi
Silvana Maria Tardochi
04/07/2022 09:25

Parabéns pela matéria Yago! Sucesso amigo.

Talvez você goste:
Nenhum resultado encontrado.