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 22/09/2011, à 02:34

alefriedx

[Resolu] Script bash de sauvegarde : help !

Bonjour,

j'essaie de me faire un petit script bash pour sauvegarder des dossiers sur un DD externe.
Je me suis dit qu'en lançant un process par dossier à sauvegarder, ça irait plus vite.
J'ai voulu éviter le défilé d'informations en ajoutant -q à rsync.

Ducoup, je voudrais détecter la fin des différents processus, et je galère sur cette partie, sauriez vous m'aider à terminer ce script svp ?
L'idée que j'ai eu a été de stocker les pids de chaque instance de rsync dans un tableau, puis de le comparer aux processes qui existent, dans une boucle afin de savoir quand ils ont disparu ... C'est ce qui m'a paru le plus simple ... au début !

#!/bin/bash

REPERTOIRE_DESTINATION="/media/DEDE/BKP/"
REPERTOIRE_SOURCE=("/media/DATA/WORK" "/media/DATA/PICTURES" "/media/DATA/PHOTOTEQUE" "/media/DATA/PERSO" "/media/DATA/MUSIC")
PIDS=()

# Détecter la présence du volume de destination et interrompre l'opération si nécessaire
if [ ! -e "$REPERTOIRE_DESTINATION" ]
then
echo "Attention, le disque de sauvegarde n'est pas présent"
exit
fi

for i in ${!REPERTOIRE_SOURCE[@]}; do
# echo La sauvegarde de ${REPERTOIRE_SOURCE[i]} a démarré
# rsync -aq --del --stats --filter "- .thumbnails/" --filter "- .Trash/" --filter "- *.tmp" --filter "- *.iso" --filter "- lost+found/" --filter "- .cache/" --filter "- .beagle/" ${REPERTOIRE_SOURCE[i]} "$REPERTOIRE_DESTINATION" &
 sh ./truc.sh &
 PIDS[i]=$!
done

# cette partie ne fonctionne pas
while :
do
 for i in ${!PIDS[@]}
 echo
 do
  pid=$(ps aux | awk '{print $2 }' | grep ${PIDS[i]})
  if [ ! $pid = ${PIDS[i]} ]; then
   break
  fi
 done
done

echo "finished !"

merci pour vos lumières, et soyez bienveillants, je débute en bash wink

Dernière modification par alefriedx (Le 26/09/2011, à 19:03)

Hors ligne

#2 Le 22/09/2011, à 03:57

chaying

Re : [Resolu] Script bash de sauvegarde : help !

Bonjour

Je n'utilise jamais rsync mais pourquoi ne pas mettre simplement un test de fin avec une alarme, genre :

[ $? == 0 ] && echo "process termine !" || echo "probleme !"

a mettre juste apres ta commande rsync, oeuf corse. wink

C'est ce qui me semble le plus simple.. Surtout qu'a la place des echo, tu peux mettre le traitement que tu veux.


Un arbre est un element fait de non-arbre elements.

Hors ligne

#3 Le 22/09/2011, à 12:40

alefriedx

Re : [Resolu] Script bash de sauvegarde : help !

Yo !

Pour donner quelquechose comme ça ? Sinon, je me dis que la variable $? va être écrasée à chaque tour de boucle nan ?

#!/bin/bash

REPERTOIRE_DESTINATION="/media/DEDE/BKP/"
REPERTOIRE_SOURCE=("/media/DATA/WORK" "/media/DATA/PICTURES" "/media/DATA/PHOTOTEQUE" "/media/DATA/PERSO" "/media/DATA/MUSIC")

# Détecter la présence du volume de destination et interrompre l'opération si nécessaire
if [ ! -e "$REPERTOIRE_DESTINATION" ]
then
echo "Attention, le disque de sauvegarde n'est pas présent"
exit
fi

for i in ${!REPERTOIRE_SOURCE[@]}; do
# echo La sauvegarde de ${REPERTOIRE_SOURCE[i]} a démarré
 rsync -aq --del --stats --filter "- .thumbnails/" --filter "- .Trash/" --filter "- *.tmp" --filter "- *.iso" --filter "- lost+found/" --filter "- .cache/" --filter "- .beagle/" ${REPERTOIRE_SOURCE[i]} "$REPERTOIRE_DESTINATION" & && [ $? == 0 ] && echo "process termine !" || echo "probleme !"
done

merci !

Hors ligne

#4 Le 22/09/2011, à 15:43

Postmortem

Re : [Resolu] Script bash de sauvegarde : help !

Salut,
Tu laisses tes commandes rsync telles que dans ton premier post.
A la fin de ton script, tu ajoutes ceci :

while [ -n "$(jobs)" ]
do
sleep 5
done

La commande jobs renvoie les processus en arrière plan.
Tant que la commande "jobs" renvoie quelque chose, un "sleep 5" est effectué. Si un de tes processus en arrière-plan se termine durant l'exécution du "sleep 5", à la fin de ce dernier, cela affichera à l'écran le process qui s'est terminé.
Tu peux le tester avec ceci par exemple :

