GNU/Linux
 
 
CRON, ANACRON e AT
(agendamento de tarefas)

Para Agendar tarefas no GNU/Linux temos basicamente três ferramentas: CRON, ANACRON e AT. Cada um deles tem a sua especialidade. Veja a seguir o que eles fazem.


CRON

O CRON é um daemon (processo em backgroud) que tem a função de agendar tarefas (jobs) num intervalo regular de tempo (ex: todo minuto, toda hora, todo dia, toda semana ou todo mês). Isso quer dizer que as tarefas agendadas ocorrem em momentos específicos e em intervalos de tempo regulares. Por exemplo, posso colocar no CRON que a meu sistema seja atualizado todos os dias as 03:30hs da madrugada. Contudo, caso o equipamento esteja desligado no momento agendado de uma execução, tal execução só ocorrerá no próximo intervalo. O CRON assume que a máquina sempre estará rodando (24 horas e 7 dias por semana) ou pelo menos que esteja ligada no momento da executação da tarefa. Devido a essa característica, o CRON é mais recomendado para servidores. O CRON é instalado por padrão em todos os GNU/Linux:


Instalação
# apt-get update ; apt-get install cron

Restartar o serviço
# /etc/init.d/cron restart

Comandos úteis
$ crontab -l (visualizar os agendamentos do usuário atual)
# crontab -lu username (visualizar os agendamentos de um usuário específico. Somente o "root" tem esse direito)
$ crontab -r (deleta os agendamentos do usuário atual)
$ crontab -ru username (deleta os agendamentos de um usuário específico. Somente o "root" tem esse direito)
$ crontab -e (edita os agendamentos do usuário atual. Ao realizar um agendamento qualquer, o que foi feito é salvo e vai para diretório "/var/spool/cron/crontabs/". Algo interessante a se falar é que ao editar e salvar o agendamento de alguma tarafa, ela só será criada pelo CRON depois que sair do arquivo)
$ crontab -eu username (edita os agendamentos de um usuário específico. Somente o "root" tem esse direito)

Obs: para editar os agendamentos de um usuário em vez de usar o comando "crontab -e", seria melhor usar "env EDITOR=vi crontab -e". Com isso, teremos o "vi" como editor.

Configurar/Editar/Agendar uma tarefa
# env EDITOR=vi crontab -e (abre o ambiente de agendamentos do "root". Foi escolhido tal usuário, pois serão mais ditáticos os exemplos. Contudo, poderia se usar outros usuários, sendo necessário somente observar se o usuário tem permissões para usar comandos administrativos como o "poweroff")

Veja na figura anterior que apareceu uma linha comentada com várias colunas (m, h, dom, mon, dow e command). Elas significam:

Obs: também se pode usar "," e "-" como por exemplo, "0,3" e "0-3" que especificam "0 e 3" e de "0 1 2 3", respectivamente.

Vamos agora a um exemplo prático:

No exemplo anterior o comando poweroff, que desliga o equipamento, vai ser executado todos os dias às 12 horas e 30 minutos.

No exemplo anterior o comando poweroff, que desliga o equipamento, vai ser executado sempre no dia 1 às 12 horas e 30 minutos.

No exemplo anterior o comando poweroff, que desliga o equipamento, vai ser executado sempre no sábado às 12 horas e 30 minutos.

No exemplo anterior o comando poweroff, que desliga o equipamento, vai ser executado todos os dias às 12 horas e 30 minutos nos meses de Janeiro à Junho.

No exemplo anterior o comando poweroff, que desliga o equipamento, vai ser executado todos os dias às 12 horas e 30 minutos nos meses de Janeiro à Junho e em Decembro.

No exemplo anterior o comando poweroff, que desliga o equipamento, vai ser executado a cada 2 horas.


Arquivos de configuração
Obs: ao fazer qualquer agendamento, não é necessário restartar o serviço do CRON, pois os arquivos são sempre lido de tempos em tempos pelo daemon "crond".

Qualquer saída padrão ou deerro (verificar) de comandos ou scripts executados pelo CRON são enviados automaticamente para o usuário local que os executou (geralmento é enviado para root local - utilize o comando "mail" para ver essas mensagens). O CRON não mostra os resultados na saída padrão (terminal - tela). Quando não existe um MTA instalado a saída é descartada (No MTA installed, discarding output).




ANACRON

O ANACRON é um daemon (processo em backgroud) que tem a função de agendar tarefas (jobs) num intervalo irregular de tempo (ex: todo dia, mas sem se importar com o horário). Diferente do CRON, o ANACRON não assume que a máquina esteja rodando continuamente (24 horas por dia e 7 dias por semana). Devido a essa característica, o ANACRON é mais recomendado para estações de trabalho (cliente). Geralmente quando se usa o ANACRON não se usa o CRON e vice-versa. Veja isso no conteúdo de "/etc/crontab" (caso o anacron exista, a tarefa não é executada), conforme a figura a seguir:

