Gentoo Logo

Aviso : Este documento não é válido e não é mais mantido.


Guia de cron do Gentoo Linux

Conteúdo:

1.  Básico do cron

O que o cron faz

O cron é um daemon que roda tarefas agendadas com base na entrada do comando crontab (lista de tarefas). Esta tarefa é feita acordando todo minuto e verificando se há cron-jobs (tarefas agendadas) para rodar em alguma das crontabs de usuário.

Nota: Note que crontab é tanto o nome da lista de tarefas agendadas como o nome do comando para editar a lista.

Os crons existentes

Existem pelo menos três implementações de cron para você escolher no Portage. Todos oferecem uma interface semelhante, o uso do crontab ou um comando semelhante. Também há um utilitário relacionado chamado Anacron que funciona com cron em sistemas que não rodam continuamente.

Também vale notar que todos três pacotes de cron disponíveis dependem de sys-process/cronbase. Este pacote não é uma dependência técnica de nenhum dos pacotes de cron, mas oferece funcionalidades de cron que a maior parte dos usuários deseja.

Antes de começarmos a trabalhar com cron, você terá que escolher que implementação deseja usar. Para sua conveniência, eu coletei informações sobre cada um abaixo.

2.  Que cron é certo para você?

Vixie cron

Vixie cron é uma implementação de cron completa baseada no SysV cron. Cada usuário tem sua própria crontab e é permitido especificar variáveis de ambiente dentro de sua crontab. Ao contrário de outras variantes de cron, também oferece suporte para SELinux e PAM. Ele suporta menos arquiteturas que Dcron, mas mais que Fcron.

Funcionalidades do sys-process/vixie-cron:

  • Suporte para SELinux
  • Suporte para PAM /etc/security/limits.conf
  • Ajuste de variáveis de ambiente em crontabs (PATH, SHELL, HOME, etc.)
  • Cada usuário pode ter sua crontab, o acesso é controlado através de cron.allow e cron.deny

Dillon's Cron

Dcron tenta ser uma implementação simples, elegante e segura de cron. Não permite a especificação de variáveis de ambiente em crontabs e todos cron-jobs são rodados a partir de /bin/sh. Como Vixie cron, cada usuário tem sua própria crontab.

Funcionalidades do sys-process/dcron:

  • Rápido, simples e livre de funções desnecessárias
  • Acesso ao crontab é limitado ao grupo cron, isto é, não depende de utilitários externos.

Fcron

O Fcron tenta ser um substituto de Vixie cron e Anacron. É desenhado para trabalhar em sistemas que não rodam continuamente e vem com funções adicionais. Tem restrições de início de tarefas, controles de serialização de de tarefas, a capacidade de designar valores de "nice" às tarefas e a capacidade de agendar tarefas para serem rodadas na inicialização do sistema. Veja a home page do fcron para mais informações.

Funcionalidades do sys-process/fcron:

  • Desenhado para trabalhar em sistemas que não estão trabalhando continuamente, isto é, pode rodar uma tarefa depois de reiniciar se foi perdida
  • Configuração de variáveis de ambiente e muitas outras opções em crontabs
  • Cada usuário tem sua própria crontab, acesso é controlado por cron.allow e cron.deny
  • Sintaxe de crontab melhorada com suporte a muitas novas funções

Anacron

Anacron não é um daemon de cron, é algo que normalmente funciona junto com um. Ele executa comandos em intervalos especificados em dias e não presume que o sistema está rodando continuamente; ele irá rodar tarefas que foram perdidas enquanto o sistema estava desligado. Anacron normalmente depende de um daemon de cron que rode-o todo dia.

3.  Usando cron

Instalação

Selecione a implementação de cron de que você mais gosta, e faça emerge dela.

Listagem de código 3.1: Instalando cron

# emerge dcron
# rc-update add dcron default
# /etc/init.d/dcron start

Opcionalmente, se você não instalou o Fcron, você também pode instalar o Anacron.

Listagem de código 3.2: Instalando anacron

# emerge anacron
# rc-update add anacron default
# /etc/init.d/anacron start

Crontab de sistema

As mensagens de pós-instalação de alguns dos pacotes de cron irão pedir que você rode crontab /etc/crontab. O arquivo /etc/crontab é sua crontab de sistema. Uma instalação de cron pode usá-la em conjunto com sys-process/cronbase para rodar os scripts em /etc/cron.{daily,hourly,weekly,monthly}. Note que somente o Vixie-cron agenda tarefas em /etc/crontab automaticamente. Usuários de Dcron e Fcron precisam rodar crontab /etc/crontab cada vez que fizerem mudanças ao /etc/crontab.

