Scripts Unix
Introduction
Les scripts Unix sont des outils puissants pour l'automatisation des tâches système sous Linux et Unix. Ils permettent de combiner des commandes shell, des outils système et des langages de script comme Bash, Python ou Perl.
Bases des Scripts Unix
Structure d'un script Bash
#!/bin/bash
# Commentaire sur une ligne
: '
Commentaire sur plusieurs lignes
'
# Déclaration de variables
NOM_VARIABLE="valeur"
TABLEAU=("élément1" "élément2" "élément3")
# Fonction simple
function salutation() {
local nom=$1
echo "Bonjour $nom"
}
Gestion des fichiers
# Créer un fichier
touch /tmp/test.txt
# Lire un fichier
cat /tmp/test.txt
# Écrire dans un fichier
echo "Contenu du fichier" > /tmp/test.txt
# Copier un fichier
cp /tmp/test.txt /tmp/backup/
Exemples Pratiques
Surveillance Système
#!/bin/bash
# Surveillance des ressources système
function monitor_system() {
# CPU
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}')
# Mémoire
MEM_TOTAL=$(free -m | awk '/Mem:/ {print $2}')
MEM_USED=$(free -m | awk '/Mem:/ {print $3}')
MEM_FREE=$(free -m | awk '/Mem:/ {print $4}')
# Disque
DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
# Envoi à Zabbix
zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k cpu.usage -o "$CPU_USAGE"
zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k mem.total -o "$MEM_TOTAL"
zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k mem.used -o "$MEM_USED"
zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k mem.free -o "$MEM_FREE"
zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k disk.usage -o "$DISK_USAGE"
}
Surveillance des Services
#!/bin/bash
# Liste des services à surveiller
SERVICES=("apache2" "mysql" "nginx" "postgresql")
function check_services() {
for service in "${SERVICES[@]}"; do
if systemctl is-active --quiet $service; then
status="running"
else
status="stopped"
fi
# Envoi à Zabbix
zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k "service.$service" -o "$status"
done
}
Surveillance des Logs
#!/bin/bash
# Surveillance des logs système
function monitor_logs() {
# Vérification des erreurs dans syslog
ERROR_COUNT=$(grep -i "error" /var/log/syslog | wc -l)
WARNING_COUNT=$(grep -i "warning" /var/log/syslog | wc -l)
# Vérification des erreurs dans les logs Apache
APACHE_ERRORS=$(grep -i "error" /var/log/apache2/error.log | wc -l)
# Envoi à Zabbix
zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k "log.syslog.errors" -o "$ERROR_COUNT"
zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k "log.syslog.warnings" -o "$WARNING_COUNT"
zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k "log.apache.errors" -o "$APACHE_ERRORS"
}
Nettoyage Automatique
#!/bin/bash
# Script de nettoyage automatique
function system_cleanup() {
# Nettoyage des fichiers temporaires
find /tmp -type f -atime +7 -delete
find /var/tmp -type f -atime +7 -delete
# Nettoyage des logs
find /var/log -type f -name "*.gz" -delete
find /var/log -type f -name "*.old" -delete
# Rotation des logs
logrotate -f /etc/logrotate.conf
# Nettoyage du cache apt
apt-get clean
apt-get autoremove -y
# Envoi du statut à Zabbix
zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k "maintenance.last_run" -o "$(date +%Y-%m-%d\ %H:%M:%S)"
}
Surveillance des Processus
#!/bin/bash
# Surveillance des processus critiques
function monitor_processes() {
# Liste des processus à surveiller
PROCESSES=("apache2" "mysql" "nginx")
for process in "${PROCESSES[@]}"; do
# Vérification du nombre d'instances
COUNT=$(pgrep -c $process)
# Vérification de l'utilisation CPU
CPU_USAGE=$(ps aux | grep $process | grep -v grep | awk '{print $3}')
# Vérification de l'utilisation mémoire
MEM_USAGE=$(ps aux | grep $process | grep -v grep | awk '{print $4}')
# Envoi à Zabbix
zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k "process.$process.count" -o "$COUNT"
zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k "process.$process.cpu" -o "$CPU_USAGE"
zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k "process.$process.mem" -o "$MEM_USAGE"
done
}
Surveillance Réseau
#!/bin/bash
# Surveillance des connexions réseau
function monitor_network() {
# Nombre de connexions établies
ESTABLISHED=$(netstat -an | grep ESTABLISHED | wc -l)
# Nombre de connexions en attente
LISTENING=$(netstat -an | grep LISTEN | wc -l)
# Bande passante utilisée
RX_BYTES=$(cat /sys/class/net/eth0/statistics/rx_bytes)
TX_BYTES=$(cat /sys/class/net/eth0/statistics/tx_bytes)
# Envoi à Zabbix
zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k "net.established" -o "$ESTABLISHED"
zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k "net.listening" -o "$LISTENING"
zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k "net.rx_bytes" -o "$RX_BYTES"
zabbix_sender -z 192.168.1.100 -s "$(hostname)" -k "net.tx_bytes" -o "$TX_BYTES"
}
Bonnes Pratiques
- Toujours utiliser le shebang approprié (#!/bin/bash)
- Utiliser des variables en majuscules pour les constantes
- Commenter le code de manière claire et concise
- Gérer les erreurs avec trap
- Utiliser des fonctions pour modulariser le code
- Tester les scripts dans un environnement de test
- Implémenter la journalisation
- Utiliser des chemins absolus pour les fichiers système