Ubuntu cron

O cron executa comandos sozinho, em horários marcados: "todo dia às 2h, faça backup", "a cada 5 minutos, confira o disco". O nome vem do grego chronos, "tempo". Você escreve a agenda num arquivo chamado crontab (cron table, "tabela do cron").

Você vai aprender
  • Como ler e escrever uma linha do crontab, campo por campo.
  • Os comandos crontab -e, -l e -r (e por que o -r é perigoso).
  • Onde ver se a tarefa rodou e como guardar a saída dela num log.
  • Por que um script que funciona no terminal pode falhar no cron, e como resolver.

Antes, leia Primeiro Script. Os exemplos rodam na máquina fictícia notebook, com a usuária ana.


Como o cron funciona

O cron é um serviço: um programa que fica rodando em segundo plano desde que o computador liga. A cada minuto, ele acorda, olha as agendas de todos os usuários e executa o que estiver marcado para aquele minuto. No Ubuntu ele já vem instalado e ligado:

$ systemctl is-active cron
active

Cada usuário tem a sua agenda. As tarefas da ana rodam como a ana, com as permissões dela. Tarefas do sistema ficam em arquivos separados, que você verá mais abaixo.


Ver e editar a sua agenda

crontab -l: listar

O -l (de list) mostra a sua agenda. Na primeira vez, ela não existe:

$ crontab -l
no crontab for ana

crontab -e: editar

O -e (de edit) abre a agenda num editor de texto. Na primeira vez, o Ubuntu pergunta qual editor usar:

$ crontab -e
no crontab for ana - using an empty one
Select an editor.  To change later, run select-editor again.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.tiny
  3. /bin/ed

Choose 1-3 [1]: 1                                   « Enter ou 1 escolhe o nano

Escolha o nano, o mais fácil (veja nano e vim). O arquivo abre com um texto explicativo, todo em linhas que começam com # (comentários). Vá até o fim, escreva sua tarefa, salve com Ctrl+O, Enter e saia com Ctrl+X. Se estiver tudo certo, o cron confirma:

$ crontab -e
crontab: installing new crontab                     « a agenda foi gravada
$ crontab -l
# m h  dom mon dow   command
30 2 * * * /home/ana/bin/backup.sh
Não edite o arquivo da agenda diretamente

As agendas ficam em /var/spool/cron/crontabs/, mas não mexa lá: use sempre crontab -e. Ele confere se as linhas estão certas antes de gravar.


Anatomia de uma linha do crontab

Cada linha é uma tarefa: cinco campos de tempo, separados por espaço, e depois o comando. Este desenho é o mesmo que aparece nos comentários do /etc/crontab:

.---------------- minuto        (0 - 59)
|  .------------- hora          (0 - 23)
|  |  .---------- dia do mês    (1 - 31)
|  |  |  .------- mês           (1 - 12 ou jan, feb, mar…)
|  |  |  |  .---- dia da semana (0 - 7: 0 e 7 = domingo, 1 = segunda… ou sun, mon…)
|  |  |  |  |
*  *  *  *  *  comando a executar
30
Minuto: aos 30 minutos.
2
Hora: das 2h. Junto com o minuto: 2h30.
*
Dia do mês: qualquer um. O asterisco significa "todos".
*
Mês: qualquer um.
1-5
Dia da semana: de segunda (1) a sexta (5).
/home/ana/bin/backup.sh
O comando, com caminho completo.

Lendo tudo junto: "às 2h30, de segunda a sexta, rode o backup".

Os símbolos dos campos

SímboloSignificaExemploLê-se
*Todos os valores* * * * *todo minuto
,Lista0 8,12,18 * * *às 8h, 12h e 18h
-Intervalo0 9-17 * * *de hora em hora, das 9h às 17h
/"A cada"*/15 * * * *a cada 15 minutos

Exemplos prontos

LinhaQuando roda
*/5 * * * *A cada 5 minutos
0 * * * *Toda hora cheia (8h00, 9h00…)
0 2 * * *Todo dia às 2h
30 7 * * 1-5Dias úteis às 7h30
0 8 * * 1Toda segunda às 8h
0 0 1 * *Dia 1 de cada mês, à meia-noite
0 3 * * 0Todo domingo às 3h
15 14 1 1 *1º de janeiro às 14h15
0 9-18/3 * * *Às 9h, 12h, 15h e 18h

Atalhos com @

AtalhoEquivale aQuando roda
@reboot(não tem)Uma vez, quando o computador liga
@hourly0 * * * *Toda hora
@daily0 0 * * *Todo dia à meia-noite
@weekly0 0 * * 0Todo domingo à meia-noite
@monthly0 0 1 * *Todo dia 1 à meia-noite
@yearly0 0 1 1 *1º de janeiro à meia-noite
Dia do mês e dia da semana juntos: é "OU"