Por favor note que trabalhos agendados na crontab de sistema podem não aparecer na lista de cron-jobs mostrados com crontab -l.

Claro, você pode escolher não usar nenhum crontab de sistema. Se você escolher Dcron ou Fcron, não rode crontab /etc/crontab. Se você escolher vixie-cron, você deve comentar todas linhas em /etc/crontab.

Listagem de código 3.3: Comentando todas linhas em /etc/crontab

# sed -i -e "s/^/#/" /etc/crontab

Dando acesso de cron a usuários confiáveis

Se você quiser que usuários fora o administrador (root) tenham acesso ao daemon de cron, você deve ler esta seção, caso contrário, você pode pular para a próxima, agendando cron-jobs.

Nota: Dar acesso de crontab a outro usuário não permite que ele rode cron-jobos como root. Se você quiser que o usuário possa editar a crontab de root, você deve informar-se sobre sudo.

Não importa que pacote de cron você use, se você quiser permitir que um usuário use a crontab, ele deverá primeiro fazer parte do grupo cron. Como um exemplo, se você quisesse adicionar o usuário wepy ao grupo cron você rodaria:

Listagem de código 3.4: Adicionando um usuário ao grupo cron

# gpasswd -a wepy cron

Se você estiver usando Dcron, isto é tudo que você precisa fazer para dar acesso de usuário à crontab. Usuários de Dcron podem ir para a próxima seção agendando cron-jobs, todos outros devem continuar lendo.

Se você estiver usando Fcron, você deve editar /etc/fcron/fcron.deny e /etc/fcron/fcron.allow. O jeito mais seguro é negar todos em /etc/fcron/fcron.deny, e depois dar acesso explicito aos usuários em /etc/fcron/fcron.allow.

Importante: Se nem /etc/fcron/fcron.allow ou /etc/fcron/fcron.deny existirem, todos usuários no grupo cron terão acesso ao crontab.
O fcron vem por padrão com um fcron.allow que permite que todos usuários no grupo cron tenham acesso ao fcrontab.

Listagem de código 3.5: Permissões em fcron.deny

all

Agora, digamos que temos um usuário chamado wepy que deve poder agendar seus próprios cron-jobs. Nós devemos adicioná-lo ao /etc/fcron/fcron.allow como a seguir:

Listagem de código 3.6: Permissões em fcron.allow

wepy

Se você escolher o Vixie cron, você provavelmente só deve editar /etc/cron.allow.

Importante: É importante que se somente o /etc/cron.allow existir, então somente os usuários do grupo cron terão acesso, mas se um arquivo vazio /etc/cron.deny existir, então todos usuários do grupo cron serão permitidos! Não deixe um /etc/cron.deny se você não tiver um /etc/cron.allow.

Por exemplo, se você quisesse permitir acesso do usuário wepy, você adicionaria ele ao /etc/cron.allow como a seguir:

Listagem de código 3.7: Permissões em /etc/cron.allow

wepy

Agendando cron-jobs

O processo de edição de crontabs é diferentes para cada pacote, mas eles todos suportam o mesmo conjunto básico do comandos: adicionar e substituir crontabs, editar crontabs, apagar crontabs, e listar cron-jobs nas crontabs. A lista a seguir mostra como rodar os comandos para cada pacote.

Versão Edição de crontab Remoção de crontab Nova crontab Listar cron-jobs
dcron crontab -e crontab -d [usuário] crontab arquivo crontab -l
fcron fcrontab -e fcrontab -r [usuário] fcrontab arquivo fcrontab -l
vixie-cron crontab -e crontab -r -u [usuário] crontab arquivo crontab -l

Nota: O Fcron também faz um link simbólico para crontab. Quando for usar o comando de remoção, se nenhum argumento for fornecido, ele apaga a crontab do usuário atual.

Nota: Fcron também faz um link simbólico de crontab para fcrontab.

Antes de podermos usar quaisquer desses comandos, todavia, você primeiro precisa entender a própria crontab. Cada linha em uma crontab precisa especificar cinco campos de tempo na seguinte ordem: minutos (0-59), horas (0-23), dias do mês (1-31), meses (1-12), e dias da semana (0-7, segunda-feira é 1, domingo é 0 e 7). Os dias de semanas e meses podem ser especificados por abreviaturas de três letras em inglês como mon, tue, jan, feb, etc... Cada campo também pode especificar um limite de valores (como 1-5 ou mon-fri), uma lista separada por vírgulas de valores (como 1,2,3 ou mon,tue,wed) ou um limite de valores com um step (por exemplo 1-6/2 como 1,3,5).

