(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.
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:
- m: minute. Varia de 0 à 59;
- h: hour. Varia de 0 à 23;
- dom: day of month. Varia de 1 à 31;
- mon: month. Varia de 1 à 12;
- dow: day of week. Varia de 0 à 7. Sendo que 0 = Domingo, 1 = Segunda-Feira, ..., 6 = Sábado e 7 = Domingo;
- user: opcional, especifica qual usuário está executando a ação. VER;
- command: comandos e opções.
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
- /etc/cron.hourly/: diretório onde ficam scripts que devem ser executados de hora em hora;
- /etc/cron.daily/: diretório onde ficam scripts que devem ser executados diariamnte;
- /etc/cron.weekly/: diretório onde ficam scripts que devem ser executados semanalmente;
- /etc/cron.monthly/: diretório onde ficam scripts que devem ser executados mensalmente;
- /etc/crontab: arquivo de agendamento do CRON onde especifica os diretórios /"etc/cron.hourly/", "/etc/cron.daily/", "/etc/cron.weekly/" e "/etc/cron.monthly/", conforme figura a seguir:
- /etc/cron.d/: diretório onde ficam arquivos de agendamento caso o usuário ou sistema necessite fazer algo mais customizado do que o padrão dos quatro diretórios mostrados anteriormente;
- /etc/cron.allow: lista de usuários que podem utilizar os agendamentos. Em algumas distribuições esse arquivo não existe, então, basta criá-lo e inserir os nomes de usuários que tem permisão de usar o CRON;
- /etc/cron.deny: lista de usuários que não podem utilizar os agendamentos. Em algumas distribuições esse arquivo não existe, então, basta criá-lo e inserir os nomes de usuários que não tem permisão de usar o CRON;
- /var/spool/cron/: diretório onde ficam os agendamentos dos usuários gerados pelo comando "crontab -e";
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).
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:

- period: especifica o intervalo de dias que a tarefa deve ser executada. No caso de tarefas que devem ser executadas mensalmente, prefira usar "@monthly", pois assim não importará o número de dias que um mês terá;
- delay: quando o ANACRON detectar que uma tarefa ainda não tenha sido executada no período de tempo definido no campo "period", esse campo especifica quando minutos o ANACRON deverá esperar antes de executar tal tarefa. Esse problema da tarefa não ter sido executada pode acontecer caso a máquina tenha sido deligada e ligada tempos depois;
- job-id: é usado para identificar unicamente a tarefa nas mensagens do ANACRON e nos arquivos que guardam o timestamp da tarefa (/var/spool/anacron/);
- command: a tarefa que deve ser executada. Depois que a tarefa é executada e concluída, o ANACRON registra a data dessa ação (AAAA/MM/DD) em arquivos que ficam em "/var/spool/anacron/". Assim, ele sabe quando deve executar a tarefa novamente ou se alguma ainda não foi executada. Somente a data é usada nesses cálculos, a hora não é usada;
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)
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