Code source wiki de Nettoyage Système (script)
Modifié par john le 2026/09/20 20:26
Masquer les derniers auteurs
| author | version | line-number | content |
|---|---|---|---|
![]() |
1.1 | 1 | {{toc/}} |
| 2 | |||
| 3 | == Présentation == | ||
| 4 | |||
![]() |
4.1 | 5 | Ce script nettoie un système Linux : caches, paquets inutiles, fichiers temporaires anciens, journaux trop volumineux. |
![]() |
1.1 | 6 | |
![]() |
4.1 | 7 | Il est conçu pour être **sûr**, **verbeux** et **personnalisable**, avec un mode simulation. |
![]() |
1.1 | 8 | |
![]() |
2.1 | 9 | ---- |
![]() |
1.1 | 10 | |
| 11 | == Objectifs == | ||
| 12 | |||
| 13 | * Libérer de l’espace disque | ||
| 14 | * Éviter les lenteurs causées par des accumulations inutiles | ||
![]() |
4.1 | 15 | * Prévenir les erreurs d’espace faible |
![]() |
1.1 | 16 | * Réduire le bruit dans les sauvegardes automatiques |
| 17 | |||
![]() |
2.1 | 18 | ---- |
![]() |
1.1 | 19 | |
![]() |
4.1 | 20 | == Script == |
![]() |
1.1 | 21 | |
| 22 | {{code language="bash"}} | ||
| 23 | #!/bin/bash | ||
| 24 | set -euo pipefail | ||
| 25 | |||
![]() |
4.1 | 26 | DRY_RUN="${1:-}" # ./nettoyage.sh --dry-run pour simuler |
![]() |
1.1 | 27 | LOG="$HOME/nettoyage_$(date +%F).log" |
![]() |
4.1 | 28 | |
| 29 | run() { | ||
| 30 | if [ "$DRY_RUN" = "--dry-run" ]; then | ||
| 31 | echo "[simulation] $*" | tee -a "$LOG" | ||
| 32 | else | ||
| 33 | echo "+ $*" | tee -a "$LOG" | ||
| 34 | "$@" >> "$LOG" 2>&1 || true | ||
| 35 | fi | ||
| 36 | } | ||
| 37 | |||
![]() |
1.1 | 38 | echo "Début du nettoyage : $(date)" | tee "$LOG" |
![]() |
4.1 | 39 | df -h / | tail -n 1 | tee -a "$LOG" |
![]() |
1.1 | 40 | |
![]() |
4.1 | 41 | # Caches utilisateur de plus de 30 jours |
| 42 | echo "Cache utilisateur" | tee -a "$LOG" | ||
| 43 | run find "$HOME/.cache" -type f -atime +30 -delete | ||
![]() |
1.1 | 44 | |
![]() |
4.1 | 45 | # Paquets (Debian/Ubuntu) |
| 46 | if command -v apt >/dev/null; then | ||
| 47 | echo "Paquets apt" | tee -a "$LOG" | ||
| 48 | run sudo apt-get autoclean -y | ||
| 49 | run sudo apt-get autoremove --purge -y | ||
![]() |
1.1 | 50 | fi |
| 51 | |||
![]() |
4.1 | 52 | # Paquets (Fedora/RHEL) |
| 53 | if command -v dnf >/dev/null; then | ||
| 54 | echo "Paquets dnf" | tee -a "$LOG" | ||
| 55 | run sudo dnf clean all | ||
| 56 | run sudo dnf autoremove -y | ||
![]() |
1.1 | 57 | fi |
| 58 | |||
![]() |
4.1 | 59 | # Fichiers temporaires de plus de 10 jours, non utilisés |
| 60 | echo "Fichiers temporaires anciens" | tee -a "$LOG" | ||
| 61 | run sudo find /var/tmp -type f -atime +10 -delete | ||
![]() |
1.1 | 62 | |
![]() |
4.1 | 63 | # Journaux systemd : garder 7 jours, au plus 500 Mo |
| 64 | echo "Journaux systemd" | tee -a "$LOG" | ||
| 65 | run sudo journalctl --vacuum-time=7d | ||
| 66 | run sudo journalctl --vacuum-size=500M | ||
![]() |
1.1 | 67 | |
![]() |
4.1 | 68 | echo "Fin du nettoyage : $(date)" | tee -a "$LOG" |
| 69 | df -h / | tail -n 1 | tee -a "$LOG" | ||
![]() |
1.1 | 70 | {{/code}} |
| 71 | |||
![]() |
4.1 | 72 | {{warning}} |
| 73 | Ne pas faire ##rm -rf /tmp/* /var/tmp/*## sur un système en marche : ces dossiers contiennent des fichiers utilisés par les services en cours (sessions, verrous, travaux temporaires). ##/tmp## est vidé au redémarrage sur les systèmes récents, et ##systemd-tmpfiles## fait déjà le ménage périodiquement. | ||
| 74 | {{/warning}} | ||
| 75 | |||
![]() |
2.1 | 76 | ---- |
![]() |
1.1 | 77 | |
![]() |
4.1 | 78 | == Docker == |
![]() |
1.1 | 79 | |
![]() |
4.1 | 80 | {{code language="bash"}} |
| 81 | docker image prune # images intermédiaires sans nom | ||
| 82 | docker system prune # conteneurs arrêtés, réseaux inutilisés, cache de build | ||
| 83 | {{/code}} | ||
![]() |
1.1 | 84 | |
![]() |
4.1 | 85 | {{warning}} |
| 86 | ##docker system prune -af## supprime toutes les images non utilisées par un conteneur en cours, y compris celles construites localement, qui devront être reconstruites. À éviter dans un script automatique. | ||
| 87 | {{/warning}} | ||
![]() |
1.1 | 88 | |
![]() |
2.1 | 89 | ---- |
![]() |
1.1 | 90 | |
| 91 | == Sécuriser les suppressions == | ||
| 92 | |||
![]() |
4.1 | 93 | * Lancer d'abord avec ##--dry-run## |
| 94 | * Préférer ##find ... -delete## avec un critère d'âge à un ##rm -rf## global | ||
| 95 | * Vérifier la syntaxe avant d'exécuter : ##bash -n nettoyage.sh## | ||
| 96 | * Sur un serveur, relire la liste proposée par ##apt autoremove## avant de confirmer : il retire parfois des paquets encore utiles, installés comme dépendances | ||
![]() |
1.1 | 97 | |
![]() |
2.1 | 98 | ---- |
![]() |
1.1 | 99 | |
| 100 | == Journalisation == | ||
| 101 | |||
![]() |
4.1 | 102 | Le script écrit un journal daté dans ##$HOME##, ce qui permet de vérifier les erreurs et d'auditer les nettoyages passés. |
![]() |
1.1 | 103 | |
![]() |
2.1 | 104 | ---- |
![]() |
1.1 | 105 | |
![]() |
4.1 | 106 | == Automatiser avec cron == |
![]() |
1.1 | 107 | |
![]() |
4.1 | 108 | Pour l'exécuter tous les dimanches à 6 h : |
![]() |
1.1 | 109 | |
![]() |
4.1 | 110 | {{code language="bash"}} |
| 111 | crontab -e | ||
| 112 | {{/code}} | ||
![]() |
1.1 | 113 | |
![]() |
4.1 | 114 | {{code language="text"}} |
| 115 | 0 6 * * 0 /chemin/vers/nettoyage.sh | ||
| 116 | {{/code}} | ||
![]() |
1.1 | 117 | |
![]() |
4.1 | 118 | Les commandes en ##sudo## ne fonctionneront dans une crontab utilisateur que si ##sudo## est configuré sans mot de passe pour ces commandes ; sinon, placer le script dans ##/etc/cron.d/## avec l'utilisateur ##root##. |
| 119 | |||
![]() |
2.1 | 120 | ---- |
![]() |
1.1 | 121 | |
![]() |
4.1 | 122 | == À adapter selon la distribution == |
![]() |
1.1 | 123 | |
![]() |
4.1 | 124 | |=Distribution|=Commande principale |
| 125 | |Debian / Ubuntu|##apt##, ##journalctl##, ##dpkg## | ||
| 126 | |Fedora / RHEL|##dnf##, ##journalctl## | ||
| 127 | |Arch Linux|##pacman -Rns $(pacman -Qtdq)## | ||
| 128 | |Alpine Linux|##apk cache clean## | ||
![]() |
1.1 | 129 | |
![]() |
2.1 | 130 | ---- |
![]() |
1.1 | 131 | |
| 132 | == Liens utiles == | ||
| 133 | |||
![]() |
4.1 | 134 | * [[journalctl (documentation systemd)>>https://www.freedesktop.org/software/systemd/man/journalctl.html]] |
| 135 | * [[Manuel de rm>>https://man7.org/linux/man-pages/man1/rm.1.html]] | ||
| 136 | * [[ShellCheck>>https://www.shellcheck.net]] | ||
![]() |
1.1 | 137 | |
![]() |
2.1 | 138 | ---- |
![]() |
1.1 | 139 | |
| 140 | == Liens internes == | ||
| 141 | |||
![]() |
4.1 | 142 | * [[Retour aux scripts perso>>doc:Wiki Batcave John.TutosLinux.ScriptsPerso.WebHome]] |
![]() |
3.1 | 143 | * [[Retour à l’accueil>>doc:Wiki Batcave John.WebHome]] |
