Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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"

On ne peut pas mettre d'array dans un string!
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 wink

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

Totor a écrit :

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.


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#14 Le 11/11/2009, à 18:15

Totor

Re : script qui test l espace disque disponible

sputnick a écrit :

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


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#16 Le 11/11/2009, à 18:34

Totor

Re : script qui test l espace disque disponible

sputnick a écrit :

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 ?


On ne peut pas mettre d'array dans un string!
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)


On ne peut pas mettre d'array dans un string!
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


On ne peut pas mettre d'array dans un string!
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 wink 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)


On ne peut pas mettre d'array dans un string!
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

sputnick a écrit :

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