#1 Le 08/11/2009, à 11:45
- al_boon
script qui test l espace disque disponible
bonjour, j'aimerai créer un script qui test l espace disque disponible et qui au cas ou il ne reste moins de 5% supprime dans un dossier spécifique des fichiers en partant du plus vieux jusqu'a ce qu'il reste au moins 20% de libre.
pour tester l espace disque restant ca va, mais pour supprimer en commençant par les plus vieux fichiers je ne trouve pas.
quelqu'un pourrait il m aider ?
viva ubuntu ^^ et deux personnes converties !!
ps: il est pas beau mon fils ? (cf mon avatar)
Hors ligne
#2 Le 08/11/2009, à 12:02
- al_boon
Re : script qui test l espace disque disponible
bon j ai bien trouvé ceci
ls-l | head -1
que je vais essayer d adapter.
viva ubuntu ^^ et deux personnes converties !!
ps: il est pas beau mon fils ? (cf mon avatar)
Hors ligne
#3 Le 08/11/2009, à 18:02
- jofab
Re : script qui test l espace disque disponible
pour tester ca va (Tu connais df alors...)
en revanche ls -l te donne le detail des fichiers mais ne specifie pas le tri, il faut faire un ls -lt je pense à la place...
Hors ligne
#4 Le 08/11/2009, à 19:51
- al_boon
Re : script qui test l espace disque disponible
pour tester oui ca va parsque ce n est que le début et j aime patouille run peu des lors que je sais quelle fonction je vais utiliser (je suis archidébutant mais j ai quand même quelques modification/fusion de script à mon actif) afin d arriver a un script qui me convienne
sinon pour avoir le fichier ou dossier le plus vieux j ai ceci qui fonctionne apparement bien :
ls -1 -t | tail -1
viva ubuntu ^^ et deux personnes converties !!
ps: il est pas beau mon fils ? (cf mon avatar)
Hors ligne
#5 Le 08/11/2009, à 21:18
- al_boon
Re : script qui test l espace disque disponible
voici mon premier test :
#!/bin/bash
IFS='
'
while [ "$( df -h | grep sda1 | cut -c40-42)" -ge "85" ]
do
rm $(ls /home/⋅⋅⋅⋅⋅/⋅⋅⋅⋅/⋅⋅⋅⋅ -1 -t | tail -1)
done
exit 0
suis en train de le tester (pas évident il faut blinder le disque) je verrai demain si cela a fonctionné
Dernière modification par al_boon (Le 08/11/2009, à 21:20)
viva ubuntu ^^ et deux personnes converties !!
ps: il est pas beau mon fils ? (cf mon avatar)
Hors ligne
#6 Le 08/11/2009, à 23:00
- al_boon
Re : script qui test l espace disque disponible
petite modification :
#!/bin/bash
IFS='
'
while [ "$( df -h /home | grep /home | cut -c40-42)" -ge "85" ]
do
rm $(ls /home/alboon/sabfolder/downloads/complete -1 -t | tail -1)
done
exit 0
le problème c est que cela essaie toujorus de supprimer le meme dossier au lieu de refaire une recherche du dossier le plus ancien a partir de la liste mise a jour suite a une premiere suppression.... je regarderai mais pas ce soir je suis trop naze
viva ubuntu ^^ et deux personnes converties !!
ps: il est pas beau mon fils ? (cf mon avatar)
Hors ligne
#7 Le 09/11/2009, à 09:45
- jofab
Re : script qui test l espace disque disponible
si tu veux pas reflechir tu mets ta commande rm $(ls /home/alboon/sabfolder/downloads/complete -1 -t | tail -1) dans un autre fichier et tu l'appelles dans ta boucle. C'est plutot bof mais ca devrait fonctionner
Hors ligne
#8 Le 09/11/2009, à 16:48
- al_boon
Re : script qui test l espace disque disponible
merci, je vais tester ta solution ce soir (meme si je réfléchierai pour que cela fonctionne en un seul script quand meme)
viva ubuntu ^^ et deux personnes converties !!
ps: il est pas beau mon fils ? (cf mon avatar)
Hors ligne
#9 Le 10/11/2009, à 01:16
- sputnick
Re : script qui test l espace disque disponible
al_boon :
#!/bin/bash
# gilles <dot> quenot <at> gmail <dot> com
MyDir="/path/to/dir"
PartitionASurveiller="/home"
MakeDu()
{
df -TP | awk -vpartvar=$PartitionASurveiller '($NF == partvar) {gsub("%", "");print $6}'
}
_du=$(MakeDu)
cd "$MyDir" || exit 1
while ((_du>80)); do
\rm $(ls -rt | sed q)
_du=$(MakeDu)
done
Bien sur il faut editer
MyDir="/path/to/dir"
PartitionASurveiller="/home"
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
#10 Le 11/11/2009, à 15:26
- al_boon
Re : script qui test l espace disque disponible
merci, j aurai certainement eu du mal a m en sortir, je suis en train de tester, j upload un blueray sur mon serveur et on verra
Dernière modification par al_boon (Le 11/11/2009, à 15:26)
viva ubuntu ^^ et deux personnes converties !!
ps: il est pas beau mon fils ? (cf mon avatar)
Hors ligne
#11 Le 11/11/2009, à 16:19
- Totor
Re : script qui test l espace disque disponible
Voilà un script qui va prendre bcp de CPU ...
je te conseille de recharger du côté de inotify-tools
-- Lucid Lynx --
Hors ligne
#12 Le 11/11/2009, à 17:00
- al_boon
Re : script qui test l espace disque disponible
Voilà un script qui va prendre bcp de CPU ...
je te conseille de recharger du côté de inotify-tools
pourquoi dis tu cela ? (je ne m y connais pas trop)
viva ubuntu ^^ et deux personnes converties !!
ps: il est pas beau mon fils ? (cf mon avatar)
Hors ligne
#13 Le 11/11/2009, à 17:00
- sputnick
Re : script qui test l espace disque disponible
Non, Totor, je suis pas sur que sortir inotify pour cela soit nécessaire. Quel fichier voudrais tu surveiller ? Inotify surveille un fichier ou un repertoire, alors que la on lance les commandes quand l'espace disque depasse le seuil admis.
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
#14 Le 11/11/2009, à 18:15
- Totor
Re : script qui test l espace disque disponible
Non, Totor, je suis pas sur que sortir inotify pour cela soit nécessaire. Quel fichier voudrais tu surveiller ? Inotify surveille un fichier ou un repertoire, alors que la on lance les commandes quand l'espace disque depasse le seuil admis.
Question : est-il nécessaire de vérifier en permanence l'espace disque ?
Réponse : non
Question : alors quand ?
Réponse : Dès qu'un fichier a été modifié ou créé
Question : comment le savoir ?
Réponse : via inotifywait
Démo terminée...
Dernière modification par Totor (Le 11/11/2009, à 18:16)
-- Lucid Lynx --
Hors ligne
#15 Le 11/11/2009, à 18:24
- sputnick
Re : script qui test l espace disque disponible
pas besoin de surveiller en permanence, une tache en cron doit suffire. A al_boon de voir selon ses besoins
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
#16 Le 11/11/2009, à 18:34
- Totor
Re : script qui test l espace disque disponible
pas besoin de surveiller en permanence
c'est bien ce que je dis...
ce que je remettais en cause était la boucle while.
l'intérêt d'inotifywait est d'être plutôt réactif (sans consommer trop de ressources et en fonction du nombre de fichiers) et sans faire tourner des tâches inutilement (vérification périodique pas forcément justifié en cas d'utilisation de cron)
cette réactivité permet de traiter plus rapidement un éventuel débordement.
certe, il est toujours possible de jouer sur la fréquence de la tâche cron mais tu ne peux aller en dessous de la minute....
-- Lucid Lynx --
Hors ligne
#17 Le 11/11/2009, à 18:48
- sputnick
Re : script qui test l espace disque disponible
Oui, je connais cette librairie, mais je pense que c'est inadapté dans ce cas précis. A tu bien cerné les besoin de Al_boon ?
Quel algo propose tu ?
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
#18 Le 11/11/2009, à 19:02
- sputnick
Re : script qui test l espace disque disponible
Bon, j'ai fais des tests, j'obtient 1% ce consommation CPU, ce qui me semble acceptable dans le cas qui nous interesse. J'ai un processeur ( loin d'une bete de course ) bi coeur : "Genuine Intel(R) CPU T2050 @ 1.60GH". En ajoutant un sleep .5, je suis à 0% de CPU.
Voici le script un peu ammélioré :
#!/bin/bash
# gilles <dot> quenot <at> gmail <dot> com
MyDir="/home/logs/"
PartitionASurveiller="/home"
MaxSize=80
MakeDu()
{
df -TP | awk -vpartvar=$PartitionASurveiller '($NF == partvar) {gsub("%", "");print $6}'
}
_du=$(MakeDu)
cd "$MyDir" || exit 1
while((_du > MaxSize)); do
Fic="$(ls -rt | sed q)"
[[ -e "$Fic" ]] && \rm -v -- "$Fic"
_du=$(MakeDu)
sleep .5
done
Dernière modification par sputnick (Le 11/11/2009, à 19:45)
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
#19 Le 11/11/2009, à 19:42
- al_boon
Re : script qui test l espace disque disponible
en fait oui je pensais utiliser une tache cron, c est un serveur qui n'as pas beaucoup d espace mais qui peut etre rempli en quelque heures. je laisse tourner je regarderai dans la soirée si cela fonctionne, je suis bientot a la limite
viva ubuntu ^^ et deux personnes converties !!
ps: il est pas beau mon fils ? (cf mon avatar)
Hors ligne
#20 Le 11/11/2009, à 19:47
- sputnick
Re : script qui test l espace disque disponible
J'ai edité mon post du dessus et ajouté un test
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
#21 Le 11/11/2009, à 19:58
- al_boon
Re : script qui test l espace disque disponible
meme probleme il repete toujours la suppression sur le meme dossier la j ai comme log :
rm: cannot remove `lost+found': Is a directory
rm: cannot remove `lost+found': Is a directory
rm: cannot remove `lost+found': Is a directory
rm: cannot remove `lost+found': Is a directory
indéfiniment
viva ubuntu ^^ et deux personnes converties !!
ps: il est pas beau mon fils ? (cf mon avatar)
Hors ligne
#22 Le 11/11/2009, à 20:11
- al_boon
Re : script qui test l espace disque disponible
apparement is good en rajoutant Rf je laisse tourner je vais coucher les enfants
viva ubuntu ^^ et deux personnes converties !!
ps: il est pas beau mon fils ? (cf mon avatar)
Hors ligne
#23 Le 11/11/2009, à 20:12
- sputnick
Re : script qui test l espace disque disponible
al_boon, tu n'a jamais parlé de dossier dans ton post :
bonjour, j'aimerai créer un script qui test l espace disque disponible et qui au cas ou il ne reste moins de 5% supprime dans un dossier spécifique des fichiers en partant du plus vieux jusqu'a ce qu'il reste au moins 20% de libre.
De plus, lost+found c'est souvent /lost+found, tu fais quand meme pas des tests sur ta partition / quand meme ? Si tu veux forcer l'effacement des repertoires, ajoute le flag r à rm
Nouvelle version :
#!/bin/bash
# gilles <dot> quenot <at> gmail <dot> com
MyDir="/tmp/mmm/logs/"
PartitionASurveiller="/"
MaxSize=10 # en % d'occupation
shopt -s dotglob # permet de gerer aussi les fichiers cachés
MakeDu()
{
df -TP | awk -vpartvar=$PartitionASurveiller '($NF == partvar) {gsub("%", "");print $6}'
}
_du=$(MakeDu)
cd "$MyDir" || exit 1
while((_du > MaxSize)); do
Fic="$(ls -rt | sed q)"
if [[ -e "$Fic" ]]; then
\rm -v -- "$Fic"
else
break
fi
_du=$(MakeDu)
sleep .5
done
Le nouveau break est important, sinon le script ne se finit pas quand si il n'y a plus de fichiers.
Dernière modification par sputnick (Le 11/11/2009, à 20:23)
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
#24 Le 11/11/2009, à 20:13
- Biounator
Re : script qui test l espace disque disponible
C'est normal, le script essaie de supprimer un répertoire et il n'y arrive pas, à l'exécution suivante l'élément le plus ancien est toujours le même répertoire car il ne peut le supprimer (c'est un répertoire qui ne doit pas être supprimer).
Ajoute à ta commande :
Fic="$(ls -rt | grep -v lost+found | sed q)"
Tu devrais tout de même voir du côté de la command find qui te permet de sortir une liste de fichier en fonction de la date de création ou de dernier accès et de vérifier si c'est un répertoire ou autre chose.
Si tu veux aussi supprimer les répertoire ajoute l'option -rf à ta commande rm.
-r : récursif (descend et supprime dans les répertoires) , -f : force la suppression
Hors ligne
#25 Le 11/11/2009, à 20:37
- Totor
Re : script qui test l espace disque disponible
Bon, j'ai fais des tests, j'obtient 1% ce consommation CPU, ce qui me semble acceptable dans le cas qui nous interesse. J'ai un processeur ( loin d'une bete de course ) bi coeur : "Genuine Intel(R) CPU T2050 @ 1.60GH". En ajoutant un sleep .5, je suis à 0% de CPU.
Oui, c'est raisonnable.
Voilà comment je procèderai.
Cela te semblera une usine mais ça me parait plus propre et plus souple :
#!/bin/bash
tauxOccupation()
{
utilise=( $(df -h "${1}"|tail -1) )
utilise=${dispo[4]}
echo "${dispo%\%}"
}
gestionEspaceDisque()
{
# vérification de l'existence du pipe
[ ! -p "${namedPipe}" ] && exit 1
while read -u 4 unObjet
do
[ "${unObjet}" = "END" ] && break
# un événement s'est poduit, on recoit le dossier qui en est à l'origine via le pipe
taux=$(tauxOccupation ${unObjet})
if [ ${taux} -gt 95 ]; then
while [ ${taux} -gt 80 ];
do
taux=0
plusAncien="$(find "${unObjet}" -type f -printf '%TY%Tm%Td%TT\t%h/%f\n'|sort -n|tail -1|awk '{print $2}')"
if [ "${plusAncien}" ]; then
if rm -f "${plusAncien}"; then
taux=$(tauxOccupation ${unObjet})
fi
fi
done
fi
done
}
supprimePipe()
{
[ -p "$1" ] && { echo "END" > "$1"; exec 4<&- 4>&-; rm -f "$1"; }
exit
}
scriptName="$(basename "$0")"
scriptName="${scriptName%.*}"
# recherche du dossier temporaire le plus approprie
pipeFolder="${TMPDIR}"
if [ ! "${pipeFolder}" ]; then
pipeFolder="$([ -e "/dev/shm" ] && echo "/dev/shm" || echo "/tmp")"
fi
namedPipe="${pipeFolder}/${scriptName}"
# creation du pipe si besoin
[ -f "${namedPipe}" ] && rm -f "${namedPipe}"
[ ! -p "${namedPipe}" ] && mkfifo "${namedPipe}" && exec 4<>"${namedPipe}"
# lancement de la procédure de gestion de l'espace disque en arrière plan
gestionEspaceDisque "${namedPipe}" &
# mise en place d'un gestionnaire d'arret
trap "supprimePipe \"${namedPipe}\"" SIGINT SIGTERM
# on patiente pour s'assurer que le gestionnaire d'espace disque se soit initialise
sleep 1
if [ ! "$(jobs -r)" ]; then
# la procedure de gestion de disque s'est terminé, on arréte le script
exit 1
fi
DOSSIERS=( "DOSSIER1" "DOSSIER2" "DOSSIER3" )
# verification du taux d'occupation des dossiers
for unDossier in "${DOSSIERS[@]}"
do
echo "${unDossier}" >&4
done
while true
do
# attente modification du filesysteme
dossierConcerne="$(inotifywait -r --format %w -e modify -e close_write -e moved_to -e create "${DOSSIERS[@]}" 2>/dev/null)"
# on envoie le dossier concerne au processus dédié
echo "${dossierConcerne}" >&4
done
Note :
- valoriser la variable DOSSIERS par la liste des filesystemes à vérifier
- j'applique un simple echo lorsque cela dépasse les 80% ... remplacer par un traitement spécifique
la gestion par un pipe n'est pas forcément utile mais j'y trouve tout de même un intérêt : cela permet en cas de modifications multiple entre 2 "inotifywait" de ne pas "louper" d'événement
EDIT : la seule chose qui manque à ce script est de tester au moins une fois l'espace disque de tous les dossiers avant de rentrer dans la boucle while true....
EDIT2 : Changement du nom d'une variable + ajout de la vérification des dossiers avant de rentrer dans la boucle + ahjout de la fonctionnalité de suppresion du fichier le plus ancien jusqu'au taux d'occupation demandé.
EDIT3: Correction suite remarque Biounator dans les posts suivant
Dernière modification par Totor (Le 12/11/2009, à 20:43)
-- Lucid Lynx --
Hors ligne