Pular para o conteúdo principal

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​

AgendamentoDescrição
0 2 * * *Todos os dias às 2h00
*/5 * * * *A cada 5 minutos
0 */2 * * *A cada 2 horas
0 0 * * 0Todos os domingos à meia-noite
0 0 1 * *Dia 1 de cada mês
0 9-17 * * 1-59h à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