CRON — AGENDAMENTO DE TAREFAS NO LINUX Backups 0 2 * * * backup.sh Limpeza 0 3 * * 0 cleanup.sh Monitoramento */5 * * * * check.sh Renovar SSL 0 4 1 * * certbot Automatize tarefas recorrentes com agendamento preciso baseado em tempo

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 (nano ou vim)

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

OperadorSignificadoExemplo
*Qualquer valor* * * * * = a cada minuto
,Lista de valores1,15,30 * * * * = minutos 1, 15, 30
-Faixa de valores1-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:

StringEquivalenteDescricao
@rebootN/AExecutar uma vez na inicializacao
@yearly0 0 1 1 *Uma vez por ano (1 de janeiro, meia-noite)
@monthly0 0 1 * *Uma vez por mes (dia 1, meia-noite)
@weekly0 0 * * 0Uma vez por semana (domingo, meia-noite)
@daily0 0 * * *Uma vez por dia (meia-noite)
@hourly0 * * * *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 -r exclui todos os seus cron jobs imediatamente sem confirmacao e sem possibilidade de desfazer. Se voce deseja remover apenas uma entrada, use crontab -e e 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:

DiretorioFrequencia
/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

  1. O script deve ser executavel: chmod +x /etc/cron.daily/meuscript
  2. O script nao deve ter extensao de arquivo (.sh, .py, etc.) — run-parts ignora arquivos com pontos no nome por padrao em muitos sistemas
  3. 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 anacron em 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:

  1. Se /etc/cron.allow existir, apenas os usuarios listados podem usar cron
  2. Se /etc/cron.allow nao existir mas /etc/cron.deny existir, todos exceto os usuarios listados podem usar cron
  3. 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

AgendamentoExpressaoDescricao
A cada minuto* * * * *Executa a cada minuto de cada dia
A cada 5 minutos*/5 * * * *Executa nos minutos 0, 5, 10, 15, …
A cada hora0 * * * *Executa no inicio de cada hora
A cada 6 horas0 */6 * * *Executa as 0:00, 6:00, 12:00, 18:00
Diario a meia-noite0 0 * * *Executa uma vez por dia as 00:00
Diario as 2:30 AM30 2 * * *Executa uma vez por dia as 02:30
Toda segunda as 9 AM0 9 * * 1Executa semanalmente na segunda de manha
Dias uteis as 8 AM0 8 * * 1-5Segunda a sexta as 08:00
Primeiro do mes0 0 1 * *Meia-noite do 1o de cada mes
A cada trimestre0 0 1 1,4,7,10 *Meia-noite em 1 jan, abr, jul, out
Duas vezes ao dia0 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@rebootExecuta 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.allow e /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.