Capítulo 6.4 - Funções e Cron
Objetivos de Aprendizagem
Ao final deste capítulo, você será capaz de:
- Criar e utilizar funções Bash
- Compreender os parâmetros de funções
- Agendar tarefas com cron
- Utilizar crontab
- Entender a sintaxe do cron
Funções Bash
Definição
#!/bin/bash
# Sintaxe 1
nome_funcao() {
comandos
}
# Sintaxe 2
function nome_funcao {
comandos
}
# Sintaxe 3 (portável)
function nome_funcao() {
comandos
}
Exemplo Simples
#!/bin/bash
# Função simples
ola() {
echo "Olá $1!"
}
# Chamada
ola "Linux"
ola "Mundo"
Parâmetros
#!/bin/bash
# Parâmetros: $1, $2, etc. (locais à função)
minha_funcao() {
echo "Primeiro: $1"
echo "Segundo: $2"
echo "Todos: $@"
echo "Quantidade: $#"
}
# Chamada
minha_funcao "arg1" "arg2" "arg3"
Valor de Retorno
#!/bin/bash
# Código de retorno (0-255)
eh_arquivo() {
if [ -f "$1" ]; then
return 0 # Sucesso
else
return 1 # Falha
fi
}
# Utilização
if eh_arquivo "/etc/passwd"; then
echo "Arquivo existe"
fi
Variáveis Locais
#!/bin/bash
# Variável local (escopo da função)
minha_funcao() {
local var_local="valor"
echo "Local: $var_local"
}
# Variável global
var_global="global"
minha_funcao
echo "Global: $var_global"
Exemplos de Funções
Função Utilitária
#!/bin/bash
# Logger com timestamp
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"
}
# Utilização
log "Início do script"
log "Erro: Arquivo não encontrado"
log "Fim do script"
Função de Verificação
#!/bin/bash
# Verificar se usuário existe
usuario_existe() {
id "$1" &>/dev/null
return $?
}
# Utilização
if usuario_existe "user1"; then
echo "Usuário existe"
else
echo "Usuário não existe"
fi
Função com Retorno de Valor
#!/bin/bash
# Retornar um valor (via echo)
calcular() {
local resultado=$(( $1 + $2 ))
echo "$resultado"
}
# Utilização
soma=$(calcular 5 3)
echo "Soma: $soma"
Cron - Agendamento de Tarefas
O que é o Cron?
Cron é um daemon que executa tarefas em horários agendados.
Sintaxe do Cron
Formato
┌───────────── minuto (0 - 59)
│ ┌───────────── hora (0 - 23)
│ │ ┌───────────── dia do mês (1 - 31)
│ │ │ ┌───────────── mês (1 - 12)
│ │ │ │ ┌───────────── dia da semana (0 - 7) (0 ou 7 = domingo)
│ │ │ │ │
* * * * * comando
Exemplos
| Agendamento | Descrição |
|---|---|
0 2 * * * | Todos os dias às 2h00 |
*/5 * * * * | A cada 5 minutos |
0 */2 * * * | A cada 2 horas |
0 0 * * 0 | Todos os domingos à meia-noite |
0 0 1 * * | Dia 1 de cada mês |
0 9-17 * * 1-5 | 9h às 17h, segunda a sexta |
0 0,12 * * * | Meia-noite e meio-dia todos os dias |
*/30 * * * * | A cada 30 minutos |
Variáveis de Ambiente
# No crontab
PATH=/usr/bin:/bin
SHELL=/bin/bash
MAILTO=admin@example.com
HOME=/home/user
# Depois as tarefas
0 2 * * * /caminho/para/script.sh
Utilização do crontab
Editar Crontab
# Editar crontab do usuário
crontab -e
# Ver crontab atual
crontab -l
# Remover crontab
crontab -r
# Editar crontab de um usuário (root)
sudo crontab -u user1 -e
Formato do Crontab
# Comentário
# MIN HORA DIA MÊS DIA_SEMANA COMANDO
# Exemplo
0 2 * * * /usr/local/bin/backup.sh
*/15 * * * * /usr/local/bin/check.sh
0 0 1 * * /usr/local/bin/monthly-report.sh
Redirecionamento
# Redirecionar saída
0 2 * * * /script.sh > /var/log/script.log 2>&1
# Ignorar saída
0 2 * * * /script.sh > /dev/null 2>&1
# Enviar por email (se MAILTO definido)
0 2 * * * /script.sh
Diretórios do Cron
/etc/cron.d/
Para tarefas de sistema:
# Criar arquivo em /etc/cron.d/
sudo nano /etc/cron.d/minha-tarefa
# Formato (com usuário)
0 2 * * * user1 /usr/local/bin/script.sh
Diretórios Especiais
/etc/cron.hourly/ # Executado a cada hora
/etc/cron.daily/ # Executado diariamente
/etc/cron.weekly/ # Executado semanalmente
/etc/cron.monthly/ # Executado mensalmente
Coloque scripts nesses diretórios (executáveis, sem extensão .sh)
Exemplos Práticos
Backup Diário
#!/bin/bash
# /usr/local/bin/backup-daily.sh
BACKUP_DIR="/backup"
SOURCE_DIR="/data"
DATE=$(date +%Y%m%d)
tar -czf "$BACKUP_DIR/backup-$DATE.tar.gz" "$SOURCE_DIR"
find "$BACKUP_DIR" -name "backup-*.tar.gz" -mtime +7 -delete
Crontab:
0 2 * * * /usr/local/bin/backup-daily.sh
Limpeza de Logs
#!/bin/bash
# /usr/local/bin/cleanup-logs.sh
find /var/log -name "*.log" -mtime +30 -delete
find /var/log -name "*.gz" -mtime +90 -delete
Crontab:
0 3 * * 0 /usr/local/bin/cleanup-logs.sh
Monitoramento
#!/bin/bash
# /usr/local/bin/check-disk.sh
THRESHOLD=80
USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ "$USAGE" -gt "$THRESHOLD" ]; then
echo "Alerta: Disco em ${USAGE}%" | mail -s "Alerta Disco" admin@example.com
fi
Crontab:
*/15 * * * * /usr/local/bin/check-disk.sh
Boas Práticas
Scripts para Cron
#!/bin/bash
# 1. Shebang
# 2. Variáveis de ambiente
PATH=/usr/bin:/bin
# 3. Variáveis do script
LOG_FILE="/var/log/meu-script.log"
# 4. Funções
# 5. Código principal com logging
Logging
#!/bin/bash
LOG_FILE="/var/log/meu-script.log"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" >> "$LOG_FILE"
}
log "Início"
# ... processamento ...
log "Fim"
Tratamento de Erros
#!/bin/bash
set -euo pipefail
# Ou tratamento manual
if ! comando; then
echo "Erro" | mail -s "Erro Script" admin@example.com
exit 1
fi
Resumo
Neste capítulo, você aprendeu:
Funções: Definição, parâmetros, valores de retorno
Cron: Agendamento de tarefas automáticas
Sintaxe: * * * * * (minuto hora dia mês dia_semana)
crontab: Edição, visualização, remoção
Diretórios: /etc/cron.d/, cron.hourly, etc.
Prática: Scripts com logging, tratamento de erros
Próximos Passos
Módulo 7: Rede e Configuração
Módulo 8: Serviços e daemons (com crons avançados)
Capítulo criado em: Dezembro 2024