Automatizar tarefas repetitivas e uma parte fundamental da administracao de servidores Linux. Seja para backups noturnos de banco de dados, rotacao semanal de logs ou verificacoes de saude a cada minuto, o cron e o agendador de tarefas baseado em tempo que cuida de tudo. Ele tem sido parte central dos sistemas tipo Unix desde os anos 70, e toda distribuicao Linux o inclui.
Este guia cobre tudo, desde a sintaxe basica do crontab ate tecnicas avancadas como gerenciamento de variaveis de ambiente, registro de saida, restricoes de seguranca e padroes de agendamento do mundo real. Ao final, voce sera capaz de agendar, depurar e manter cron jobs com confianca em qualquer sistema Linux.
Pre-requisitos
Antes de comecar, certifique-se de ter o seguinte:
- Um sistema Linux (Ubuntu, Debian, CentOS, RHEL ou qualquer distribuicao)
- Um terminal com acesso shell (local ou SSH)
- Uma conta de usuario nao-root com privilegios
sudo - Familiaridade basica com a linha de comando e um editor de texto (
nanoouvim)
Verifique se o cron esta instalado e rodando:
# Check if cron is active
systemctl status cron
# On RHEL/CentOS, the service is called crond
systemctl status crond
Se o cron nao estiver instalado, instale-o:
# Debian/Ubuntu
sudo apt update && sudo apt install -y cron
# RHEL/CentOS/Fedora
sudo dnf install -y cronie
# Enable and start the service
sudo systemctl enable cron && sudo systemctl start cron
O Que E Cron?
Cron e um daemon de agendamento de tarefas baseado em tempo encontrado em praticamente todos os sistemas Unix e Linux. O nome vem da palavra grega chronos (tempo). O cron le arquivos de configuracao chamados crontabs (tabelas cron) e executa comandos em intervalos especificados — uma vez por minuto, uma vez por hora, uma vez por dia, ou qualquer combinacao de campos de tempo que voce definir.
O cron resolve um problema simples, mas critico: tarefas que precisam acontecer regularmente nao devem depender de alguem lembrar de executa-las. Backups automatizados, limpeza de logs, monitoramento do sistema, renovacao de certificados e manutencao de banco de dados sao todas tarefas que pertencem ao cron.
Como o Cron Funciona
Entender a arquitetura ajuda a depurar problemas mais rapidamente.
O Daemon Cron
O daemon cron (crond ou cron) inicia na inicializacao e roda continuamente em segundo plano. A cada minuto, ele acorda e verifica todos os arquivos crontab em busca de tarefas agendadas para o momento atual. Se encontrar uma correspondencia, executa o comando.
# Verify the daemon is running
ps aux | grep cron
Crontabs de Usuario
Cada usuario no sistema pode ter seu proprio crontab. Estes sao armazenados em /var/spool/cron/crontabs/ (Debian/Ubuntu) ou /var/spool/cron/ (RHEL/CentOS). Voce nunca deve editar esses arquivos diretamente — sempre use o comando crontab.
O Crontab do Sistema
O arquivo /etc/crontab e o crontab em nivel de sistema. Diferente dos crontabs de usuario, ele inclui um campo de nome de usuario entre os campos de tempo e o comando:
# /etc/crontab format (note the username field)
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || run-parts --report /etc/cron.daily
O Diretorio /etc/cron.d/
Mantenedores de pacotes e administradores de sistema podem colocar arquivos cron individuais em /etc/cron.d/. Estes seguem o mesmo formato que /etc/crontab (com o campo de nome de usuario). Esta e a forma preferida de adicionar cron jobs em nivel de sistema porque os arquivos sao isolados e faceis de gerenciar.
Sintaxe do Crontab Explicada
Cada entrada do crontab e uma unica linha com cinco campos de tempo e data seguidos do comando a executar:
┌───────────── minuto (0–59)
│ ┌───────────── hora (0–23)
│ │ ┌───────────── dia do mes (1–31)
│ │ │ ┌───────────── mes (1–12 ou jan–dec)
│ │ │ │ ┌───────────── dia da semana (0–7, 0 e 7 = Domingo, ou sun–sat)
│ │ │ │ │
* * * * * comando_a_executar
Valores de Campo e Operadores
| Operador | Significado | Exemplo |
|---|---|---|
* | Qualquer valor | * * * * * = a cada minuto |
, | Lista de valores | 1,15,30 * * * * = minutos 1, 15, 30 |
- | Faixa de valores | 1-5 * * * * = minutos 1 a 5 |
/ | Valores de passo | */10 * * * * = a cada 10 minutos |
Exemplos de Especificacoes de Tempo
# Every minute
* * * * * /caminho/para/script.sh
# Every day at 2:30 AM
30 2 * * * /caminho/para/script.sh
# Every Monday at 5:00 PM
0 17 * * 1 /caminho/para/script.sh
# Every 15 minutes
*/15 * * * * /caminho/para/script.sh
# First day of every month at midnight
0 0 1 * * /caminho/para/script.sh
# Every weekday (Mon-Fri) at 8:00 AM
0 8 * * 1-5 /caminho/para/script.sh
# Every 6 hours
0 */6 * * * /caminho/para/script.sh
# January 1st at midnight
0 0 1 1 * /caminho/para/script.sh
Strings Especiais
O cron tambem suporta strings abreviadas para agendamentos comuns:
| String | Equivalente | Descricao |
|---|---|---|
@reboot | N/A | Executar uma vez na inicializacao |
@yearly | 0 0 1 1 * | Uma vez por ano (1 de janeiro, meia-noite) |
@monthly | 0 0 1 * * | Uma vez por mes (dia 1, meia-noite) |
@weekly | 0 0 * * 0 | Uma vez por semana (domingo, meia-noite) |
@daily | 0 0 * * * | Uma vez por dia (meia-noite) |
@hourly | 0 * * * * | Uma vez por hora (minuto 0) |
# Run a script at every system reboot
@reboot /home/usuario/tarefas-inicio.sh
# Daily log rotation
@daily /usr/local/bin/rotacionar-logs.sh
Gerenciamento do Crontab
O comando crontab e sua interface principal para criar e gerenciar tarefas agendadas.
Editar Seu Crontab
# Open your crontab in the default editor
crontab -e
# Edit another user's crontab (requires root)
sudo crontab -u www-data -e
Na primeira vez que voce executar crontab -e, ele pedira para escolher um editor. Selecione nano se nao estiver familiarizado com vim.
Listar Tarefas Atuais
# List your cron jobs
crontab -l
# List another user's cron jobs
sudo crontab -u www-data -l
# List the system crontab
cat /etc/crontab
Remover um Crontab
# Remove your entire crontab (use with caution)
crontab -r
# Interactive removal -- asks for confirmation
crontab -i -r
# Remove another user's crontab
sudo crontab -u username -r
Aviso:
crontab -rexclui todos os seus cron jobs imediatamente sem confirmacao e sem possibilidade de desfazer. Se voce deseja remover apenas uma entrada, usecrontab -ee delete a linha especifica.
Fazer Backup do Seu Crontab
Sempre faca backup do seu crontab antes de fazer alteracoes:
# Save current crontab to a file
crontab -l > ~/crontab-backup-$(date +%Y%m%d).txt
# Restore from backup
crontab ~/crontab-backup-20260124.txt
Variaveis de Ambiente no Cron
Uma das causas mais comuns de falhas em cron jobs e o ambiente. Os cron jobs rodam com um ambiente minimo que e muito diferente do seu shell interativo. Seus arquivos ~/.bashrc, ~/.bash_profile e scripts de login nao sao carregados.
O Ambiente Padrao do Cron
Por padrao, o cron tipicamente define apenas:
SHELL=/bin/sh
PATH=/usr/bin:/bin
HOME=/home/username
LOGNAME=username
Note que /usr/local/bin, /snap/bin e outros diretorios que voce esperaria no seu PATH estao ausentes. E por isso que um comando que funciona perfeitamente no seu terminal pode falhar silenciosamente no cron.
Definir Variaveis no Crontab
Voce pode definir variaveis de ambiente no topo do seu crontab:
# Set a complete PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# Set the shell
SHELL=/bin/bash
# Set email for cron output
MAILTO=admin@example.com
# Your cron jobs below
0 2 * * * /home/usuario/backup.sh
Usar Caminhos Completos nos Comandos
A abordagem mais segura e sempre usar caminhos absolutos para cada comando nos seus cron jobs:
# Bad -- relies on PATH
0 2 * * * mysqldump mydb > /tmp/backup.sql
# Good -- uses full path
0 2 * * * /usr/bin/mysqldump mydb > /tmp/backup.sql
Voce pode encontrar o caminho completo de qualquer comando com which:
which mysqldump
# Output: /usr/bin/mysqldump
which python3
# Output: /usr/bin/python3
Saida e Registro de Logs
Por padrao, o cron envia por email qualquer saida (stdout e stderr) de uma tarefa para a caixa de correio local do proprietario do crontab. Na maioria dos servidores, isso nao e lido. O registro adequado de logs e essencial.
Redirecionar Saida para um Arquivo de Log
# Redirect stdout and stderr to a log file
0 2 * * * /home/usuario/backup.sh >> /var/log/backup.log 2>&1
# Separate stdout and stderr into different files
0 2 * * * /home/usuario/backup.sh >> /var/log/backup.log 2>> /var/log/backup-errors.log
# Discard all output (silent execution)
0 2 * * * /home/usuario/backup.sh > /dev/null 2>&1
Boa Pratica: Nunca descarte a saida durante o desenvolvimento e testes. Quando seu cron job estiver comprovadamente estavel, voce pode redirecionar apenas stderr e descartar stdout:
command > /dev/null 2>> /var/log/errors.log.
Usar MAILTO para Notificacoes por Email
A variavel MAILTO controla para onde o cron envia a saida das tarefas:
# Send output to a specific email address
MAILTO=admin@example.com
# Send to multiple recipients
MAILTO=admin@example.com,devops@example.com
# Disable email entirely
MAILTO=""
# All jobs below inherit the MAILTO setting
0 2 * * * /home/usuario/backup.sh
Para o email funcionar, seu servidor precisa de um agente de transferencia de email (MTA) funcional como postfix ou sendmail.
Verificar o Log do Cron
O cron registra cada execucao de tarefa no syslog. Este e seu primeiro recurso ao depurar:
# View cron entries in syslog (Debian/Ubuntu)
grep CRON /var/log/syslog
# View cron entries on RHEL/CentOS
grep CRON /var/log/cron
# Follow the log in real time
tail -f /var/log/syslog | grep CRON
Uma entrada tipica do log se parece com:
Jan 24 02:00:01 server CRON[12345]: (user) CMD (/home/user/backup.sh)
Isso confirma que a tarefa foi disparada. Se o comando estiver ausente do log, o problema esta na sintaxe do crontab ou no daemon em si.
Exemplos Praticos
Exemplo 1: Backup Automatizado de Banco de Dados
# Back up a MySQL database every night at 2:00 AM
0 2 * * * /usr/bin/mysqldump -u dbuser -p'SecurePass123' mydb | /usr/bin/gzip > /backup/mysql/mydb-$(date +\%Y\%m\%d).sql.gz 2>> /var/log/mysql-backup.log
Nota: No crontab, voce deve escapar os sinais de porcentagem (
%) com uma barra invertida (\%) porque o cron interpreta%como uma quebra de linha. Este e um dos erros mais comuns com cron.
Uma abordagem mais robusta usa um script wrapper:
#!/bin/bash
# /home/usuario/scripts/mysql-backup.sh
BACKUP_DIR="/backup/mysql"
DB_NAME="mydb"
DATE=$(date +%Y%m%d_%H%M%S)
LOG="/var/log/mysql-backup.log"
echo "[$DATE] Starting backup of $DB_NAME" >> "$LOG"
/usr/bin/mysqldump -u dbuser -p'SecurePass123' "$DB_NAME" | /usr/bin/gzip > "$BACKUP_DIR/${DB_NAME}-${DATE}.sql.gz"
if [ $? -eq 0 ]; then
echo "[$DATE] Backup completed successfully" >> "$LOG"
else
echo "[$DATE] ERROR: Backup failed" >> "$LOG"
fi
# Delete backups older than 30 days
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +30 -delete
# Crontab entry for the wrapper script
0 2 * * * /home/usuario/scripts/mysql-backup.sh
Exemplo 2: Limpeza de Logs
# Delete log files older than 7 days every Sunday at 3:00 AM
0 3 * * 0 /usr/bin/find /var/log/myapp -name "*.log" -mtime +7 -delete >> /var/log/cleanup.log 2>&1
# Compress logs older than 1 day, every day at 4:00 AM
0 4 * * * /usr/bin/find /var/log/myapp -name "*.log" -mtime +1 ! -name "*.gz" -exec /usr/bin/gzip {} \; 2>> /var/log/cleanup-errors.log
Exemplo 3: Monitoramento do Sistema
# Check disk usage every 5 minutes, alert if above 90%
*/5 * * * * /home/usuario/scripts/disk-check.sh
O script de monitoramento:
#!/bin/bash
# /home/usuario/scripts/disk-check.sh
THRESHOLD=90
df -H | awk 'NR>1 {print $5 " " $6}' | while read usage mount; do
percent=$(echo "$usage" | tr -d '%')
if [ "$percent" -ge "$THRESHOLD" ]; then
echo "AVISO: Uso de disco em $mount esta em ${usage}" | \
/usr/bin/mail -s "Alerta de Disco: $mount em ${usage}" admin@example.com
fi
done
Exemplo 4: Renovacao de Certificados SSL
# Attempt certificate renewal twice daily (Let's Encrypt recommendation)
0 4,16 * * * /usr/bin/certbot renew --quiet --deploy-hook "systemctl reload nginx" >> /var/log/certbot-renew.log 2>&1
Exemplo 5: Verificacao de Atualizacoes do Sistema
# Check for available updates every morning at 6:00 AM
0 6 * * * /usr/bin/apt update -qq && /usr/bin/apt list --upgradable 2>/dev/null | /usr/bin/mail -s "Relatorio de Atualizacoes Disponiveis" admin@example.com
Diretorios do Cron
As distribuicoes Linux fornecem um conjunto de diretorios para scripts que devem ser executados em intervalos predefinidos. Simplesmente coloque um script executavel no diretorio apropriado:
| Diretorio | Frequencia |
|---|---|
/etc/cron.hourly/ | A cada hora |
/etc/cron.daily/ | Todo dia |
/etc/cron.weekly/ | Toda semana |
/etc/cron.monthly/ | Todo mes |
# List all scripts in cron.daily
ls -la /etc/cron.daily/
Requisitos para Scripts nos Diretorios Cron
- O script deve ser executavel:
chmod +x /etc/cron.daily/meuscript - O script nao deve ter extensao de arquivo (
.sh,.py, etc.) —run-partsignora arquivos com pontos no nome por padrao em muitos sistemas - O script deve comecar com um shebang apropriado:
#!/bin/bash
# Create a daily cleanup script
sudo nano /etc/cron.daily/cleanup-temp
# Add content:
#!/bin/bash
find /tmp -type f -mtime +7 -delete
# Make it executable
sudo chmod +x /etc/cron.daily/cleanup-temp
Nota: Esses diretorios sao gerenciados pelo
anacronem muitas distribuicoes, o que garante que tarefas perdidas sejam executadas depois que o sistema voltar a ficar online. Isso e particularmente util para laptops e desktops que nao ficam ligados 24/7.
Consideracoes de Seguranca
Controlar Acesso com cron.allow e cron.deny
Voce pode restringir quais usuarios tem permissao para criar cron jobs:
# /etc/cron.allow -- only listed users can use cron
echo "admin" | sudo tee /etc/cron.allow
echo "deploy" | sudo tee -a /etc/cron.allow
# /etc/cron.deny -- listed users are blocked from using cron
echo "guest" | sudo tee /etc/cron.deny
A logica e:
- Se
/etc/cron.allowexistir, apenas os usuarios listados podem usar cron - Se
/etc/cron.allownao existir mas/etc/cron.denyexistir, todos exceto os usuarios listados podem usar cron - Se nenhum dos arquivos existir, o padrao depende da distribuicao (frequentemente apenas root)
Permissoes de Arquivos
Os cron jobs rodam com as permissoes do usuario proprietario do crontab. Mantenha seus scripts seguros:
# Ensure scripts are owned by the correct user and not world-writable
chmod 750 /home/usuario/scripts/backup.sh
chown usuario:usuario /home/usuario/scripts/backup.sh
# Never store passwords in crontab -- use config files with restricted permissions
chmod 600 /home/usuario/.my.cnf
Evitar Executar Cron Jobs como Root
Sempre que possivel, crie um usuario de servico dedicado para tarefas cron:
# Create a dedicated backup user
sudo useradd -r -s /usr/sbin/nologin backupuser
# Set up its crontab
sudo crontab -u backupuser -e
Referencia Rapida de Sintaxe do Crontab
| Agendamento | Expressao | Descricao |
|---|---|---|
| A cada minuto | * * * * * | Executa a cada minuto de cada dia |
| A cada 5 minutos | */5 * * * * | Executa nos minutos 0, 5, 10, 15, … |
| A cada hora | 0 * * * * | Executa no inicio de cada hora |
| A cada 6 horas | 0 */6 * * * | Executa as 0:00, 6:00, 12:00, 18:00 |
| Diario a meia-noite | 0 0 * * * | Executa uma vez por dia as 00:00 |
| Diario as 2:30 AM | 30 2 * * * | Executa uma vez por dia as 02:30 |
| Toda segunda as 9 AM | 0 9 * * 1 | Executa semanalmente na segunda de manha |
| Dias uteis as 8 AM | 0 8 * * 1-5 | Segunda a sexta as 08:00 |
| Primeiro do mes | 0 0 1 * * | Meia-noite do 1o de cada mes |
| A cada trimestre | 0 0 1 1,4,7,10 * | Meia-noite em 1 jan, abr, jul, out |
| Duas vezes ao dia | 0 4,16 * * * | Executa as 4:00 AM e 4:00 PM |
| A cada 30 minutos | */30 * * * * | Executa nos :00 e :30 de cada hora |
| Na reinicializacao | @reboot | Executa uma vez quando o sistema inicia |
Solucao de Problemas
Problema: O Cron Job Funciona no Terminal mas Nao no Cron
Causa: Diferencas no PATH. Seu shell interativo tem um PATH completo; o cron nao.
Solucao: Use caminhos absolutos para todos os comandos, ou defina PATH no topo do seu crontab:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Problema: Sinais de Porcentagem Quebrando Comandos
Causa: O cron interpreta % como um caractere de quebra de linha.
Solucao: Escape todos os sinais de porcentagem com uma barra invertida:
# Wrong
0 2 * * * /usr/bin/date +%Y%m%d
# Correct
0 2 * * * /usr/bin/date +\%Y\%m\%d
Problema: Erros de Permissao Negada
Causa: O script nao e executavel ou o usuario nao tem acesso.
Solucao:
# Make the script executable
chmod +x /home/usuario/scripts/meuscript.sh
# Verify ownership
ls -la /home/usuario/scripts/meuscript.sh
Problema: Problemas de Fuso Horario
Causa: O cron usa o fuso horario do sistema por padrao. Se seu servidor estiver configurado em UTC mas voce espera hora local, as tarefas executam em horarios inesperados.
Solucao:
# Check system timezone
timedatectl
# Set timezone
sudo timedatectl set-timezone America/Sao_Paulo
# Or set TZ in crontab for per-job timezone
TZ=America/Sao_Paulo
0 9 * * * /home/usuario/relatorio-matinal.sh
Problema: A Tarefa Executa mas Nao Produz Saida
Causa: A saida esta sendo enviada para o email local, que ninguem le, ou a saida esta sendo descartada.
Solucao: Redirecione a saida para um arquivo de log:
0 2 * * * /home/usuario/backup.sh >> /var/log/backup.log 2>&1
Problema: O Daemon Cron Nao Esta Rodando
Solucao:
# Check status
sudo systemctl status cron
# Start it
sudo systemctl start cron
# Enable at boot
sudo systemctl enable cron
Resumo
O cron e a espinha dorsal da automacao no Linux. Com cinco simples campos de tempo e um comando, voce pode agendar virtualmente qualquer tarefa para executar em qualquer intervalo. Os pontos-chave para lembrar sao:
- Sempre use caminhos absolutos para comandos em cron jobs
- Escape os sinais de porcentagem (
\%) nas entradas do crontab - Redirecione a saida para arquivos de log para depuracao e auditoria
- Defina variaveis de ambiente (especialmente PATH) no topo do seu crontab
- Faca backup do seu crontab antes de fazer alteracoes
- Verifique o syslog (
grep CRON /var/log/syslog) quando uma tarefa nao executar como esperado - Restrinja o acesso com
/etc/cron.allowe/etc/cron.deny
O cron trabalha em conjunto com outras praticas de administracao de servidores. Para proteger o servidor que roda seus cron jobs, consulte a Lista de Verificacao de Seguranca para Servidores Linux e Hardening SSH: 12 Passos para Proteger Seu Servidor Linux.