Isto parece um pouco confuso, mas com alguns exemplos você verá que não é tão complicado como parece ser.

Listagem de código 3.8: Exemplos

# Rodar /bin/false todo minuto o ano inteiro
*     *     *     *     *        /bin/false  

# Rodar /bin/false às 1:35 na segunda, terça, quarta e no quarto dia de cada mês
35    1     4     *     mon-wed  /bin/false

# Rodar /bin/true às 22:25 de 2 de março
25    22    2     3     *        /bin/true

# Rodar /bin/false às 2:00 cada segunda-feira, terça-feira e sexta-feira
0     2     *     *     1-5/2    /bin/false

Nota: Perceba como você tem que especificar os dias da semana e dias do mês antes de serem combinados. Se você tiver uma * para só um deles, o outro toma precedência, enquanto * para ambos significa todo dia.

Para testar o que acabamos de aprender, vamos fazer fazer os passos de realmente agendar alguns cron-jobs. Primeiro, crie um arquivo chamado crons.cron e faça-o parecer-se com o seguinte:

Listagem de código 3.9: Editando crons.cron

$ nano crons.cron
#Mins  Horas  Dias   Meses  Dia da semana
10     3      1      1       *       /bin/echo "nao gosto de cron na verdade"
30     16     *      1,2     *       /bin/echo "gosto um pouco de cron"
*      *      *      1-12/2  *       /bin/echo "gosto muito de cron"

Agora nós podemos adicionar a crontab ao sistema com o "novo comando" da tabela acima.

Listagem de código 3.10: Uma nova crontab

# crontab crons.cron

Nota: Você não verá realmente a saída dos comandos de echo a menos que você use redirecionamento.

Para verificar os cron-jobs que você agendou, nós iremos o usar o devido código de listagem da tabela acima.

Listagem de código 3.11: Listando cron-jobs

# crontab -l

Você deve ver uma lista parecida com o crons.cron, caso contrário, talvez você usou o comando errado para dar entrada da sua nova crontab.

Esta crontab deve fazer echo de "gosto muito de cron" cada minuto de cada hora de cada dia um mês sim outro não. Obviamente você só precisa fazer isso se você realmente gosta de cron. A crontab também irá fazer echo de "gosto um pouco de cron" às 16:30 todo dia em janeiro e fevereiro. Também irá fazer echo de "nao gosto de cron na verdade" às 3:10 de primeiro de janeiro.

Se você estiver usando Anacron, você deve continuar lendo esta seção. Caso contrário, pule para a próxima seção sobre edição de crontabs.

Usuários de Anacron devem editar o /etc/anacrontab. Este arquivo tem quatro campos: o número de dias entre cada vez que é rodado, o atraso em minutos após o qual ele roda, o nome da tarefa, e o comando para rodar.

Por exemplo, para fazer que ele rode echo "eu gosto de anacron" cada 5 dias, 10 minutos depois o Anacron iniciar, você teria:

Listagem de código 3.12: /etc/anacrontab

5 10 wasting-time /bin/echo "eu gosto de anacron"

Anacron termina depois de todas tarefas no anacrontab terminarem, então se nós quisermos que ele verifique as tarefas todo dia, precisaremos usar cron. As instruções no final da próxima seção ensinam como fazê-lo.

Editando crontabs

Vamos ser realistas, todavia, você não quer que seu sistema diga o quanto você gosta de cron cada minuto. Como um passo avante, vamos remover aquela crontab usando o comando de remoção correspondente da tabela acima. Nós também iremos listar os cron-jobs depois, para ter certeza de que funcionaram.

Listagem de código 3.13: Removendo uma crontab

# crontab -d
# crontab -l

Você não deve ver cron-jobs na saída de crontab -l. Se você vir tarefas listadas, isto significa que tivemos problemas na remoção da crontab, e que você deve verificar se usou o comando de remoção correto para seu pacote de cron.

Agora que estamos em um estado limpo, vamos colocar algo útil na crontab de root. A maior parte das pessoas deve rodar updatedb com base semanal para ter certeza de que o slocate funcione adequadamente. Para adicioná-lo ao seu crontab, vamos primeiro editar o crons.cron novamente para que se pareça com o seguinte:

