sábado, 3 de maio de 2008

Agendamento de Tarefas No Linux: Usando o cron

Mais robusto do que o at, o Cron se resumo a um daemon, o crond, que a todo minuto verifica um arquivo, o /etc/crontab ou em /var/spool/cron/tabs em busca de novos trabalhos. O arquivo crontab é editável através do comando crontab –e (que edita o arquivo dentro do /var, separado por usuário),que não é recomendado por algumas distribuições como a SuSE ou a edição direta do /etc/crontab


Ao executar o crontab –e o editor de textos padrão do sistema (o vi ou vim) será aberto já no crontab. No final da edição, basta você salvar e sair do vi da maneira tradicional. Dentro do arquivo encontraremos os trabalhos agendados escritos de maneira semelhante ao exemplo abaixo:

1 12 1 1 * /usr/local/bin/programa.bin
Essa linha segue a seguinte máscara

minuto hora dia mês dia-da-semana executável-com-path-completo

Substituindo as máscaras pelo escopo de valores possíveis nós temos:
0-59 0-23 0-31 1-12 0-6 executável-com-path-completo
Um ponto a ser chamado atenção é o fato do executável (programa/comando) ter a necessidade de estar descrito com seu path completo isso porque durante a execução de um programa pelo cron as únicas variáveis disponíveis são $USER, $HOME e $SHELL.

No caso do primeiro exemplo, o mesmo significa que o programa programa.bin localizado em /usr/local/bin seria executado ao primeiro minuto das 12 horas do primeiro dia do mês janeiro. O campo relativo ao dia da semana foi substituído por um asterisco de modo que ele seria executado independente de qual fosse o dia da semana.

Podemos substituir qualquer opção por asterisco, como nos exemplos abaixo:
* * * * * /usr/bin/meuprog.bin
Nesse exemplo, meuprog.bin em /usr/bin seria executado a todo minuto, de toda hora, de todo dia de todo mês.

Um detalhe curioso a respeito do campo de dia da semana: as compilações mais novas possuem um range de 0 a 7, onde o 0 e o 7 representam o domingo.

É possível definir vetores dentro dos campos, usando - , /. [traço, vírgula, barra]. Veja os exemplos:

*/5 * * * * /root/backup.sh

Essa linha executaria o script backup.sh a cada 5 minutos

* 9-18 * * * /root/backup.sh

Essa linha executaria o script backup.sh das 9 as 18 horas

* 9,11 * * * /root/backup.sh

Essa linha executaria o script backup.sh as 9 e as 11 horas.

No caso de sistemas como o Suse, onde o uso do Crontab é desaconselhado você pode editar o arquivo /etc/crontab e inserir tais linhas com a opção de colocar antes do comando o nome do usuário como o qual aquele comando será executado.

* * * * * root /root/backup.sh

Esse comando executaria o script.backup.sh a todo minuto com os privilégios de root. Outra opção é criar um arquivo de texto com a seguinte linha e salvar o mesmo dentro do /etc/cron.d

Além do comando –e, o crontab outras opções como –r que remove todo o conteúdo, o –l que lista o conteúdo atual e o –u que troca de usuário.

Assim como com o comando at, o arquivo /etc/cron.allow, caso exista, irá conter o nome dos usuários autorizados a utilizar o cron. Caso o arquivo cron.allow não existe mas o arquivo /etc/cron.deny exista, apenas os usuário fora dele poderão utilizar o cron. Caso nenhum dos dois exista todos poderão utilizar o cron.

Outra ferramente disponível semelhante ao cron é o anacron, que funciona de maneira separada porém sem assumir que o sistema funcione 24 horas/dia. O anacron lê seus trabalhos em /etc/anacrontab, verifica de quantos em quantos dias o mesmo deve ser executado. Caso o limite tenha sido extrapolado anacron o executa.