$ sleep 30 &
$ sleep 40 &
$ while [ -n "$(jobs)" ]
> do
> sleep 5
> done

Tu verras ceci s'afficher :

[1]-  Fini                    sleep 30
[2]+  Fini                    sleep 40

Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#5 Le 22/09/2011, à 21:18

alefriedx

Re : [Resolu] Script bash de sauvegarde : help !

Salut,

ben heu, ça ne fonctionne pas sad

#!/bin/bash

sleep 10 && echo over &
sleep 15 && echo over &
while [ -n "$(jobs)" ]
do
sleep 1
echo tour
done

me retourne bien les 'over', mais pas le message de fin que tu m'indiques ... Qu'est ce qui cloche ?

Hors ligne

#6 Le 22/09/2011, à 21:42

alefriedx

Re : [Resolu] Script bash de sauvegarde : help !

Allez, après un peu de recherches, il suffit de :

sleep 1 && echo over &
sleep 2 && echo over &
wait 
echo "fini !"

Job Control Commands

fini !

Dernière modification par alefriedx (Le 22/09/2011, à 21:44)

Hors ligne

#7 Le 22/09/2011, à 21:52

Postmortem

Re : [Resolu] Script bash de sauvegarde : help !

C'est normal, le echo over attend la fin du sleep pour s'exécuter. Et un echo est presque instantané. Donc ça n'a rien à voir avec ce que je t'ai dit.
Teste comme je te l'ai dit.
Sinon, dans ton script, tu laisses les rsync comme t'avais mis au début :

rsync <options> <source> <cible> &

Puis tu ajoutes ce que je t'ai dit à la fin du script, hors de la boucle.

Dernière modification par Postmortem (Le 22/09/2011, à 21:54)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#8 Le 22/09/2011, à 23:25

alefriedx

Re : [Resolu] Script bash de sauvegarde : help !

pourtant :

sleep 30 &
sleep 40 &
while [ -n "$(jobs)" ]
do
sleep 5
done

semble tourner sans fin, avec ou sans les echo ...

Hors ligne

#9 Le 23/09/2011, à 00:01

Postmortem

Re : [Resolu] Script bash de sauvegarde : help !

Chez moi, ça me rend la main 40 secondes après l'exécution de sleep 40...
Moi pas comprendre ce qui de passe chez toi !
Ou alors, tu as un autre process en tache de fond ?!


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#10 Le 23/09/2011, à 02:07

alefriedx

Re : [Resolu] Script bash de sauvegarde : help !

ah !
ça doit être très con et très compliqué pour rien, mais j'ai réussi à ch... ça, qui semble fonctionner.
S'il y a des âmes braves, enclines à me simplifier ça, je prends !

#!/bin/bash 

sleep 2 && echo over &
pidlist[1]=$!
done[1]=0
sleep 4 && echo over &
pidlist[2]=$!
done[2]=0
sleep 2 && echo over &
pidlist[3]=$!
done[3]=0

