ÍNDICE DE CONTEÚDO
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.
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.
Caractere | Significado | Aplicável em |
, | Define dois ou mais horários de agendamento | Todos os campos |
– | Determina um intervalo entre os valores | Todos os campos |
/ | Cria “passos” ou intervalos de tempo pré-definidos | Todos os campos |
L | Possui a função de determinar o último dia da semana ou o último dia do mês a ser executado | Dia da semana;Dia do mês. |
W | Possui a função de indicar o dia da semana (dia útil) mais próximo do valor indicado | Dia 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 é especificado | Dia 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:
1 |
crontab -e |
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:
1 |
date |
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:
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.
Com a placa devidamente conectada ao LED, devemos fazer a codificação do script python. O código é apresentado logo abaixo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
import getopt import sys import Adafruit_BBIO.GPIO as GPIO #GPIO onde o LED está conectado LED = "P8_8" def main(args): try: GPIO.setup(LED, GPIO.OUT) optlist,args = getopt.getopt(args,'',['led=']) opt,arg = optlist[0] if "on" == arg: turnOn() elif "off" == arg: turnOff() except getopt.GetoptError as err: print("Ivalid arguments") def turnOn(): GPIO.output(LED,GPIO.HIGH) def turnOff(): GPIO.output(LED,GPIO.LOW) if __name__ == "__main__": main(sys.argv[1:]) |
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:
1 |
python3 teste-cron.py --led=on |
Desligar LED:
1 |
python3 teste-cron.py --led=off |
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.
1 |
pip3 install –r requirements.txt |
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.
1 |
sudo crontab -e |
Após a execução do comando, você deverá ver uma tela semelhante a essa.
Vamos inserir a regra para acionamento do led, insira o seguinte texto na última linha do arquivo crontab.
1 |
<strong>0 19 * * 2,3 python3 {caminho onde está seu arquivo python} --led=on</strong> |
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.
1 |
<strong>0 19 * * 2,3 python3 /home/debian/cron-article/teste-cron.py --led=on</strong> |
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.
1 |
<strong>0 0 * * 3,4 python3 {caminho onde está seu arquivo python} --led=off</strong> |
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.
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.
Muito bom o artigo!
Parabéns pela matéria Yago! Sucesso amigo.