Listagem de código 3.14: Uma crontab real

22 2 * * 1    /usr/bin/updatedb

Isto fará o cron rodar updatedb às 2:22 A.M. nas manhãs de segunda-feira de cada semana. Você deve agora dar entrada na crontab com o devido novo comando da tabela acima, e verificar a lista novamente.

Listagem de código 3.15: Listando cron-jobs

# crontab crons.cron
# crontab -l

Vamos agora dizer que você também quer adicionar emerge --sync à sua agenda diária. Você pode fazer isso primeiro editando crons.cron e depois usando crontab crons.cron como nós fizemos anteriomente, ou você pode usar o comando de edição adequado da tabela acima. Isto dará a você um jeito de editar a sua própria crontab de usuário, sem depender de arquivos externos como crons.cron.

Listagem de código 3.16: Editando uma crontab no lugar

# crontab -e

Isto deve abrir sua crontab de usuário com um editor. Nós queremos fazer emerge --sync rodar todo dia 6:30 da manhã, então vamos deixá-la parecida com o seguinte:

Listagem de código 3.17: Uma crontab real

22 2 * * 1    /usr/bin/updatedb
30 6 * * *    /usr/bin/emerge --sync
(se você estiver usando anacron, adicione esta linha)
30 7 * * *    /usr/sbin/anacron -s

Novamente, verifique a lista de cron-jobs como fizemos nos exemplos anteriores para verificar se as tarefas foram agendadas. Se estiverem todas lá, então tudo pronto.

4.  Usando cronbase

Como mencionado anteriormente, todos três pacotes de cron disponíveis dependem de sys-process/cronbase. O pacote cronbase cria /etc/cron.{hourly,daily,weekly,monthly}, e um script chamado run-crons. Você pode ter percebido que o /etc/crontab padrão contém algo parecido com o seguinte:

Listagem de código 4.1: crontab de sistema padrão

*/15 * * * *     test -x /usr/sbin/run-crons && /usr/sbin/run-crons
0  *  * * *      rm -f /var/spool/cron/lastrun/cron.hourly
0  3  * * *      rm -f /var/spool/cron/lastrun/cron.daily
15 4  * * 6      rm -f /var/spool/cron/lastrun/cron.weekly
30 5  1 * *      rm -f /var/spool/cron/lastrun/cron.monthly

Para evitar entrar em detalhes, nós podemos presumir que estes comandos irão efetivamente rodar seus scripts horários, diários, semanais e mensais. Este método de agendar cron-jobs tem algumas vantagens importantes:

  • Eles irão rodar mesmo se seu computador estava desligado quando deviam ser rodados
  • É fácil para os mantenedores de pacotes colocar scripts nestes locais bem definidos
  • Você sabe exatamente onde seus cron-jobs e sua crontab são guardados, tornando fácil o backup e restauração desta parte do sistema

Nota: Novamente, é útil notar que o Vixie cron lê o /etc/crontab automaticamente, enquanto o dcron e o fcron não. Por favor, leia a seção Crontab de sistema para saber mais sobre isso.

5.  Notas finais

Resoluções de problemas

Se você estiver com problemas para fazer com o que o cron funcione devidamente, você pode fazer esta rápida lista de verificações.

  • O cron está rodando?
    Rode ps ax | grep cron, veja se ele aparece!
  • O cron está rodando?
    Tente: * * * * * /bin/echo "foobar" >> /arquivo_seu, e veja se ele funciona
  • Seu comando está funcionando?
    Tente: * * * * * /bin/foobar > /arquivo_seu 2>&1, busque erros em /arquivo_seu
  • O cron pode rodar sua tarefa?
    Veja o registro do cron, normalmente /var/log/cron.log ou /var/log/messages, procurando erros
  • Existem dead.letter's?
    O cron normalmente manda correio quando há um problema, veja seu correio e também verifique se há ~/dead.letter

Lembre-se de que cada pacote de cron é diferente e o alcance de funcionalidades varia profundamente. Certifique-se de ler as páginas de man para crontab, fcrontab ou anacrontab, dependendo do que você usar.

Boa sorte!



Imprimir

Atualizado 14 de janeiro de 2006

A versão original desta tradução não é mais mantida

Resumo: Este guia descreve como configurar e usar cron.

Eric Brown
Autor

Xavier Neys
Editor

Marcelo Góes
Tradutor

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.