0 9 13 * 5 não é "sexta-feira 13". Quando os dois campos de dia têm valores, o cron roda se qualquer um bater: todo dia 13 e também toda sexta.

Confira antes de gravar

O site crontab.guru traduz uma linha do cron para inglês ("At 02:30 on every day-of-week from Monday through Friday"). É ótimo para conferir.


Exemplo completo: backup todo dia às 2h

  1. Tenha um script que funciona. Teste no terminal primeiro:

    #!/usr/bin/env bash
    destino="/home/ana/backups/docs-$(date +%F).tar.gz"
    mkdir -p /home/ana/backups
    tar -czf "$destino" -C /home/ana Documentos
    echo "$(date '+%F %T') backup criado: $destino"
    $ chmod +x ~/bin/backup.sh
    $ ~/bin/backup.sh
    2026-10-15 10:30:00 backup criado: /home/ana/backups/docs-2026-10-15.tar.gz
  2. Abra a agenda com crontab -e e acrescente no fim:

    0 2 * * * /home/ana/bin/backup.sh >> /home/ana/backup.log 2>&1
    0 2 * * *
    Todo dia às 2h00.
    /home/ana/bin/backup.sh
    O script, com caminho completo. Nada de caminho relativo: o cron não roda na pasta que você imagina. O ~ até funciona aqui, porque o /bin/sh o expande, mas não funciona nas variáveis do topo do crontab (PATH=~/bin fica literal). Na dúvida, escreva o caminho inteiro.
    >> /home/ana/backup.log
    Acrescenta o que o script escreve num arquivo de log.
    2>&1
    Manda também as mensagens de erro para o mesmo log.
  3. No dia seguinte, confira o log e o registro do sistema:

    $ cat ~/backup.log
    2026-10-16 02:00:01 backup criado: /home/ana/backups/docs-2026-10-16.tar.gz
    $ grep CRON /var/log/syslog | tail -1
    2026-10-16T02:00:01.512694-03:00 notebook CRON[32051]: (ana) CMD (/home/ana/bin/backup.sh >> /home/ana/backup.log 2>&1)

    A linha do syslog prova que o cron tentou rodar o comando. Se o comando falhou, o motivo estará no seu backup.log. Por isso o redirecionamento é tão importante.

Teste com "a cada minuto"

Para não esperar até as 2h, comece com * * * * *, confira o log após um ou dois minutos e só então troque pelo horário real.


O ambiente do cron é diferente do seu terminal

Esta é a causa número 1 de "funciona no terminal, mas não no cron". O cron roda seus comandos num ambiente mínimo:

ItemNo seu terminalNo cron
Shellbash/bin/sh (mais simples)
PATHVárias pastas, incluindo ~/.local/bin e /snap/binSó /usr/bin:/bin
Pasta atualOnde você estiverA sua pasta pessoal
~/.bashrc, aliasesCarregadosNão são carregados
Saída do comandoAparece na telaSome, a não ser que você redirecione

Você pode definir variáveis no topo do crontab, e elas valem para as linhas de baixo:

PATH=/usr/local/bin:/usr/bin:/bin:/snap/bin
SHELL=/bin/bash

0 2 * * * /home/ana/bin/backup.sh >> /home/ana/backup.log 2>&1
O sinal % é especial no crontab

Na linha do comando, o cron troca % por uma quebra de linha. date +%F direto no crontab quebra o comando. Escreva \% (date +\%F) ou, melhor, coloque o comando dentro de um script.


Formas diferentes de agendar

FormaOndeMelhor quando…
crontab do usuáriocrontab -eTarefas suas, que rodam como você. É o mais comum.
Arquivo em /etc/cron.d/sudo nano /etc/cron.d/meu-appTarefas do sistema ou de um programa. Tem uma coluna a mais: o usuário.
Pastas /etc/cron.daily, weekly, monthlyCopie um script executável para láNão importa o horário exato, só "uma vez por dia". No desktop, o anacron roda depois o que foi perdido com o computador desligado.
Timer do systemdArquivos .timerPrecisa de logs no journalctl, dependências ou executar o que foi perdido (veja Criar um Serviço).
atecho "comando" | at 22:00Uma vez só, num horário. Não vem instalado: sudo apt install at.

Nos arquivos de sistema, a linha tem o usuário entre o horário e o comando. Este é um trecho real do /etc/crontab do Ubuntu:

$ grep cron.daily /etc/crontab
25 6	* * *	root	test -x /usr/sbin/anacron || { cd / && run-parts --report /etc/cron.daily; }

Apagar a agenda: cuidado com o -r

crontab -r apaga tudo, sem perguntar

O r fica ao lado do e no teclado. Um erro de digitação e todas as suas tarefas somem. Antes de mexer, faça uma cópia:

