Chapitre 6.4 - Fonctions et Cron
Objectifs d'Apprentissage
À la fin de ce chapitre, vous serez capable de:
- Créer et utiliser des fonctions Bash
- Comprendre les paramètres de fonctions
- Planifier des tâches avec cron
- Utiliser crontab
- Comprendre la syntaxe cron
Fonctions Bash
Définition
#!/bin/bash
# Syntaxe 1
nom_fonction() {
commandes
}
# Syntaxe 2
function nom_fonction {
commandes
}
# Syntaxe 3 (portable)
function nom_fonction() {
commandes
}
Exemple Simple
#!/bin/bash
# Fonction simple
bonjour() {
echo "Bonjour $1!"
}
# Appel
bonjour "Linux"
bonjour "Monde"
Paramètres
#!/bin/bash
# Paramètres: $1, $2, etc. (locaux à la fonction)
ma_fonction() {
echo "Premier: $1"
echo "Deuxième: $2"
echo "Tous: $@"
echo "Nombre: $#"
}
# Appel
ma_fonction "arg1" "arg2" "arg3"
Valeur de Retour
#!/bin/bash
# Code de retour (0-255)
est_fichier() {
if [ -f "$1" ]; then
return 0 # Succès
else
return 1 # Échec
fi
}
# Utilisation
if est_fichier "/etc/passwd"; then
echo "Fichier existe"
fi
Variables Locales
#!/bin/bash
# Variable locale (portée fonction)
ma_fonction() {
local var_locale="valeur"
echo "Locale: $var_locale"
}
# Variable globale
var_globale="globale"
ma_fonction
echo "Globale: $var_globale"
Exemples de Fonctions
Fonction Utilitaire
#!/bin/bash
# Logger avec timestamp
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"
}
# Utilisation
log "Début du script"
log "Erreur: Fichier non trouvé"
log "Fin du script"
Fonction de Vérification
#!/bin/bash
# Vérifier si utilisateur existe
utilisateur_existe() {
id "$1" &>/dev/null
return $?
}
# Utilisation
if utilisateur_existe "user1"; then
echo "Utilisateur existe"
else
echo "Utilisateur n'existe pas"
fi
Fonction avec Retour de Valeur
#!/bin/bash
# Retourner une valeur (via echo)
calculer() {
local resultat=$(( $1 + $2 ))
echo "$resultat"
}
# Utilisation
somme=$(calculer 5 3)
echo "Somme: $somme"
Cron - Planification de Tâches
Qu'est-ce que Cron?
Cron est un démon qui exécute des tâches à des moments planifiés.
Syntaxe Cron
Format
┌───────────── minute (0 - 59)
│ ┌───────────── hour (0 - 23)
│ │ ┌───────────── day of month (1 - 31)
│ │ │ ┌───────────── month (1 - 12)
│ │ │ │ ┌───────────── day of week (0 - 7) (0 ou 7 = dimanche)
│ │ │ │ │
* * * * * commande
Exemples
| Schedule | Description |
|---|---|
0 2 * * * | Tous les jours à 2h00 |
*/5 * * * * | Toutes les 5 minutes |
0 */2 * * * | Toutes les 2 heures |
0 0 * * 0 | Tous les dimanches à minuit |
0 0 1 * * | Le 1er de chaque mois |
0 9-17 * * 1-5 | 9h à 17h, lundi-vendredi |
0 0,12 * * * | Minuit et midi chaque jour |
*/30 * * * * | Toutes les 30 minutes |
Variables d'Environnement
# Dans crontab
PATH=/usr/bin:/bin
SHELL=/bin/bash
MAILTO=admin@example.com
HOME=/home/user
# Puis les tâches
0 2 * * * /chemin/vers/script.sh
Utilisation de crontab
Éditer Crontab
# Éditer crontab utilisateur
crontab -e
# Voir crontab actuel
crontab -l
# Supprimer crontab
crontab -r
# Éditer crontab d'un utilisateur (root)
sudo crontab -u user1 -e
Format Crontab
# Commentaire
# MIN HEURE JOUR MOIS JOUR_SEMAINE COMMANDE
# Exemple
0 2 * * * /usr/local/bin/backup.sh
*/15 * * * * /usr/local/bin/check.sh
0 0 1 * * /usr/local/bin/monthly-report.sh
Redirection
# Rediriger sortie
0 2 * * * /script.sh > /var/log/script.log 2>&1
# Ignorer sortie
0 2 * * * /script.sh > /dev/null 2>&1
# Envoyer par email (si MAILTO défini)
0 2 * * * /script.sh
Répertoires Cron
/etc/cron.d/
Pour tâches système:
# Créer fichier dans /etc/cron.d/
sudo nano /etc/cron.d/mon-tache
# Format (avec utilisateur)
0 2 * * * user1 /usr/local/bin/script.sh
Répertoires Spéciaux
/etc/cron.hourly/ # Exécuté chaque heure
/etc/cron.daily/ # Exécuté chaque jour
/etc/cron.weekly/ # Exécuté chaque semaine
/etc/cron.monthly/ # Exécuté chaque mois
Placez des scripts dans ces répertoires (exécutables, sans extension .sh)
Exemples Pratiques
Backup Quotidien
#!/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
Nettoyage 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
Monitoring
#!/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 "Alerte: Disque à ${USAGE}%" | mail -s "Alerte Disque" admin@example.com
fi
Crontab:
*/15 * * * * /usr/local/bin/check-disk.sh
Bonnes Pratiques
Scripts Cron
#!/bin/bash
# 1. Shebang
# 2. Variables d'environnement
PATH=/usr/bin:/bin
# 3. Variables du script
LOG_FILE="/var/log/mon-script.log"
# 4. Fonctions
# 5. Code principal avec logging
Logging
#!/bin/bash
LOG_FILE="/var/log/mon-script.log"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" >> "$LOG_FILE"
}
log "Début"
# ... traitement ...
log "Fin"
Gestion d'Erreurs
#!/bin/bash
set -euo pipefail
# Ou gestion manuelle
if ! commande; then
echo "Erreur" | mail -s "Erreur Script" admin@example.com
exit 1
fi
Résumé
Dans ce chapitre, vous avez appris:
Fonctions: Définition, paramètres, valeurs de retour
Cron: Planification de tâches automatiques
Syntaxe: * * * * * (minute heure jour mois jour_semaine)
crontab: Édition, visualisation, suppression
Répertoires: /etc/cron.d/, cron.hourly, etc.
Pratique: Scripts avec logging, gestion d'erreurs
Prochaines Étapes
Module 7: Réseau et Configuration
Module 8: Services et Démon (avec crons avancés)
Chapitre créé le: Décembre 2024