Create README.md

This commit is contained in:
Ssyleric
2025-11-03 16:43:41 +01:00
committed by GitHub
parent e1f89b29b3
commit cc56667848

149
README.md Normal file
View File

@@ -0,0 +1,149 @@
# `swap_cleaner.sh` — Purge automatique du swap avec notification Discord
🧹 **Objectif**
Sur un hôte **Proxmox VE (PVE)**, ce script surveille lutilisation du **swap** et, si elle reste **au-dessus dun seuil** pendant une durée continue définie, il déclenche une purge douce du swap (`swapoff -a && swapon -a`).
À chaque action (ou erreur), une **notification Discord** est envoyée (message + **pièce jointe** du log).
---
## 🧩 Fonctionnement (résumé)
1. À **chaque exécution** (idéalement via `cron`), le script lit le **% de swap utilisé** (`free -m`).
2. Sil est **≥ THRESHOLD** (par défaut **90%**), un **compteur** sincrémente dans `STATE_FILE` (`/var/tmp/swap_usage_count.txt`).
3. Si ce compteur atteint `DURATION_MIN / CHECK_EVERY_MIN` (ex.: **120min / 10min = 12** exécutions consécutives), le script :
- journalise laction dans `LOG` (`/var/log/swap_cleaner.log`),
- exécute `swapoff -a && swapon -a`,
- envoie une **notification Discord** avec le **log joint**,
- réinitialise le compteur.
4. Si lusage repasse **sous** le seuil, le **compteur est remis à 0**.
Le script sexécute **en instance unique** grâce à un **lock** (`/var/tmp/.swap_cleaner.lock`) pour éviter les chevauchements via `cron`.
---
## ✅ Prérequis
- Hôte **PVE** (ou Linux avec `swapoff` / `swapon` disponibles).
- **Root** requis (ne pas utiliser `sudo` dans PVE, exécuter en root directement).
- Paquet **`jq`** (installé automatiquement si absent).
- Accès **HTTP sortant** vers lURL **Discord Webhook**.
---
## 🔧 Variables (override possibles via lenvironnement)
| Variable | Par défaut | Description |
|---------------------|------------|-------------|
| `WEBHOOK` | *(exemple dans le script)* | URL du **Discord Webhook** recevant la notification. |
| `THRESHOLD` | `90` | Seuil de **% de swap utilisé** déclenchant le comptage. |
| `CHECK_EVERY_MIN` | `10` | Fréquence (en minutes) dexécution par `cron`. |
| `DURATION_MIN` | `120` | Durée **continue** (en minutes) au-delà du seuil avant action. |
| `STATE_FILE` | `/var/tmp/swap_usage_count.txt` | Compteur persistant entre exécutions. |
| `LOG` | `/var/log/swap_cleaner.log` | Journal dexécution (+ joint à Discord). |
**Calcul interne :** nombre dexécutions consécutives requises = `ceil(DURATION_MIN / CHECK_EVERY_MIN)`.
---
## 📦 Installation
1. **Copier** le script dans votre répertoire de scripts (recommandé : `/home/scripts`) :
```bash
install -m 0755 swap_cleaner.sh /home/scripts/swap_cleaner.sh
```
2. **Vérifier** le shebang et les permissions :
```bash
head -n 1 /home/scripts/swap_cleaner.sh
ls -l /home/scripts/swap_cleaner.sh
```
3. **Créer** les emplacements nécessaires (log + state seront créés au premier run) :
```bash
mkdir -p /var/tmp
touch /var/log/swap_cleaner.log
```
> 💡 Conformément à votre organisation, `/home/scripts` est le dossier de référence pour vos scripts.
---
## ⏱️ Planification (cron)
Exécution **toutes les 10 minutes** (cohérente avec la valeur par défaut `CHECK_EVERY_MIN=10`).
Ouvrir le **crontab root** :
```bash
crontab -e
```
Ajouter la ligne suivante :
```cron
*/10 * * * * CHECK_EVERY_MIN=10 DURATION_MIN=120 THRESHOLD=90 WEBHOOK="https://discord.com/api/webhooks/XXX/YYY" /home/scripts/swap_cleaner.sh
```
- **Adapter** `WEBHOOK`, `THRESHOLD`, `CHECK_EVERY_MIN`, `DURATION_MIN` si nécessaire.
- **Important :** le script doit être lancé **en root** (crontab root).
### Exemples doverride
- Exécuter **toutes les 5 minutes** avec seuil **80%** et durée **1h** :
```cron
*/5 * * * * CHECK_EVERY_MIN=5 DURATION_MIN=60 THRESHOLD=80 WEBHOOK="https://discord.com/api/webhooks/XXX/YYY" /home/scripts/swap_cleaner.sh
```
- Exécuter **toutes les 15 minutes** avec durée **2h30** :
```cron
*/15 * * * * CHECK_EVERY_MIN=15 DURATION_MIN=150 WEBHOOK="https://discord.com/api/webhooks/XXX/YYY" /home/scripts/swap_cleaner.sh
```
---
## 🧪 Tests rapides (safe)
1. **Test lecture & log** (sans forcer purge) :
```bash
THRESHOLD=0 CHECK_EVERY_MIN=10 DURATION_MIN=9999 /home/scripts/swap_cleaner.sh && tail -n 5 /var/log/swap_cleaner.log
```
- Force `USAGE ≥ THRESHOLD` mais **natteint pas** la durée → **aucune purge**.
2. **Test action contrôlée** (⚠️ purge volontaire) :
```bash
THRESHOLD=0 CHECK_EVERY_MIN=1 DURATION_MIN=1 /home/scripts/swap_cleaner.sh
```
- Déclenche `swapoff -a && swapon -a` **une fois** et envoie la **notif Discord**.
---
## 🔔 Notifications Discord
- Le message est formaté **multiligne** et limité **< 2000 caractères** (troncature gérée).
- Le **fichier log** `/var/log/swap_cleaner.log` est **joint** systématiquement aux actions/erreurs.
- Le message inclut **Avant/Après** (`free -h`) pour la lisibilité.
> ✅ Respecte vos exigences **Discord** : `jq -Rs` pour payload JSON et **pièce jointe** via `curl -F`.
---
## 🛡️ Sécurité & impacts
- Laction `swapoff -a && swapon -a` peut **déplacer de la mémoire** et provoquer une **latence** temporaire selon la charge.
- Assurez-vous davoir **suffisamment de RAM** pour absorber le contenu du swap.
- Évitez dexécuter en même temps que des opérations lourdes (ex.: backup/restores massifs).
- Le script **échoue en silence** côté cron si le réseau vers Discord est indisponible (les logs locaux restent disponibles).
---
## 🧰 Dépannage
- **Aucune notif Discord ?**
- Vérifiez la **valeur `WEBHOOK`** et la **connectivité** (pare-feu, DNS).
- Consultez `/var/log/swap_cleaner.log` et rejouez le test daction contrôlée.
- **Pas daction malgré un swap élevé ?**
- Confirmez la **fréquence cron** réelle et le **calcul `ceil(DURATION_MIN / CHECK_EVERY_MIN)`**.
- Examinez `STATE_FILE` (compteur) et supprimez-le si besoin : `rm -f /var/tmp/swap_usage_count.txt`.
- **Chevauchements cron** :
- Le lock file (`/var/tmp/.swap_cleaner.lock`) empêche les runs concurrents.
- Vérifiez labsence dexécutions trop longues (IO/charge).
---
## 🗑️ Désinstallation
```bash
crontab -e # retirer la ligne cron
rm -f /home/scripts/swap_cleaner.sh /var/log/swap_cleaner.log /var/tmp/swap_usage_count.txt /var/tmp/.swap_cleaner.lock
```
---
## ✍️ Note
- Le script est conçu pour être **idempotent**, robuste (`set -euo pipefail`) et **VSN** (bonnes pratiques, `jq` requis, envoi Discord avec pièce jointe, limite 2000 caractères).
- Adaptez `THRESHOLD`, `CHECK_EVERY_MIN`, `DURATION_MIN` en fonction de votre profil dutilisation mémoire réelle.
---
## 📄 Licence
Utilisation interne. Adapter si nécessaire à votre politique de sécurité.