while true; do
 for i in `seq 1 ${#pidlist[*]}`
 do 
  job=${pidlist[$i]}
  test[$i]=$(ps -A | grep $job)
  if [ "${test[$i]}" = "" -a ${done[$i]} = 0 ]; then
   echo "le process $job est terminé"
   done[$i]=1
  fi
  done
 j=0
 for i in `seq 1 ${#done[*]}`; do
  if [ ${done[$i]} = 1 ]; then
   j=$(($j+1))
  fi
 done
 if [ $j = ${#done[*]} ]; then
  echo 'fini !'
  exit
 fi
sleep 1
done

Hors ligne

#11 Le 23/09/2011, à 10:03

Postmortem

Re : [Resolu] Script bash de sauvegarde : help !

Salut,
Désolé, je t'ai induit en erreur, l'exemple que je t'ai donné avec les "sleep" tourne en effet indéfiniment quand c'est lancé depuis un script alors que si tu passes les commandes directement dans le terminal, ça fonctionnait... Je ne sais pas pourquoi !?
Suis donc reparti de ton script du premier post et j'ai fait qq modifs (et j'ai testé en faisant un cp à la place de rsync).
Et j'ai utilisé "wait" que je connaissais pas (donc merci à toi !)
Avec ça, on devrait arriver à ce que tu voulais :

$ cat test.sh 
#!/bin/bash

REPERTOIRE_DESTINATION="${HOME}/Bureau/test-copie"
REPERTOIRE_SOURCE=("/windows/C/Users/mon_user/Pictures" "/windows/C/Users/mon_user/Documents")

# Détecter la présence du volume de destination et interrompre l'opération si nécessaire
if [ ! -d "$REPERTOIRE_DESTINATION" ]
then
    echo "Attention, le disque de sauvegarde n'est pas présent"
    exit 1
fi

for rep in "${REPERTOIRE_SOURCE[@]}"
do
    echo "$(date) : La sauvegarde de ${rep} a démarré"
    { cp -dR ${rep} ${REPERTOIRE_DESTINATION}; echo "$(date) : Fin sauvegarde ${rep}";} &
done

wait

echo "finished !"

$ ./test.sh 
vendredi 23 septembre 2011, 09:18:11 (UTC+0200) : La sauvegarde de /windows/C/Users/mon_user/Pictures a démarré
vendredi 23 septembre 2011, 09:18:11 (UTC+0200) : La sauvegarde de /windows/C/Users/mon_user/Documents a démarré
vendredi 23 septembre 2011, 09:19:54 (UTC+0200) : Fin sauvegarde /windows/C/Users/mon_user/Documents
vendredi 23 septembre 2011, 09:23:06 (UTC+0200) : Fin sauvegarde /windows/C/Users/mon_user/Pictures
finished !

Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#12 Le 23/09/2011, à 18:24

pingouinux

Re : [Resolu] Script bash de sauvegarde : help !

Bonjour,

Pour en revenir à la boucle while (PostMortem #4), lorsqu'elle est incluse dans un script, un echo $(jobs) placé dans la boucle imprime indéfiniment : [2] Done sleep 40

Il suffit d'insérer dans cette boucle la commande jobs (ou même jobs >/dev/null), pour que la boucle s'arrête comme on s'y attendait.

Je ne comprends pas ce comportement bizarre.
Cordialement

En ligne

#13 Le 23/09/2011, à 21:02

Postmortem

Re : [Resolu] Script bash de sauvegarde : help !

@pingouinux : j'avais aussi remarqué que si on appelait la commande jobs dans la boucle, ça fonctionnait comme lorsque l'on était pas dans un script sans cette commande supplémentaire... Moi pas comprendre non plus ! C'est pour ça que j'ai pas insisté dans cette voix car j'aime pas mettre des trucs que je pige pas meme si ça fonctionne.
Puis je pense que la dernière solution que j'ai proposée est quand meme plus propre.
Mais si quelqu'un avait l'explication concernant cette boucle qui fonctionne hors d'un script et pas dedans, ça serait cool de nous expliquer car ça me titille !!


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#14 Le 25/09/2011, à 21:44

alefriedx

Re : [Resolu] Script bash de sauvegarde : help !

Hello, juste si ça intéresse encore quelqu'un, j'ai trouvé une solution waaaay plus simple pour ce que je voulais faire, c'est à dire que chaque process me dise quand il a fini. Je suis juste c.. de ne pas y avoir pensé plus tôt ... mais au moins j'aurais appris plein de choses !

REPERTOIRE_DESTINATION="/media/DEDE/BKP/"

# Détecter la présence du volume de destination et interrompre l'opération si nécessaire
if [ ! -e "$REPERTOIRE_DESTINATION" ]
then
echo "Attention, le disque de sauvegarde n'est pas présent"
exit
fi

REPERTOIRE_SOURCE=("/home/arnaud/Documents" "/media/DATA/WORK" "/media/DATA/PHOTOTEQUE" "/media/DATA/PERSO" "/media/DATA/MUSIC")

# sauvegarde du home
echo La sauvegarde de ${REPERTOIRE_SOURCE[0]} a démarré && echo compression de ${REPERTOIRE_SOURCE[0]} ... && tar -zcf ${REPERTOIRE_SOURCE[0]}.tar.gz ${REPERTOIRE_SOURCE[0]} && echo deplacement de ${REPERTOIRE_SOURCE[0]}.tar.gz vers $REPERTOIRE_DESTINATION ... && mv ${REPERTOIRE_SOURCE[0]}.tar.gz $REPERTOIRE_DESTINATION && echo La sauvegarde de ${REPERTOIRE_SOURCE[0]} est terminée &

# sauvegarde des autres données
for i in `seq 1 $((${#REPERTOIRE_SOURCE[*]}-1))`; do
 echo La sauvegarde de ${REPERTOIRE_SOURCE[i]} a démarré && rsync -aq --del --stats --filter "- .thumbnails/" --filter "- .Trash/" --filter "- *.tmp" --filter "- *.iso" --filter "- lost+found/" --filter "- .cache/" --filter "- .beagle/" ${REPERTOIRE_SOURCE[i]} "$REPERTOIRE_DESTINATION" && echo La sauvegarde de ${REPERTOIRE_SOURCE[i]} est terminée &
done


wait
echo FINI
exit

tchô et merci pour votre aide !

Hors ligne

#15 Le 25/09/2011, à 22:27

Postmortem

Re : [Resolu] Script bash de sauvegarde : help !

Je te suggère une petite modif sur le "for" qui le simplifie et simplifierait l'écriture de la suite :

for rep in "${REPERTOIRE_SOURCE[@]:1}"
do
rsync ......... "$rep" "$REPERTOIRE_DESTINATION"
done

Le "${REPERTOIRE_SOURCE[@]:1}" est remplacé par tous les éléments du tableau sauf le premier (et si un jour t'as des espaces dans tes chemins, c'est bien géré à condition de mettre $rep entre double-quotes dans la boucle)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#16 Le 26/09/2011, à 19:03

alefriedx

Re : [Resolu] Script bash de sauvegarde : help !

oui, c'est vrai.

merci!

Hors ligne