107.2 Automatizar e agendar tarefas administrativas
Resumo Conciso
Cron — Tarefas periódicas
Crontab de utilizador — 6 campos
min hora dia_mes mes dia_semana comando * * * * * /caminho/comando| Operador | Significado | Exemplo |
|---|---|---|
* | Qualquer valor | * * * * * (a cada minuto) |
, | Lista de valores | 0,15,30,45 |
- | Intervalo | 1-5 (seg a sex) |
/ | Escalonamento | */20 (a cada 20 min) |
Atalhos: @hourly, @daily, @weekly, @monthly, @yearly, @reboot
Crontab de sistema — 7 campos (campo adicional: utilizador)
min hora dia_mes mes dia_semana user comando * * * * * root /caminho/comandoLocalizações:
| Caminho | Descrição |
|---|---|
/etc/crontab | Crontab principal do sistema |
/etc/cron.d/ | Ficheiros crontab adicionais do sistema |
/etc/cron.{hourly,daily,weekly,monthly}/ | Scripts executados periodicamente |
/var/spool/cron/ | Crontabs de utilizador |
Comandos crontab
| Comando | Função |
|---|---|
crontab -e | Criar/editar crontab do utilizador |
crontab -l | Listar crontab atual |
crontab -r | Remover crontab |
crontab -u <user> | Editar crontab de outro utilizador (requer root) |
Variáveis de ambiente no crontab
| Variável | Função |
|---|---|
HOME | Directório de trabalho do cron |
MAILTO | Destinatário de emails de saída/erro |
PATH | Caminho de procura de comandos |
SHELL | Shell utilizado (/bin/sh por omissão) |
Controlo de acesso ao cron
| Ficheiro | Comportamento |
|---|---|
/etc/cron.allow existe | Apenas utilizadores listados podem usar crontab |
Só /etc/cron.deny existe | Utilizadores listados não podem usar crontab (vazio = todos podem) |
| Nenhum dos dois existe | Depende da distribuição |
At — Tarefas únicas
| Comando | Função |
|---|---|
at <tempo> | Agendar comando para momento específico |
atq / at -l | Listar jobs pendentes |
atrm / at -d | Remover job por ID |
at -c <id> | Ver comandos de um job |
Especificações de tempo: HH:MM, now +5 minutes, tomorrow, today, midnight, noon, teatime (16h)
Controlo de acesso ao at
| Ficheiro | Comportamento |
|---|---|
/etc/at.allow existe | Apenas utilizadores listados podem usar at |
Só /etc/at.deny existe | Utilizadores listados não podem usar at |
| Nenhum dos dois existe | Depende da distribuição |
Systemd Timers — Alternativa ao cron
Unidade .timer (exemplo: foobar.timer)
[Unit]Description=Run the foobar service[Timer]OnCalendar=Mon *-*-1..7 05:30:00Persistent=true[Install]WantedBy=timers.target| Expressão OnCalendar | Significado |
|---|---|
hourly | *-*-* *:00:00 |
daily | *-*-* 00:00:00 |
weekly | Mon *-*-* 00:00:00 |
monthly | *-*-01 00:00:00 |
yearly | *-01-01 00:00:00 |
| Comando | Função |
|---|---|
systemctl enable/start <timer>.timer | Ativar e iniciar temporizador |
systemctl list-timers | Listar temporizadores ativos |
systemd-run --on-calendar=... | Alternativa ao at (tarefa única) |
systemd-run --on-active="2m" | Executar após período monotónico |
Exercícios Exploratórios
Exercício Exploratório 1 — Criar e listar crontab
Enunciado: Crie um crontab que execute date todas as sextas às 13h e liste o resultado.
crontab -e# Adicionar: 00 13 * * 5 datecrontab -l# 00 13 * * 5 dateA saída é enviada ao utilizador por email. Consulte com mail.
Exercício Exploratório 2 — Redirecionar saída no crontab
Enunciado: Execute foobar.sh a cada minuto, redirecionando a saída para output.log e mantendo o erro para email.
crontab -e# Adicionar: */1 * * * * ./foobar.sh >> output.logO cron invoca comandos no directório inicial do utilizador, por isso ./foobar.sh funciona sem caminho absoluto.
Exercício Exploratório 3 — Desabilitar e configurar MAILTO
Enunciado: Comente o primeiro job e defina MAILTO para enviar erros apenas para emma.
crontab -e# Comentar: #00 13 * * 5 date# Adicionar no topo:MAILTO="emma"*/1 * * * * ./foobar.shMAILTO="" (vazio) impede qualquer envio de email.
Exercício Exploratório 4 — Agendar tarefa com at
Enunciado: Agende o script foo.sh para as 10h30 do próximo dia 31 de outubro.
at 10:30 AM October 31warning: commands will be executed using /bin/shat> ./foo.shat> Ctrl+Djob 50 at Thu Oct 31 10:30:00 2019Exercício Exploratório 5 — Gerir jobs at
Enunciado: Liste todos os jobs at (como root) e remova-os todos.
atq# 52 Sat Oct 5 10:19:00 2019 a dave# 50 Thu Oct 31 10:30:00 2019 a frankatrm 50 52Como root, atq lista jobs de todos os utilizadores. atrm aceita múltiplos IDs.
Exercício Exploratório 6 — Verificar bits especiais do crontab
Enunciado: Que bit especial tem o comando crontab e qual o seu significado?
ls -l /usr/bin/crontab# -rwxr-sr-x 1 root crontab 25104 ...Tem SGID definido (o s no lugar do executável do grupo), o que significa que é executado com privilégios do grupo crontab (ver T06 para bits SUID/SGID). É por isso que utilizadores comuns podem editar o seu próprio crontab.