No Linux, tradicionalmente o cron é usado para automatizar tarefas. No entanto, com o surgimento do systemd, apareceu uma alternativa mais flexível e moderna — os systemd timers. Eles permitem executar tarefas em horários definidos, acompanhar seu status e integrá-las com os serviços do sistema.
Neste artigo, vamos entender como usar o systemd para automação e por que ele pode ser melhor que o cron.
Por que systemd em vez de cron?
- Sistema unificado para gerenciar serviços e tarefas.
- Registro de logs via journalctl.
- Condições de execução flexíveis (por tempo, eventos ou estado do sistema).
- Possibilidade de monitorar o status e gerenciar tarefas como serviços.
1. Criando um serviço systemd
Primeiro é necessário descrever a tarefa como um serviço. Por exemplo, vamos criar uma tarefa que realiza backup em /opt/backup.sh:
sudo nano /etc/systemd/system/backup.service
Conteúdo:
[Unit]
Description=Backup de dados
[Service]
Type=oneshot
ExecStart=/opt/backup.sh
2. Criando um timer
Agora criamos um timer que irá executar nosso serviço.
sudo nano /etc/systemd/system/backup.timer
Conteúdo:
[Unit]
Description=Timer de backup
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
Explicação dos parâmetros:
OnCalendar=daily – executa todos os dias (também existem hourly, weekly, monthly ou datas específicas).
Persistent=true – se o servidor estava desligado, a tarefa será executada na próxima inicialização.
3. Ativando o timer
Ativamos o timer e verificamos seu status:
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
systemctl list-timers
A saída mostrará a programação de todos os timers ativos.
4. Exemplos de uso
Executar a cada 15 minutos:
[Timer]
OnCalendar=*:0/15
Executar 5 minutos após a inicialização do sistema:
[Timer]
OnBootSec=5min
Executar quando o sistema estiver ocioso:
[Timer]
OnIdleSec=30min
5. Logs e depuração
Todos os logs dos serviços iniciados via systemd estão disponíveis em:
journalctl -u backup.service
Isso é mais prático do que os logs padrão do cron.
Conclusão
O uso de timers do systemd oferece muito mais possibilidades ao administrador do que o cron clássico. Em vez de apenas executar scripts em horários fixos, você obtém:
- gerenciamento centralizado de todas as tarefas e serviços com os comandos familiares do systemctl;
- logs transparentes via journalctl sem configuração extra;
- condições de execução flexíveis (por tempo, ao iniciar, em inatividade ou até combinações de condições);
- execução confiável mesmo após reinicializações do servidor com Persistent=true;
- possibilidade de limitar recursos e controlar o comportamento das tarefas como qualquer outro serviço do systemd.
Para administradores de sistemas, isso significa menos trabalho manual, e para projetos — execução mais previsível e segura de tarefas críticas, como backups, rotação de logs, atualizações e monitoramento.
Se você ainda usa cron por hábito, experimente mover pelo menos parte das suas tarefas para timers do systemd. É bem provável que o cron logo deixe de ser necessário em sua infraestrutura.
FAQ
- Pergunta: Por que os timers do systemd são melhores que o cron? Resposta: 1) Timers do systemd são integrados ao sistema de serviços. 2) Todos os logs podem ser visualizados via journalctl sem configuração adicional. 3) Condições de execução flexíveis (por tempo, na inicialização, em inatividade). 4) Fácil gerenciamento das tarefas (systemctl start/stop/status). 5) Execução persistente após desligamentos com Persistent=true.
- Pergunta: É possível executar timers como usuário comum?Resposta: Sim. Timers de usuário ficam em ~/.config/systemd/user/. Para ativá-los:
systemctl --user enable --now mytask.timer
Eles funcionam sem privilégios de root.
- Pergunta: O que escolher: OnCalendar ou OnBootSec?Resposta:
OnCalendar é usado para agendamento (diário, semanal, baseado em horário).
OnBootSec e OnStartupSec são usados para atrasar a execução após a inicialização.
Eles podem ser combinados. - Pergunta: Como testar corretamente um timer?Resposta:
Execute o serviço associado manualmente:systemctl start mytask.service
Verifique se o timer está ativo:
systemctl list-timers
Veja os logs:
journalctl -u mytask.service
- Pergunta: Posso definir várias condições de execução?Resposta: Sim. Um mesmo timer pode ter várias linhas OnCalendar ou ser combinado com OnBootSec. Exemplo:
[Timer]
OnCalendar=Mon,Fri --* 12:00:00
OnBootSec=10min - Pergunta: Qual a diferença entre OnActiveSec e OnUnitActiveSec?Resposta:
OnActiveSec – tempo desde a ativação do timer.
OnUnitActiveSec – tempo desde a última execução do serviço associado.
Isso é importante em tarefas recorrentes. - Pergunta: Onde ficam armazenados os timers?Resposta:
Sistema: /etc/systemd/system/ ou /usr/lib/systemd/system/.
Usuário: ~/.config/systemd/user/. - Pergunta: É possível limitar recursos de uma tarefa?Resposta: Sim. Como a tarefa é executada como serviço, é possível aplicar controles de recursos do systemd (CPU, memória, I/O). Exemplo:
[Service]
ExecStart=/opt/backup.sh
CPUQuota=20%
MemoryMax=500M - Pergunta: O que acontece se o servidor estiver desligado na hora programada?Resposta: Se Persistent=true estiver definido, a tarefa será executada na próxima inicialização.
- Pergunta: Como remover um timer?Resposta:
Desabilite-o:sudo systemctl disable --now mytask.timer
Exclua os arquivos .service e .timer de /etc/systemd/system/.
Recarregue o daemon:sudo systemctl daemon-reexec