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").
- Como ler e escrever uma linha do crontab, campo por campo.
- Os comandos
crontab -e,-le-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
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ímbolo | Significa | Exemplo | Lê-se |
|---|---|---|---|
* | Todos os valores | * * * * * | todo minuto |
, | Lista | 0 8,12,18 * * * | às 8h, 12h e 18h |
- | Intervalo | 0 9-17 * * * | de hora em hora, das 9h às 17h |
/ | "A cada" | */15 * * * * | a cada 15 minutos |
Exemplos prontos
| Linha | Quando roda |
|---|---|
*/5 * * * * | A cada 5 minutos |
0 * * * * | Toda hora cheia (8h00, 9h00…) |
0 2 * * * | Todo dia às 2h |
30 7 * * 1-5 | Dias úteis às 7h30 |
0 8 * * 1 | Toda segunda às 8h |
0 0 1 * * | Dia 1 de cada mês, à meia-noite |
0 3 * * 0 | Todo domingo às 3h |
15 14 1 1 * | 1º de janeiro às 14h15 |
0 9-18/3 * * * | Às 9h, 12h, 15h e 18h |
Atalhos com @
| Atalho | Equivale a | Quando roda |
|---|---|---|
@reboot | (não tem) | Uma vez, quando o computador liga |
@hourly | 0 * * * * | Toda hora |
@daily | 0 0 * * * | Todo dia à meia-noite |
@weekly | 0 0 * * 0 | Todo domingo à meia-noite |
@monthly | 0 0 1 * * | Todo dia 1 à meia-noite |
@yearly | 0 0 1 1 * | 1º de janeiro à meia-noite |
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.
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
-
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
-
Abra a agenda com
crontab -ee 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/sho expande, mas não funciona nas variáveis do topo do crontab (PATH=~/binfica 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.
-
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
syslogprova que o cron tentou rodar o comando. Se o comando falhou, o motivo estará no seubackup.log. Por isso o redirecionamento é tão importante.
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:
| Item | No seu terminal | No cron |
|---|---|---|
| Shell | bash | /bin/sh (mais simples) |
PATH | Várias pastas, incluindo ~/.local/bin e /snap/bin | Só /usr/bin:/bin |
| Pasta atual | Onde você estiver | A sua pasta pessoal |
~/.bashrc, aliases | Carregados | Não são carregados |
| Saída do comando | Aparece na tela | Some, 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
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
| Forma | Onde | Melhor quando… |
|---|---|---|
| crontab do usuário | crontab -e | Tarefas suas, que rodam como você. É o mais comum. |
Arquivo em /etc/cron.d/ | sudo nano /etc/cron.d/meu-app | Tarefas do sistema ou de um programa. Tem uma coluna a mais: o usuário. |
Pastas /etc/cron.daily, weekly, monthly | Copie 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 systemd | Arquivos .timer | Precisa de logs no journalctl, dependências ou executar o que foi perdido (veja Criar um Serviço). |
at | echo "comando" | at 22:00 | Uma 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.
-
O cron está ligado?
$ systemctl is-active cron active
-
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
-
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. -
O comando falhou? Sem redirecionamento, a mensagem de erro se perde. Acrescente
>> /home/ana/cron.log 2>&1e espere a próxima execução. Os erros mais comuns que aparecem no log:Mensagem no log Causa Solução /bin/sh: 1: node: not foundO programa está fora do PATHdo cronUse o caminho completo ( which nodemostra) ou definaPATH=no topo/bin/sh: 1: /home/ana/bin/backup.sh: Permission deniedScript sem permissão de execução chmod +x ~/bin/backup.sh/bin/sh: 1: ~/bin/backup.sh: not foundCaminho com ~ou relativoEscreva /home/ana/bin/backup.shtar: Documentos: Cannot stat: No such file or directoryO script supõe estar em outra pasta Use caminhos absolutos dentro do script -
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'
$ 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).
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
| Comando | O que faz |
|---|---|
crontab -e | Edita a sua agenda |
crontab -l | Mostra a sua agenda |
crontab -r | Apaga a agenda inteira, sem perguntar |
crontab -ri | Apaga, pedindo confirmação |
crontab arquivo | Substitui a agenda pelo conteúdo do arquivo |
sudo crontab -u joao -l | Mostra a agenda de outro usuário |
sudo crontab -e | Edita a agenda do root |
select-editor | Troca o editor usado pelo crontab -e |
grep CRON /var/log/syslog | Mostra o que o cron executou |
Exercícios
1. Todo dia às 23h
Complete os cinco campos para rodar todo dia às 23h00:
2. A cada 10 minutos
Complete o campo do minuto:
3. Guardar a saída
Complete para acrescentar a saída e os erros no arquivo de log:
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 -eedita,-llista e-rapaga 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/she não lê o.bashrc. grep CRON /var/log/syslogmostra se a tarefa rodou; o seu log mostra se deu certo.