Schedule tasks using at and cron:

Uma necessidade recorrente num posto de SysAdmin é o facto de periodicamente ser necessário executar vários scripts que existem num sistema, sendo que seria impensável obrigar ao administrador estar a executar os mesmos manualmente. Felizmente existem utilitários como o cron e o at que permitem ao administrador especificar no sistema os períodos que quer que determinados scripts executem de modo a este gerir automaticamente execução dos mesmos, libertando o utilizador que tarefas rotineiras.

Num sistema RHEL existem 3 ferramentas que podem ser usadas para gerir estas tarefas automaticamente (tarefas essas que pelo sistema são conhecidas como “jobs”):

  • para situações em que queremos executar a mesma tarefa com regularidade, usamos o cron;

  • quando pretendemos que seja executado uma tarefa em certos dias de forma assíncrona, usamos o anacron;

  • caso queiramos apenas executar uma tarefa apenas uma vez em determinada altura, usamos o at;

Cron

O cron é um serviço\utilitário que permite a um utilizador agendar tarefas a serem executadas em ciclos regulares. Os utilizadores especificam os cron jobs naquilo que são chamados de ficheiros com tabelas cron, estes ficheiros são depois lidos pelo crond, o daemon responsável pela execução das tarefas.

Para usarmos o cron temos de primeiramente o instalar caso já não esteja:

# yum -y install cronie

E de seguida temos de executar e ativar o daemon:

# systemctl enable crond.service
# systemctl start crond.service

Estando o daemon já ativo e pronto para executar tarefas, caso sejamos root, basta apenas editarmos o nosso ficheiro de tabelas cron de modo a especificarmos quando e o que é que tem de ser executado. O ficheiro em questão pode ser o /etc/crontab, contudo é mais correto a criação de um ficheiro individual dentro do diretório /etc/cron.d/. Dentro deste ficheiro devemos respeitar o seguinte sintaxe:

# .---------------- Minutos (0 - 59)
# |  .------------- Horas (0 - 23)
# |  |  .---------- Dia do Mes (1 - 31)
# |  |  |  .------- Mes (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- Dia da Semana (0 - 6) 
# |  |  |  |  |
  *  *  *  *  * [User]  [Comando]

Como pode ser analisado os primeiros 5 campos são usados para referenciar quando é que o [Comando] vai ser executado, e só depois é que é especificado por quem será executado [User], e no final o comando que vai ser executado. Contudo existem algumas outras pequenas características que podem ser usadas nos primeiros 5 campos, e nada melhor para as perceber do que alguns exemplos:

  • Executar o [Comando] todas as horas de todos os dias, mas apenas quando sejam 30m de cada hora ( 10:30, 11:30, 12:30, etc...):

0/30 * * * * [User] [Comando]

  • Executar o [Comando] a cada 10 minutos:

*/10 * * * * [User] [Comando]

  • Executar o [Comando] todas as horas mas apenas do dia 15 de Março:

* * 15 3 * [User] [Comando]

Um site muito útil para melhor percebermos esta sintaxe e as opções que temos possíveis podemos fazer alguns testes na plataforma Crontab Guru, onde iterativamente é nos explicado cada opção de uma linha numa tabela cron.

Caso o utilizador não seja root, nem tenha privilégios sudo, este pode a mesma criar e gerir os seus cron jobs, através do utilitário crontab. Para começar a gerir as suas tarefas o user dever usar o seguinte comando:

# crontab -e

De seguida será colocado dentro de um ficheiro de forma a poder escrever as suas tarefas respeitando o sintaxe já previamente referido. Caso o utilizador pretenda apenas visualizar as tarefas que tem ativas para serem executadas pode tomar recurso da opção “-l”:

# crontab -l

Por ultimo, é de se referir que o root, pode especificar limitações de utilização do utilitário cron, sendo que este pode especificar quais utilizadores é que o podem usar e quais é que não podem. Para conseguir fazer isto basta colocar o nome do utilizador que pretendemos definir, em um dos seguintes ficheiros, /etc/cron.deny (para negar a possibilidade de utilização), /etc/cron.allow (para permitir a utilização).

Anacron

O anacron tal como o cron, é um serviço que permite ao utilizador agendar tarefas a serem executadas, contudo este distingue-se do cron de duas formas: Se for agendada a execução de uma tarefa para uma altura em que o sistema não esteja a correr, esta tarefa é adiada para quando o sistema voltar a ser executado; Uma tarefa anacron pode ser executada no máxima uma vez por dia.

Para começarmos a utilizar o anacron devemos primeiramente de confirmar que o mesmo está instalado no sistema, e caso não esteja devemos instalar o mesmo:

# yum -y install cronie-anacron

E como este usa por base o mesmo daemon que o cron devemos ativar o mesmo:

# systemctl enable crond.service
# systemctl start crond.service

Estando os requisitos garantidos podemos definir tarefas a serem executadas no ficheiro /etc/anacrontab, respeitando o seguinte sintaxe:

[Frequencia_Dias] [Delay] [Identificação_Job] [Comando]

Ou seja, uma linha de exemplo que poderia ser lá colocada seria:

3 60 cron.daily /usr/bin/script.sh

Analisando o exemplo acima vemos que esta tarefa será executada de 3 em 3 dias, com um delay de 60 minutos, usando o identificador (serve melhor identificação em logs) de “cron.daily”, correndo o executável “/usr/bin/script.sh”. Mais informações e exemplos podem ser consultados nas páginas de man.

At

Caso queiramos apenas executar uma tarefa uma única vez em determinada altura devemos recorrer ao utilitário at. Todas as tarefas têm de ser especificadas através do comando at, para de seguida serem executadas e corridas pelo seu daemon, o atd.

Para usarmos este utilitário primeiramente devemos instalar o mesmo caso já não esteja:

# yum -y install at

E a seguir executar o daemon:

# systemctl enable atd.service
# systemctl start atd.service

Para definirmos uma tarefa a ser executada basta respeitarmos o seguinte sintaxe:

# at [Altura_de_Execução]

Por exemplo podemos pedir ao sistema para executar uma vez o nosso [Comando], mas apenas ás 15:00, do seguinte modo:

# at 15:00

Ou caso queiramos que seja executado dia 21 de Dezembro de 2018:

# at December 21 2018

Em ambos os exemplos após o envio do comando a consola irá reter num estado especifico á espera de introdução de comandos. Todos os comando que foram nesta fase introduzidos serão executados no período especificado, sendo que caso queiramos sinalizar o fim dos comandos a serem executados, devemos pressionar Ctrl+D.

Para um utilizador visualizar quais os trabalhos que estão pendentes por serem executados pelo atdeve usar o seguinte comando:

# atq

Caso seja pretendido cancelar a execução de alguma tarefa pendente bastará apenas obter o seu [ID] através do comando acima, e executar o seguinte comando:

# atrm [ID]

Note-se ainda que tal como o cron o root pode especificar quais os utilizadores é que podem ou não usar esta ferramenta através da introdução dos seus nomes nos seguintes ficheiros: /etc/at.deny e /etc/at.allow.

Mais informação e exemplos sobre tarefas geridas pelo at, está disponível nas suas páginas man.

Last updated

Was this helpful?