REFERÊNCIA RÁPIDA DE CRON
Agendamento de jobs, sintaxe do crontab, strings especiais, logging
Sintaxe
Formato do Crontab
# ┌───── minute (0-59)
# │ ┌───── hour (0-23)
# │ │ ┌───── day of month (1-31)
# │ │ │ ┌───── month (1-12)
# │ │ │ │ ┌───── day of week (0-7, 0&7=Sun)
# * * * * * command
Valores de Campo
| * | Qualquer valor (curinga) |
| , | Lista de valores: 1,3,5 |
| - | Intervalo: 1-5 |
| / | Passo: */10 (a cada 10) |
| 0-59 | Intervalo de minutos |
| 0-23 | Intervalo de horas |
| 1-31 | Intervalo de dia do mês |
| 1-12 | Intervalo de mês (ou JAN-DEC) |
| 0-7 | Dia da semana (0&7=Dom, ou SUN-SAT) |
Strings Especiais
Agendamentos Abreviados
| @reboot | Executar uma vez ao iniciar |
| @yearly | 0 0 1 1 * — uma vez por ano (1º de jan) |
| @monthly | 0 0 1 * * — uma vez por mês (dia 1) |
| @weekly | 0 0 * * 0 — uma vez por semana (domingo) |
| @daily | 0 0 * * * — uma vez por dia (meia-noite) |
| @hourly | 0 * * * * — uma vez por hora |
Exemplos
Agendamentos Comuns
30 2 * * * /usr/local/bin/backup.sh
0 9 * * 1-5 /opt/report.sh
*/15 * * * * /usr/bin/health-check.sh
0 0 1 * * /opt/monthly-cleanup.sh
0 8,17 * * * /opt/notify.sh
Explicação dos Agendamentos
| 30 2 * * * | Todo dia às 2:30 |
| 0 9 * * 1-5 | Dias úteis às 9:00 |
| */15 * * * * | A cada 15 minutos |
| 0 0 1 * * | Primeiro dia do mês, meia-noite |
| 0 8,17 * * * | Todo dia às 8h e às 17h |
Ambiente
Definindo Variáveis
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
[email protected]
HOME=/home/deploy
* * * * * /opt/myjob.sh
Notas de Ambiente
| SHELL | Shell usado para executar comandos (padrão /bin/sh) |
| PATH | Caminho de busca (o padrão do cron é mínimo) |
| MAILTO | Enviar saída para este e-mail (vazio = sem e-mail) |
| HOME | Diretório home para o job cron |
Logging
Saída & Logging
# redirect stdout + stderr to a log file
*/5 * * * * /opt/job.sh >> /var/log/job.log 2>&1
# discard all output
0 3 * * * /opt/job.sh > /dev/null 2>&1
# log only errors
0 3 * * * /opt/job.sh > /dev/null 2>> /var/log/job-err.log
Visualizar Logs do Cron
# Debian / Ubuntu (syslog)
grep CRON /var/log/syslog
# RHEL / CentOS
cat /var/log/cron
# journalctl (systemd)
journalctl -u cron --since "1 hour ago"
Agendamentos Comuns
Padrões do Dia a Dia
| 0 * * * * | A cada hora (no início) |
| */5 * * * * | A cada 5 minutos |
| */30 * * * * | A cada 30 minutos |
| 0 0 * * * | Todo dia à meia-noite |
| 0 6 * * 1 | Toda segunda-feira às 6h |
| 0 0 1,15 * * | Dia 1 e 15 do mês |
| 0 0 * * 5 | Toda sexta-feira à meia-noite |
| 0 0 1 1 * | Todo dia 1 de janeiro |
Comandos crontab
Gerenciar Crontabs
crontab -e # edit your crontab
crontab -l # list your crontab
crontab -r # remove your crontab
crontab -u alice -l # list another user's (root)
crontab /path/to/file # install crontab from file
Locais de Crontab do Sistema
| /etc/crontab | Crontab do sistema (tem campo de usuário) |
| /etc/cron.d/ | Arquivos cron drop-in |
| /etc/cron.daily/ | Scripts executados diariamente |
| /etc/cron.hourly/ | Scripts executados por hora |
| /etc/cron.weekly/ | Scripts executados semanalmente |
| /etc/cron.monthly/ | Scripts executados mensalmente |
| /var/spool/cron/ | Armazenamento de crontab por usuário |
Dicas
Boas Práticas
| Use caminhos absolutos | O PATH do cron é mínimo; sempre use caminhos completos |
| Redirecione a saída | Evite floods de e-mail com > /dev/null 2>&1 |
| Arquivos de lock | Use flock para evitar execuções sobrepostas |
| Teste antes | Execute o comando manualmente antes de agendar |
| Use MAILTO | Defina MAILTO="" para suprimir todo e-mail |
| Verifique o fuso horário | Cron usa horário do sistema; verifique com date |
Evitando Sobreposição com flock
# only run if not already running
* * * * * /usr/bin/flock -n /tmp/job.lock /opt/job.sh