Code source wiki de Nettoyage Système (script)
Modifié par john le 2026/09/20 20:26
Afficher les derniers auteurs
| author | version | line-number | content |
|---|---|---|---|
| 1 | {{toc/}} | ||
| 2 | |||
| 3 | == Présentation == | ||
| 4 | |||
| 5 | Ce script nettoie un système Linux : caches, paquets inutiles, fichiers temporaires anciens, journaux trop volumineux. | ||
| 6 | |||
| 7 | Il est conçu pour être **sûr**, **verbeux** et **personnalisable**, avec un mode simulation. | ||
| 8 | |||
| 9 | ---- | ||
| 10 | |||
| 11 | == Objectifs == | ||
| 12 | |||
| 13 | * Libérer de l’espace disque | ||
| 14 | * Éviter les lenteurs causées par des accumulations inutiles | ||
| 15 | * Prévenir les erreurs d’espace faible | ||
| 16 | * Réduire le bruit dans les sauvegardes automatiques | ||
| 17 | |||
| 18 | ---- | ||
| 19 | |||
| 20 | == Script == | ||
| 21 | |||
| 22 | {{code language="bash"}} | ||
| 23 | #!/bin/bash | ||
| 24 | set -euo pipefail | ||
| 25 | |||
| 26 | DRY_RUN="${1:-}" # ./nettoyage.sh --dry-run pour simuler | ||
| 27 | LOG="$HOME/nettoyage_$(date +%F).log" | ||
| 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 | |||
| 38 | echo "Début du nettoyage : $(date)" | tee "$LOG" | ||
| 39 | df -h / | tail -n 1 | tee -a "$LOG" | ||
| 40 | |||
| 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 | ||
| 44 | |||
| 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 | ||
| 50 | fi | ||
| 51 | |||
| 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 | ||
| 57 | fi | ||
| 58 | |||
| 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 | ||
| 62 | |||
| 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 | ||
| 67 | |||
| 68 | echo "Fin du nettoyage : $(date)" | tee -a "$LOG" | ||
| 69 | df -h / | tail -n 1 | tee -a "$LOG" | ||
| 70 | {{/code}} | ||
| 71 | |||
| 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 | |||
| 76 | ---- | ||
| 77 | |||
| 78 | == Docker == | ||
| 79 | |||
| 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}} | ||
| 84 | |||
| 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}} | ||
| 88 | |||
| 89 | ---- | ||
| 90 | |||
| 91 | == Sécuriser les suppressions == | ||
| 92 | |||
| 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 | ||
| 97 | |||
| 98 | ---- | ||
| 99 | |||
| 100 | == Journalisation == | ||
| 101 | |||
| 102 | Le script écrit un journal daté dans ##$HOME##, ce qui permet de vérifier les erreurs et d'auditer les nettoyages passés. | ||
| 103 | |||
| 104 | ---- | ||
| 105 | |||
| 106 | == Automatiser avec cron == | ||
| 107 | |||
| 108 | Pour l'exécuter tous les dimanches à 6 h : | ||
| 109 | |||
| 110 | {{code language="bash"}} | ||
| 111 | crontab -e | ||
| 112 | {{/code}} | ||
| 113 | |||
| 114 | {{code language="text"}} | ||
| 115 | 0 6 * * 0 /chemin/vers/nettoyage.sh | ||
| 116 | {{/code}} | ||
| 117 | |||
| 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 | |||
| 120 | ---- | ||
| 121 | |||
| 122 | == À adapter selon la distribution == | ||
| 123 | |||
| 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## | ||
| 129 | |||
| 130 | ---- | ||
| 131 | |||
| 132 | == Liens utiles == | ||
| 133 | |||
| 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]] | ||
| 137 | |||
| 138 | ---- | ||
| 139 | |||
| 140 | == Liens internes == | ||
| 141 | |||
| 142 | * [[Retour aux scripts perso>>doc:Wiki Batcave John.TutosLinux.ScriptsPerso.WebHome]] | ||
| 143 | * [[Retour à l’accueil>>doc:Wiki Batcave John.WebHome]] |