Files
swap_cleaner/README.md
2025-11-03 16:43:41 +01:00

150 lines
6.7 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# `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é.