Aller au contenu principal

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​

ScheduleDescription
0 2 * * *Tous les jours à 2h00
*/5 * * * *Toutes les 5 minutes
0 */2 * * *Toutes les 2 heures
0 0 * * 0Tous les dimanches à minuit
0 0 1 * *Le 1er de chaque mois
0 9-17 * * 1-59h à 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