Aviso :
Este documento não é válido e não é mais mantido.
|
Guia de cron do Gentoo Linux
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 |
* * * * * /bin/false
35 1 4 * mon-wed /bin/false
25 22 2 3 * /bin/true
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
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
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!
O conteúdo deste documento está licenciado pela licença Creative Commons -
Attribution / Share Alike.
|