Este post tem a pretensão de dar uma rápida introdução ao cron — e cobrir o básico de tudo o que ele é capaz de fazer para você.
O que é o cron?
Cron é o nome do programa que permite aos usuários do Unix/Linux executar comandos ou scripts (grupos de comandos) automaticamente em um determinado horário/data.
É comumente usado pelos administradores de sistemas para programar a execução de suas tarefas administrativas – como o backup.
Vamos ver, aqui, como funciona o Cron Vixie, uma versão desenvolvida por Paul Vixie.
Como iniciar o cron
cron é um daemon, o que significa que ele é um serviço que é iniciado uma vez (usualmente, quando o sistema é ligado), entra em stand by e, na hora certa, executa a(s) tarefa(s) programada(s) – usualmente, em background, ou seja, nos bastidores do sistema.
Outro exemplo de daemon é o servidor FTP, que fica em stand by, quando não está sendo usado.
O daemon crond
já vem instalado na maioria das distros Linux e costuma ter algumas tarefas corriqueiras, já agendadas, como padrão.
Se você quiser saber o estado do seu crond
, rode o seguinte comando:
ps aux | grep crond
O meu resultado foi este:
root 311 0.0 0.7 1284 112 ? S Dec24 0:00 crond
2914659 20624 0.0 0.0 112364 856 pts/1 SN+ 12:49 0:00 grep crond
A primeira linha, indica que o crond
está sendo executado no meu sistema.
Se ele não estiver rodando no seu sistema, ou ele foi desligado (por você ou outro usuário) ou apenas nem foi iniciado.
Para iniciá-lo, você pode adicionar a linha crond
a um dos scripts de inicialização ou rodar o aplicativo manualmente, como root:
crond
como usar o cron
Dentro do diretório /etc/
, é possível encontrar subdiretórios chamados cron.hourly/, cron.weekly/, cron.daily/, cron.monthly/
. O princípio é simples, assim – ao copiar um script para dentro de um destes diretórios, ele será executado a cada hora (hourly), a cada semana(weekly), a cada mês (monthly). A frequência com que o script será executado, depende do nome do diretório, portanto.
É possível ter mais flexibilidade no modo como a tarefa será executada, através da edição do arquivo /etc/crontab
. Em um típico servidor Debian, este arquivo tem a seguinte aparência:
SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin</p> <p># m h dom mon dow user command 17 * * * * root cd / && run-parts --report /etc/cron.hourly 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) #
Você pode verificar o arquivo, no seu sistema, com o seguinte comando:
cat /etc/crontab
explicando o arquivo crontab
As primeiras linhas, do arquivo, definem algumas variáveis usadas pelo cron. A segunda parte é a que exige um pouco mais de atenção. Vamos usar tabela para explicar a linha
# m h dom mon dow user command
Item | Descrição |
---|---|
m ou minute |
minuto – determina a quantos minutos, dentro de uma hora, o comando será executado. Os valores aceitos vão de 0 a 59. |
h ou hour |
hora – determina a que hora o comando será executado e sua especificação segue o padrão 24h. Portanto, aceita valores entre 0 e 23 (sendo que 0 é meia-noite). |
dom ou day of month |
dia do mês – determina o dia do mês em que o comando será executado. Se quiser que a tarefa seja executada no dia 25 do mês, use o valor 25. |
mon ou month |
mês – determina o mês em que o comando será executado. Aceita tanto valores numéricos referentes aos meses do ano, como alfabéticos (e. g. August). |
dow ou day of week |
dia da semana – aceita tanto valores numéricos de 0 a 7, como caracteres: sun, mon, tue, wed, thu, fri e sat, que correspondem, respectivamente a domingo, segunda, terça, quarta, quinta, sexta e sábado. |
user |
usuário – determina o usuário do sistema sob cujos privilégios o comando irá ser executado |
cmd ou command |
comando – determina o comando a ser executado. |
Notas:
- Nos campos em que você não deseja fixar valor algum, pode inserir um asterisco ‘*’.
- No campo dow, dia da semana, tanto 0 como 7 correspondem a domingo
- Caso você determine valores para dom e para dow, o sistema não entra em conflito. O cron executa o comando nos dois casos
- O Vixie Cron aceita listas. O que significa que você pode enumerar especificamente, por exemplo, os dias da semana em que você deseja que um script seja disparado. Veja um exemplo:
59 11 * * 1,2,3,4,5 root backup.sh
irá executar o script
backup.sh
toda segunda, terça, quarta, quinta e sexta, às 11:59 - Se você preferir, pode usar assim:
59 11 * * 1-5 root backup.sh
onde 1 – 5 significa de segunda a sexta
- Você também pode “pular” números. Veja como:
- se você usar o valor
*/2
no campodom
, o comando irá rodar a cada 2 dias. */5
, no campo de horas, fará com que o comando seja executado a cada 5 horas- Os nomes dos meses e dos dias da semana não são sensíveis à caixa. Ou seja, tanto faz escrever Jul como jul. O importante é que você use apenas as 3 primeiras letras do dia da semana ou do nome do mês.
- Você pode (e deve) inserir comentários para explicar o que está fazendo. Para isto, basta usar um ‘#’ no início da linha comentada.
O crontab é multiusuário
O Unix é um sistema, por natureza, multiusuário. Cada usuário que se conecta ao sistema pode, em tese, programar as próprias tarefas a serem executadas pelo sistema.
Assim, você, que tem um blog WordPress instalado em um servidor – que te forneça acesso SSH – pode programar um backup e determinar a frequência com que ele irá ocorrer.
Para começar a personalizar o seu próprio crontab
, use o comando:
crontab -e
O sistema irá abrir o seu editor de textos padrão (o meu é o nano).
Se você quiser usar o nano
também, para editar o crontab
execute o seguinte comando:
export EDITOR=nano
Note que o seu crontab
“particular” segue os padrões do arquivo /etc/crontab
do sistema.
Uma vez terminada a edição, o cron faz a verificação sintática e permite corrigir possíveis erros. Se tudo estiver bem, é só deixar rolar.
Outros editores de texto
Usuários que se sintam mais confortáveis com outros editores de texto, podem faze a edição no aplicativo da sua preferência.
Depois de concluído, é só usar o comando crontab
para substituir o seu arquivo crontab
atual pelo arquivo que você acabou de criar.
Vamos supor que você tenha escrito as definições em um arquivo chamado meu.arquivo.cron
, o comando a ser usado é o seguinte:
crontab meu.arquivo.cron
Outros usos
Para listar as definições atuais do crontab
:
crontab -l
Para apagar e remover o seu crontab
atual:
crontab -r
Como restringir acesso ao crontab
Quem é administrador de um sistema pode impedir que usuários tenham acesso ao cron. Você pode inserir, no arquivo /etc/cron.allow
os usuários que têm permissão de alterar o crontab
. O arquivo /etc/cron.deny
é onde são inscritos os usuários que terão seu acesso negado ao serviço.
Uma maneira de restringir quase todos e permitir o acesso a alguns é adicionar a linha ALL
ao /etc/cron.deny
e ir acrescentando um a um os usuários aos quais você deseja liberar o acesso em /etc/cron.allow
.
Veja como restringir o acesso de todo mundo ao serviço:
echo ALL >> /etc/cron.deny
Para permitir o acesso à usuária sandrinha
, use o comando:
echo sandrinha >> /etc/cron.allow
Na ausência de qualquer um destes dois arquivos, o uso do cron, no sistema, é irrestrito — ou seja, todo mundo pode usar.
Se você tiver apenas o arquivo /etc/cron.allow
e, nele, inscrever a usuária sandrinha
, o sistema vai entender que todos os outros usuários estão proibidos e somente esta poderá fazer uso do serviço.
Com estas dicas básicas, você já estará habilitado a administrar as tarefas programadas no seu sistema. Mais informações podem ser encontradas com o comando man crontab
.
Have fun!
10 replies on “Como usar o comando Crontab – o cron para novatos.”
Como faço para executar um script .sh `todos dias, de seg à sex, às
12 e 19 horas, todos ano, com o usuário root
Faça login como root e altere o crontab.
Se eu quiser criar uma tarefa que seja executada de 1 em 1 minuto mas que seja executada em 24 horas todos os dias da semana, como deveria fazer? E em qual diretorio: /etc/crontab ou fazendo no crontab -e? Agradeço a ajuda.
Excelente, esclareceu bastante.
Gostaria de saber se tem como agendar algo para executar antes do servidor desligar?
Tenho um serviço rodando que, se o servidor for desligado antes de pará-la, corrompe alguns arquivos.
Olá, bom dia.
Estou utilizando CentOs 7 e percebi que meu script quando chega em uma certa parte, não roda no cron. Mas se eu executo o script manualmente ele funciona normalmente. percebi que o erro ocorre no comando mount -t exfat $disco /backup/, criei o script como root e adicionei no crontab como root. No arquivo do crontab esta da seguinte forma:
30 23 * * * /scripts/backup.sh &
Em outras distribuições como eu adicionei no cron como root , não preciso especificar o usuário root e fiz o mesmo nessa distribuição.
Alguém sabe me dizer o que pode estar ocorrendo ?
Desde já agradeço a atenção…
Muito obrigado pelas dicas. Estava quebrando a cabeça para entender esses comandos.
Se eu quiser criar uma tarefa que seja executada de 1 em 1 minuto mas que não seja executada de 12 horas as 14 horas todos os dias da semana, como deveria fazer? agradeço a ajuda.
* 12-14 * * * user comando.sh
aliás, não é pra executar entre as 12 e as 14! errei ai.
melhor fazer dois crons
* 0-12 * * * user comando.sh
* 12-24 * * * user comando.sh
Obrigado pela excelente explicação sobre o crontab, foi muito didático e de fácil entendimento. Vlw!