Agora veja na figura seguir o conteúdo do "/etc/anacrontab" que é o arquivo de configuração do ANACRON. Perceba que ele assume as tarefas do CRON. Não é instalado por padrão no GNU/Linux:

Obs: o arquivo "/etc/anacrontab" só aparecerá se for instalado o ANACRON (apt-get install anacron).
Instalação
# apt-get update ; apt-get install anacron
Obs: ao instalar o ANACRON não será necessário mudar muita coisa, pois como já foi visto, ele usará os diretórios do CRON para realizar os agendamentos Algo interessante também é que não é necessário remover ou parar o daemon do CRON, pois ele e o ANACRON podem coexistir perfeitamente.

Restartar o serviço
# /etc/init.d/anacron restart

Comandos úteis
$ crontab -d (mostra informações sobre os agendamentos das tarefas)
# crontab -f (força a execução das tarefas agendadas, ignorando os timestamps)
# crontab -s (serializa a execução das tarefas, não iniciando uma nova tarefas antes de terminar a anterior)
# crontab -T (testa o arquivo de configuração "/etc/anacrontab" para verificar se está válido)



AT

O AT é equivalente ao CRON, contudo executa uma tarefa uma única vez numa data e hora específicada.


Instalação
# apt-get install at (já é instalado por padrão na maioria da distribuições)

Comandos
# at 18:00 < /bin/df (executará o "/bin/df" as 18 horas de hoje)
# at -m 18:30 12/30/2011 < /bin/df (executa o comando as 18:30hs na data 12/30/2011, além disso envia uma e-mail (-m) para o usuário quando o job estiver sido completado, mesmo que não haja um output/saída)
# at -f /bin/df -m 18:30 12/30/2011 (idem)

Fila/Queue dos jobs/tarefas
# atq (mostra a queue/fila dos jobs/tarefas que serão executados. Se for executado como root, mostra os jobs de todos os usuário. Se for executado por um usuário comum, mostra somente os jobs do usuário atual)
# at -l (idem)

Removendo jobs/tarefas
# atrm 1 (remove o job número 1)
# at -d 1 (idem)
# atrm 8 7 9 (remove os jobs 8, 7 e 9)

Arquivos de configuração e outros
/etc/at.allow (determina quem pode submeter jobs via "at" ou "batch". Se esse arquivo não existir todos poderão usar o at ou batch, contudo o arquivo "/etc/at.deny" será consultado)
/etc/at.deny (determina quem não pode submeter jobs via "at" ou "batch". Se esse arquivo não existir todos poderão usar o at ou batch. Se esse arquivo estiver em branco, todos os usuários podem usar o "at". Se nenhum dos arquivos "at.allow" e "at.deny" existirem, somente o root poderá usar o "at")
/var/spool/cron/atjobs/ (local onde ficam armazenados os jobs do at. É possível ver todas as informações dos jobs)
/var/spool/cron/atspool/ ()

Serviço e Daemon
# /etc/init.d/atd (script do AT. Ao realizar um agendamento com o comando "at" não é necessário reiniciar o serviço. Esse script serve somente para colocar e retirar o daemon "atd" do ar. Caso o daemon "atd" não esteja no ar, os agendamentos não serão executados. Contudo, ao colocar esse daemon no ar novamente, os jobs atrazados serão executados)
/usr/sbin/atd (daemon. A opção "-l" especifica a carga média (load_avg) sobre o qual o job não deve rodar. O default é 1.5, sendo que acima disso o jobs não é executado. Ver a carga média é "cat /proc/loadavg")

Mais comandos
# batch ou at specific time (entra num ambiente at/batch, onde se pode agendar jobs. Dentro desse ambiente, digite, por exemplo, "/bin/df 18:30" e depois aperte CTRL+d para salvar e sair. Já no caso do at specific time o time já foi especificado, basta inserir o comando. Obs: Executa comandos quando o nível da carga do sistema permitir, ou seja, quando a carga média cair ficando abaixo de 1.5 ou o valor especificado na invocação do "atd". Ex: "batch" e at<setiathome - Ctrl+d. O comando "setathome" vai ser executado em background e o job tetará iniciar imediatamente, mas isso só acontecerá quando a carga do sistema estive abaixo de 1.5. Para ver tal valor digite "cat /proc/loadavg". Quando o job terminar um e-mail será enviado para o usuário)





Referências Bibliográgicas

 
 


ETI - Especialista em Tecnologia
da Informação