Tutorial de Linux / Agende tarefas com cron e timers do systemd
O cron atende a agendamentos simples; os timers do systemd integram a execução ao estado de serviços e ao journal. Verifique separadamente a interpretação do horário, a execução real, a saída e as falhas: o registro do agendamento, sozinho, não comprova que a tarefa funcionou.
Antes de agendar, execute e teste o comando diretamente, como na aula de script Bash. Verifique na própria máquina virtual o comportamento do gerenciador de usuário após logout e sua configuração de linger; não suponha que o registro do timer garanta execução contínua.
As referências deste exercício são instalações convencionais em máquinas virtuais Ubuntu 26.04 LTS ou Rocky Linux 9. Contêineres, WSL e outras versões podem ter serviços e pacotes diferentes. Prepare recuperação pelo console e anote as versões seguindo a aula de configuração de máquina virtual, em inglês.
Escolha entre cron e timer do systemd
| Critério | cron | timer do systemd |
|---|---|---|
| Configuração | Campos de tempo e comando | Unidades timer e service separadas |
| Verificação | Saída e logs específicos da distribuição | Estado do serviço e journal |
| Ambiente | Diferente do shell interativo | Ambiente definido para a unidade |
| Horários perdidos | cron tradicional normalmente não recupera | Considere OnCalendar com Persistent |
Pacotes e nomes do daemon variam: Ubuntu costuma usar cron; Rocky Linux usa cronie e crond. O exemplo de timer exige um gerenciador de usuário systemd disponível. Diferencie o comportamento do cron tradicional de ferramentas complementares, como anacron.
Leia os campos e o contexto de execução do cron
crontab -e edita a agenda do usuário atual. Uma linha do crontab de usuário tem cinco campos de tempo: minuto, hora, dia do mês, mês e dia da semana, seguidos pelo comando. O exemplo indica 02:15 diariamente; substitua /home/USER por caminhos absolutos reais. Em /etc/crontab há também um campo de usuário antes do comando.
15 2 * * * /bin/bash /home/USER/bin/job.sh >> /home/USER/job.log 2>&1
O cron não herda necessariamente o PATH, o diretório atual e as variáveis do terminal interativo. Use caminhos absolutos, defina o diretório de trabalho no script e não coloque segredos no texto do crontab. Restringir dia do mês e dia da semana pode aplicar uma condição OU. Confira as regras de fuso horário, horário de verão e tratamento de % no manual da implementação usada.
Crie unidades de serviço e timer do usuário
Antes de executar, confira se os arquivos linux-course-clock.service e linux-course-clock.timer já existem em ~/.config/systemd/user/ e se há unidades com esses nomes. Os comandos abaixo sobrescrevem arquivos existentes: se houver conflito, escolha outro nome de exercício e use-o de forma consistente nas duas unidades e nos comandos. A remoção ao final também deve atingir somente arquivos criados neste exercício.
O exemplo registra a data no journal do usuário a cada minuto, sem criar serviço de root. Confirme /usr/bin/date com command -v date e ajuste ExecStart se o caminho for diferente. É necessário um gerenciador systemd de usuário funcional.
mkdir -p "$HOME/.config/systemd/user"
cat > "$HOME/.config/systemd/user/linux-course-clock.service" <<'EOF'
[Unit]
Description=Linux course timestamp exercise
[Service]
Type=oneshot
ExecStart=/usr/bin/date --iso-8601=seconds
EOF
cat > "$HOME/.config/systemd/user/linux-course-clock.timer" <<'EOF'
[Unit]
Description=Run the course clock every minute
[Timer]
OnCalendar=*-*-* *:*:00
AccuracySec=1s
Persistent=true
[Install]
WantedBy=timers.target
EOF
systemd-analyze calendar '*-*-* *:*:00'
systemctl --user daemon-reload
systemctl --user enable --now linux-course-clock.timer
O timer ativa o serviço com o mesmo nome básico. OnCalendar define o horário de calendário; AccuracySec permite agrupar disparos em uma janela, sem garantia de tempo real. Com Persistent=true, um timer de calendário pode disparar ao ser reativado se perdeu uma ocorrência, mas não reproduz cada horário perdido individualmente.
Confira o próximo disparo e o resultado real
systemctl --user list-timers --all linux-course-clock.timer
systemctl --user status linux-course-clock.timer
journalctl --user -u linux-course-clock.service --since "5 minutes ago" --no-pager
systemctl --user show linux-course-clock.service -p Result -p ExecMainStatus
timedatectl
Confira o próximo disparo e, depois de um ou dois minutos, procure a data e o registro de término no journal. Um serviço oneshot pode estar inativo após uma execução bem-sucedida; confira também Result e ExecMainStatus. Use timedatectl para comparar o fuso e a sincronização do relógio do servidor com o horário desejado.
Se a tarefa precisar continuar após logout, examine o ciclo de vida do gerenciador de usuário e a política de linger do ambiente. Habilitar o timer não garante execução em todas as condições de logout ou reinicialização. Para timers de sistema em produção, planeje conta de serviço, caminhos absolutos, privilégios mínimos e limites de recursos.
Evite sobreposição e remova o exercício
Uma tarefa cron que dure mais que seu intervalo pode coincidir com a próxima execução; avalie bloqueios como flock onde forem adequados. Se o mesmo serviço systemd já estiver ativo quando o timer disparar, ele não cria automaticamente uma segunda instância dessa unidade. Outros serviços ou execuções manuais podem compartilhar recursos, portanto os requisitos de concorrência da aplicação continuam relevantes.
systemctl --user disable --now linux-course-clock.timer
rm -- "$HOME/.config/systemd/user/linux-course-clock.timer" "$HOME/.config/systemd/user/linux-course-clock.service"
systemctl --user daemon-reload
systemctl --user list-timers --all linux-course-clock.timer
Remova apenas as duas unidades criadas neste exercício. Se adicionou uma linha de cron, exclua só essa linha com crontab -e e confirme com crontab -l; não apague a agenda inteira. Em produção, implemente também uma forma de detectar falhas ou ausência de execução e um procedimento de recuperação.