$ crontab -l > ~/crontab-backup.txt
$ crontab -r
$ crontab -l
no crontab for ana                                  « a agenda inteira sumiu
$ crontab ~/crontab-backup.txt
$ crontab -l
# m h  dom mon dow   command
0 2 * * * /home/ana/bin/backup.sh >> /home/ana/backup.log 2>&1

Na sessão acima: a primeira linha guarda uma cópia, o -r apaga tudo e crontab ~/crontab-backup.txt restaura a cópia. Para apagar com confirmação, use crontab -ri. Para remover só uma tarefa, use crontab -e e apague a linha.


Quando não funciona: "meu cron não roda"

Siga estes passos na ordem. Quase sempre o problema aparece até o passo 4.

  1. O cron está ligado?

    $ systemctl is-active cron
    active
  2. A linha está na agenda certa? Uma tarefa que precisa de root não roda na agenda da ana, e vice-versa.

    $ crontab -l
    # m h  dom mon dow   command
    0 2 * * * /home/ana/bin/backup.sh >> /home/ana/backup.log 2>&1
    $ sudo crontab -l
    no crontab for root                                 « a agenda do root é outra
  3. O cron tentou executar? Procure a linha no registro:

    $ grep CRON /var/log/syslog | grep ana | tail -3
    $ journalctl -u cron --since today

    Se não houver nenhuma linha (ana) CMD, o horário está errado ou a linha tem erro.

  4. O comando falhou? Sem redirecionamento, a mensagem de erro se perde. Acrescente >> /home/ana/cron.log 2>&1 e espere a próxima execução. Os erros mais comuns que aparecem no log:

    Mensagem no logCausaSolução
    /bin/sh: 1: node: not foundO programa está fora do PATH do cronUse o caminho completo (which node mostra) ou defina PATH= no topo
    /bin/sh: 1: /home/ana/bin/backup.sh: Permission deniedScript sem permissão de execuçãochmod +x ~/bin/backup.sh
    /bin/sh: 1: ~/bin/backup.sh: not foundCaminho com ~ ou relativoEscreva /home/ana/bin/backup.sh
    tar: Documentos: Cannot stat: No such file or directoryO script supõe estar em outra pastaUse caminhos absolutos dentro do script
  5. Teste no mesmo ambiente do cron. Este comando roda o script com o ambiente mínimo do cron, e mostra o erro na hora:

    $ env -i HOME=/home/ana PATH=/usr/bin:/bin /bin/sh -c '/home/ana/bin/backup.sh'
"bad minute" ao salvar
$ crontab -e
"/tmp/crontab.Hk2v1Q/crontab":23: bad minute
errors in crontab file, can't install.
Do you want to retry the same edit? (y/n)

O que aconteceu: o minuto está fora do intervalo 0–59 (por exemplo, 60) ou com um símbolo inválido. O número depois dos dois pontos é a linha com problema.

Como resolver: responda y para voltar ao editor e corrigir. Variações: bad hour, bad day-of-month, bad month, bad day-of-week (por exemplo, quando falta um dos cinco campos).

A tarefa roda, mas na hora errada

O que aconteceu: o cron usa o fuso horário do sistema. Em servidores na nuvem, ele costuma ser UTC, 3 horas à frente de Brasília.

Como resolver: confira com timedatectl. Para mudar: sudo timedatectl set-timezone America/Sao_Paulo.


Referência rápida

ComandoO que faz
crontab -eEdita a sua agenda
crontab -lMostra a sua agenda
crontab -rApaga a agenda inteira, sem perguntar
crontab -riApaga, pedindo confirmação
crontab arquivoSubstitui a agenda pelo conteúdo do arquivo
sudo crontab -u joao -lMostra a agenda de outro usuário
sudo crontab -eEdita a agenda do root
select-editorTroca o editor usado pelo crontab -e
grep CRON /var/log/syslogMostra o que o cron executou

Exercícios

1. Todo dia às 23h

Complete os cinco campos para rodar todo dia às 23h00:

/home/ana/bin/limpar.sh

2. A cada 10 minutos

Complete o campo do minuto:

* * * * /home/ana/bin/verificar.sh

3. Guardar a saída

Complete para acrescentar a saída e os erros no arquivo de log:

0 2 * * * /home/ana/bin/backup.sh /home/ana/backup.log 2>&1

4. Quando roda a linha 30 7 * * 1-5?

5. Um script roda no terminal, mas no cron aparece node: not found. Qual a causa mais provável?


Resumo

  • Cada linha do crontab tem 5 campos de tempo (minuto, hora, dia, mês, dia da semana) e um comando.
  • crontab -e edita, -l lista e -r apaga tudo sem perguntar: faça cópia antes.
  • Use caminhos absolutos e redirecione a saída: >> /home/ana/log 2>&1.
  • O cron tem PATH=/usr/bin:/bin, usa /bin/sh e não lê o .bashrc.
  • grep CRON /var/log/syslog mostra se a tarefa rodou; o seu log mostra se deu certo.