Ok !
je viens de tester, et avec une seule ligne, ça fonctionne tout aussi bien
je passe au reste du script... :o ...
Ok !
je viens de tester, et avec une seule ligne, ça fonctionne tout aussi bien
je passe au reste du script... :o ...
Ben ça, c'est toi qui choisis!
Effectivement, dans le else, du coup, tu as 3 "echo" suivis d'un "exit" (j'ai légèrement et isofonctionnellement modifié la présentation):
Je ne sais pas si tu comprends bien ce que ça fait...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 echo -e $ROUGE "==============================================\n Procédure Sauvegarde SovTotale-1 interrompue par l'utilisateur à : $Heure le $Date\n ==============================================" echo -e $ROUGE "==============================================\n Abandon sauvegarde à : $Heure le $Date\n =============================================="; echo -e $STNDT "Sortie Sauvegarde SovTotale-1" exit
Dans le doute: chaque "echo" affiche des informations à celui qui lit.
A priori, il semble que les 1er et 2ème "echo" soient redondants.
Tu peux donc supprimer l'une des deux lignes...
sauf si tu as un autre script qui scrute la sortie de celui-ci et cherche à repérer des lignes contenant "Sauvegarde.*interrompue" ou "Abandon sauvegarde", évidemment!
j'ai déjà modifié et n'ai gardé que la première ligne
je préfère la redondance en support, que de commande inutile
bon, je continue l'élagage...
Pour le 1er cas:
Tes disque dur de sauvegarde sont tous montés (d'après ton script) sur un répertoire qui se trouve dans /media/user/, il faut donc que tu vérifie en amont que ces disques soient bien présents, donc il suffit de vérifier que chaque répertoire de sauvegarde ne soit pas la même source que le répertoire dans lequel il se trouve (ici /media/user) :
Pour avoir la source d'un répertoire (par exemple celle de /media/user) :
et si cette source est identique à celle de /media/user/SSD32Go/ par exemple, alors c'est que ton disque pour SSD32Go n'est pas monté.
Code : Sélectionner tout - Visualiser dans une fenêtre à part df --output=source /media/user | tail -1
Code : Sélectionner tout - Visualiser dans une fenêtre à part [[ "`df --output=source /media/user/ | tail -1`" != "`df --output=source /media/user/SSD32Go/ | tail -1`" ]] && echo OK
Cordialement.
Vérifier en amont... la ligne qui précède la commande de sauvegarde, c'est bon, où trop "juste"... ?
Puisque tous mes supports sont montés sous media, ne devrai-je pas plutôt indiquer :
il indique OK en cas de présence, et en cas d'absence ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part [[ "`df --output=source /media/user/SSD32Go/ | tail -1`" != "`df --output=source /media/user/SSD32Go/ | tail -1`" ]] && echo OK
sinon, si j'évite de préciser SSD32Go, et, puisque les autres supports sont montés, la vérification n'indiquera rien en cas d'absence d'un support... !
j'ai suivi ou j'suis à l'ouest...
Juste avant la commande de sauvegarde, c'est bon.
Pour le reste, tu es selon ton expression, à l'ouest
Pour comprendre, tu n'as qu'à faire les 2 commandes suivantes et tu verras la différence:
ensuite tu retires ton disque SSD32Go et tu refais les 2 commandes
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 df --output=source /media/user/ | tail -1 df --output=source /media/user/SSD32Go/ | tail -1
Cordialement.
j'ai testé les 2 commandes, que j'ai insérées à la ligne 36, du script indiqué #19 et commentées puis décommentées, l'une après l'autre, bien entendu, à moins qu'elles auraient pu fonctionner ensemble...
le sachant pas, j'ai préféré les activer une à une !
mais peut-être étaient-elles mal situées pour ce test, car j'ai obtenu avec la première commande :
puis avec la seconde commandedf --output=source /media/bernard/ | tail -1
Exécuter la sauvegarde SovTotale-1 ? [o/N]
===============================================
Lancement sauvegarde SovTotale-1 à : 20:29:30 le 19-04-2018
===============================================
/dev/sda2
============================================
Synchronisation en cours sur SSD32Go
...
C'est la seconde qui est juste, car le ssd32Go est bien en sde1 !
df --output=source /media/bernard/SSD32Go/ | tail -1
Exécuter la sauvegarde SovTotale-1 ? [o/N]
===============================================
Lancement sauvegarde SovTotale-1 à : 20:31:48 le 19-04-2018
===============================================
/dev/sde1
============================================
Synchronisation en cours sur SSD32Go
...
par contre, j'ai déconnecté le ssd puis relancé... bouh... il tente d'écrire... heureusement que Ctrl+C l'arrête bien...
mais il va falloir que je nettoie /media/SSD32Go... car le ssd s'y est créé...
aurai-je dû apercevoir d'autres éléments ?
Non !!!
Les deux commandes étaient à faire dans un terminal pas dans ton script, pour te faire comprendre la différence entre les 2 commandes.
dans ton script, tu dois utiliser un if pour savoir si tu peux lancer le rsync:
La partie else est facultative, à toi de voir, c'est la partie en cas de problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 if [[ "`df --output=source /media/user/ | tail -1`" != "`df --output=source /media/user/SSD32Go/ | tail -1`" ]] then rsync ......... else blabla .... fi
Sinon, le [[ .... ]] vérifie que la chaine résultat du premier df n'est pas la même que le deuxième df, si on a le même, c'est que le disque n'est pas monté.
Cordialement.
ok !
voici le résultat des 2 commandes en console :
la première m'indique ma partition principale, et la seconde, m'indique la "bonne" partition, qui est en sde1 !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 # df --output=source /media/bernard/ | tail -1 /dev/sda2 # # df --output=source /media/bernard/SSD32Go/ | tail -1 /dev/sde1 #
je teste la ligne que tu m'indiques, dans le script de test !
je viens de tester, et ça fonctionne nickel !
cependant, après avoir activé le second support, même si le 1er support est absent, le script continue à lire... et effectue la sauvegarde...
toutefois, comme j'ai 5 supports... y aurait-il une manière de tester leur présence au lancement de la sauvegarde, et me donner la main le cas échéant, soit pour continuer, soit pour connecter le support manquant ?
je pensais faire de la même manière que le début du script, lorsqu'il interroge sur le vouloir faire la sauvegarde, mais là ce serait...
la nuit portant "conseil", je vais prendre "conseil"...
En attendant, Merci pour l'avancement dans l'amélioration
pour la dernière ligne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 if [[ "`df --output=source /media/user/ | tail -1`" != "`df --output=source /media/user/SSD32Go/ | tail -1`" ]] # vérifie que la chaine résultat du premier df est différente du deuxième df, si identique = support absent then echo -e $ROUGE " Synchronisation en cours sur SSD32Go\n" rsync --archive --partial --progress --delete-during --stats /home/user/.thunderbird /media/user/SSD32Go/ 2>> "$backup" else echo -e $ROUGE "\n !!! support SSD32Go absent !!!\n"; fi if [ $? -ne 0 ]; then echo "y a un pb sur support SSD32Go"; fi # vérification du résultat de la sauvegarde, dans le backup :
if [ $? -ne 0 ]; then echo "y a un pb sur support SSD32Go"; fi
je ne l'ai pas encore testée... difficile de faire une erreur...
sinon, l'ensemble de ces commandes est-il correct ?
si oui, je l'adapte pour les autres supports... !
cependant, il reste encore une "chose" qui me chiffonne...
en cas d'absence du support, comment faire pour reprendre la main, via une question "support SSD32Go à connecter : oui/non ?"
"oui" = connexion ssd, puis reprise du script pour lancer la sauvegarde sur SSD32Go !
"non" continuer le script pour les autres supports présents !
le fait d'imbriquer plusieurs if, then, etc... peut-il nuire, ou pas, au bon fonctionnement du script ?
je viens de la tester... et elle fonctionne
mais... entre les dernières lignes de :
donc, entre la ligne 6 et 7, comment insérer : "connecter, ou pas, le support = o / n"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 if [[ "`df --output=source /media/bernard/ | tail -1`" != "`df --output=source /media/bernard/SSD32Go/ | tail -1`" ]] # vérifie que la chaine, résultat du premier df, est différente du deuxième df, si identique = support absent then echo -e $ROUGE "\n\n ====================================\n Synchronisation en cours sur SSD32Go\n ====================================\n" rsync --archive --partial --progress --delete-during --stats /home/bernard/.thunderbird /media/bernard/SSD32Go/ 2>> "$backup" else echo -e $ROUGE "\n !!! support SSD32Go absent !!!\n"; fi if [ $? -ne 0 ]; then echo "y a un pb sur support SSD32Go"; fi # vérification du résultat de la sauvegarde, dans le backup :
merci de vos retours
sinon, bonne fin de semaine Ensoleillée
Pas d'idée ?
Attention au piège classique! La variable $? est la valeur du retour de la dernière commande exécutée.
Pour faciliter l'évolution d'un script ainsi que son débogage, il est très fortement recommandé de stocker son contenu dans une variable personnelle, ce qui donne (simple adaptation de ton script):
Mais on voit qu'il y a un bug. En effet, si on passe dans le "else" (ligne 8), du coup, la variable "retour_rsync" n'est pas définie alors qu'elle sera utilisée en ligne 10!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 if [[ "`df --output=source /media/bernard/ | tail -1`" != "`df --output=source /media/bernard/SSD32Go/ | tail -1`" ]] # vérifie que la chaine, résultat du premier df, est différente du deuxième df, si identique = support absent then echo -e $ROUGE "\n\n ====================================\n Synchronisation en cours sur SSD32Go\n ====================================\n" rsync --archive --partial --progress --delete-during --stats /home/bernard/.thunderbird /media/bernard/SSD32Go/ 2>> "$backup"; retour_rsync=$? # Ici, on peut par exemple afficher sa valeur: echo "rsync a retourné ${retour_rsync}" else echo -e $ROUGE "\n !!! support SSD32Go absent !!!\n" fi # ici on peut tester sa valeur: if [ ${retour_rsync} -ne 0 ]; then echo "y a un pb sur support SSD32Go"; fi # vérification du résultat de la sauvegarde, dans le backup :
Il vaudrait donc mieux faire le test au bon endroit!
Dans un de mes posts, j'avais proposé de tester le retour de "rsync". Tu peux donc faire, soit:
Soit:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 if [[ "`df --output=source /media/bernard/ | tail -1`" != "`df --output=source /media/bernard/SSD32Go/ | tail -1`" ]] # vérifie que la chaine, résultat du premier df, est différente du deuxième df, si identique = support absent then echo -e $ROUGE "\n\n ====================================\n Synchronisation en cours sur SSD32Go\n ====================================\n" rsync --archive --partial --progress --delete-during --stats /home/bernard/.thunderbird /media/bernard/SSD32Go/ 2>> "$backup"; retour_rsync=$? # Ici, on peut par exemple afficher sa valeur: echo "rsync a retourné ${retour_rsync}" # ici on peut tester sa valeur: if [ ${retour_rsync} -ne 0 ]; then echo "y a un pb sur support SSD32Go"; fi # vérification du résultat de la sauvegarde, dans le backup : else echo -e $ROUGE "\n !!! support SSD32Go absent !!!\n" fi
Ça, c'était pour le cas où "rsync" n'arrive pas à faire son boulot.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 if [[ "`df --output=source /media/bernard/ | tail -1`" != "`df --output=source /media/bernard/SSD32Go/ | tail -1`" ]] # vérifie que la chaine, résultat du premier df, est différente du deuxième df, si identique = support absent then echo -e $ROUGE "\n\n ====================================\n Synchronisation en cours sur SSD32Go\n ====================================\n" if ! rsync --archive --partial --progress --delete-during --stats /home/bernard/.thunderbird /media/bernard/SSD32Go/ 2>> "$backup" then echo "y a un pb sur support SSD32Go" fi # vérification du résultat de la sauvegarde, dans le backup : else echo -e $ROUGE "\n !!! support SSD32Go absent !!!\n" fi
Mais j'ai l'impression que ta question concerne le "else" du test (insérer entre les lignes 6 et 7).
Dans ce cas, il suffit de ne pas mettre le "fi" sur la même ligne!
De toute façon et dans tous les cas, il n'est pas recommandé de le mettre sur la même ligne car cela gêne la lecture.
Àmha, on peut très bien mettre le "; fi" en fin de ligne dans un "petit" cas (où tout tient sur une seule ligne):
mais il vaut mieux éviter de le mettre lorsque le "then" ou le "else" n'est pas surt la même ligne que le "if":
Code : Sélectionner tout - Visualiser dans une fenêtre à part if <condition>; then <faire_si_ok>; else <faire_si_pas_ok>; fi
Car, en lecture rapide, l'<instruction_apres_la_fin_du_if> semble être DANS le "else" et non après la fin du "if"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 # PAS RECOMMANDÉ: if <condition> then <faire_si_ok> else <faire_si_pas_ok>; fi # <= PAS RECOMMANDÉ <instruction_apres_la_fin_du_if>
Pour en revenir à tes moutons, lorsque la comparaison des "df" indique qu'il y a un problème, il suffit de faire:
mais je ne connais pas l'instruction qui permet de connecter le support par programme (je ne sais pas si c'est possible)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 if [[ "`df --output=source /media/bernard/ | tail -1`" != "`df --output=source /media/bernard/SSD32Go/ | tail -1`" ]] # vérifie que la chaine, résultat du premier df, est différente du deuxième df, si identique = support absent then echo -e $ROUGE "\n\n ====================================\n Synchronisation en cours sur SSD32Go\n ====================================\n" if ! rsync --archive --partial --progress --delete-during --stats /home/bernard/.thunderbird /media/bernard/SSD32Go/ 2>> "$backup" then echo "y a un pb sur support SSD32Go" fi else echo -e $ROUGE "\n !!! support SSD32Go absent !!!\n" echo "Veuillez connecter le support!" fi
Après, on peut aussi faire une boucle avec "avez-vous connecté le support?". Si réponse "oui", on boucle sur le test pour vérifier si c'est bien vrai, si réponse "non", on quitte.
Merci pour tes suggestions, que je vais tester, même si j'ai réussi... en galérant... à poser ma "question" dans un nouveau script, mais il fait "lourd" et laborieux...
je vais tenter d'inclure ces suggestions et indiquerai les scripts, celui que j'ai réalisé tant bien que mal... et celui où j'aurai inséré ces suggestions, si j'y arrive
Me revoilà avec un script, qui est...
avec son résultat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94 #!/bin/bash # # Ce script permet de faire une sauvegarde incrémentale manuelle avec "rsync" # # Variables de couleurs BLANC="\\033[0;02m" BLANCLAIR="\\033[1;08m" #invisible... BLEU="\\033[1;34m" CYAN="\\033[1;36m" JAUNE="\\033[1;33m" ROSE="\\033[1;35m" ROUGE="\\033[1;31m" STNDT="\\033[0;39m" VERT="\\033[1;32m" Date=$(date +%d-%m-%Y) Heure=$(date +%T) echo -e $BLEU "Exécuter SOV1 ? [o/N]"; # Pour plus de lisibilité, la réponse par défaut est donnée en majuscule à la suite de la question. read -sn1; # Inutile d'entrer plus d'un caractère, ni d'appuyer sur la touche entrée. if [[ $REPLY =~ [yYoO] ]] # La variable REPLY est automatiquement créée par la fonction read du bash (builtins) then echo -e $VERT "\n ======================\n Lancement sauvegarde à\n $Heure le $Date\n ======================\n" else echo -e $ROUGE "=====================================================================\n Procédure SOV1 interrompue par l'utilisateur à $Heure le $Date\n ====================================================================="; echo -e $STNDT "\n Sortie SOV1\n"; exit; fi # pour donner un nom "raccourci" (incluant le chemin) au fichier backuperror.log : backup=/home/bernard/bin/Sauvegardes/backuperrorSOV1.log # à noter l'usage des ">" : # Un seul ">" renvoie le contenu du terminal dans le fichier indiqué # en écrasant tout ce que contient déjà ce fichier. # ">>" renvoie le contenu du terminal sans écraser ce que contient déjà le fichier. # Le chiffre "2" suivi d'un seul ">" renvoie seulement les messages d'erreurs # générés par le processus dans le fichier indiqué en écrasant le contenu de ce fichier. # "2>>" renvoie les erreurs sans écraser le contenu du fichier. #SSD32Go if [[ "`df --output=source /media/bernard/ | tail -1`" != "`df --output=source /media/bernard/SSD32Go/ | tail -1`" ]] # vérifie que la chaine, résultat du premier df, est différente du deuxième df, si identique = support absent then echo -e $VERT "\n\n ====================================\n Synchronisation en cours sur SSD32Go\n ====================================\n" rsync --archive --partial --progress --delete-during --stats /home/bernard/.thunderbird /media/bernard/SSD32Go/ 2>> "$backup"; retour_rsync=$? echo echo -e $STNDT " rsync a retourné ${retour_rsync}" echo else echo -e $ROUGE "connectez le support manquant, puis validez par o ? [o/N]"; # support manquant, le connecter ou pas... read -sn1; if [[ $REPLY =~ [yYoO] ]] then echo -e $VERT "\n ======================\n Lancement sauvegarde à\n $Heure le $Date\n ======================\n" ; echo -e $JAUNE "\n\n ====================================\n Synchronisation en cours sur SSD32Go\n ====================================\n" rsync --archive --partial --progress --delete-during --stats /home/bernard/.thunderbird /media/bernard/SSD32Go/ 2>> "$backup"; retour_rsync=$? else echo -e $ROUGE "\n !!! abandon sauvegarde sur support SSD32Go absent !!!\n"; fi fi # if [ ${retour_rsync} -ne 0 ]; then echo -e $ROUGE "y a un pb sur support SSD32Go"; fi #SSHD500-1 if [[ "`df --output=source /media/bernard/ | tail -1`" != "`df --output=source /media/bernard/SSHD500-1/ | tail -1`" ]] then echo -e $VERT "\n\n =======================================\n Synchronisation en cours sur SSHD500-1/\n =======================================\n" rsync --archive --partial --progress --delete-during --stats --exclude="/media" --exclude="/proc" --exclude="/sys" / /media/bernard/SSHD500-1/ 2>> "$backup"; retour_rsync=$? echo echo -e $STNDT " rsync a retourné ${retour_rsync}" echo else echo -e $ROUGE "connectez le support manquant, SSHD500-1, puis validez par o ? [o/N]"; read -sn1; if [[ $REPLY =~ [yYoO] ]] then echo -e $VERT "\n ======================\n Lancement sauvegarde à\n $Heure le $Date\n ======================\n" ; echo -e $JAUNE "\n\n ====================================\n Synchronisation en cours sur SSHD500-1/\n ====================================\n" rsync --archive --partial --progress --delete-during --stats --exclude="/media" --exclude="/proc" --exclude="/sys" / /media/bernard/SSHD500-1/ 2>> "$backup"; retour_rsync=$? else echo -e $ROUGE "\n !!! abandon sauvegarde sur support SSHD500-1/ absent !!!\n"; fi fi # if [ ${retour_rsync} -ne 0 ]; then echo -e $ROUGE"y a un pb sur support SSHD500-1/"; fi # Vérification des liens = faite # Insertion de la date à la fin de la liste d'erreur si le fichier backuperror # n'est pas vide (c'est à dire s'il y a des erreurs), ce que vérifie l'option "-s" : if [ -s "$backup" ]; then { date >> "$backup" } #fi # Mise à jour de l'heure Heure=$(date +%T) echo -e $VERT "======================\n Sauvegarde terminée à\n $Heure le $Date\n ======================\n" fi echo -e $STNDT # ---- fin du script ----
Vous voyez de suite une des anomalies... pas de date et heure de fin, car "pâté" sur le script... où je tourne en rond pour solutionner...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 # /home/bernard/MesScripts/SOV1.sh Exécuter SOV1 ? [o/N] ====================== Lancement sauvegarde à 17:49:56 le 26-04-2018 ====================== ==================================== Synchronisation en cours sur SSD32Go ==================================== ... sent 132,610 bytes received 647 bytes 266,514.00 bytes/sec total size is 9,229,139,441 speedup is 69,258.20 rsync a retourné 0 ======================================= Synchronisation en cours sur SSHD500-1/ ======================================= ... sent 12,622,331 bytes received 33,494 bytes 3,615,950.00 bytes/sec total size is 259,844,224,080 speedup is 20,531.59 rsync a retourné 0 /home/bernard/MesScripts/SOV1.sh: ligne 92: erreur de syntaxe près du symbole inattendu « fi » /home/bernard/MesScripts/SOV1.sh: ligne 92: `fi' #
l'autre des anomalies, est aucune inscription sur le backuperrorSOV1.log qui est bien créé, mais reste vide... ???
normale avec le "2>>" peut-être ?
mais dans ce cas, pour quelle raison, si je change de fichier, en prenant l'ancien, il va m'inscrire la date/heure de la sauvegarde... ?
Script testé hier, avec un seul support, connecté, puis déconnecté, et cela a bien fonctionné...
aujourd'hui, je n'ai pas encore testé la déconnexion d'un des supports...
Ton erreur ici est sur la ligne 87:
Je ne comprend pas ton besoin des accolades ici, mais la syntaxe est:
Code : Sélectionner tout - Visualiser dans une fenêtre à part { date >> "$backup" }
IL Y A TOUJOURS UN ";" OU UN RETOUR À LA LIGNE AVANT L'ACCOLADE FERMANTE
Code : Sélectionner tout - Visualiser dans une fenêtre à part { date >> "$backup" ; }
Cordialement.
j'te jure que c'est à l'insu de moi-même, pour les accolades...
et comme je méconnaissais, et bien... je les ai laissées...
maintenant que je connais, juste un peu plus, grâce à Vous tous, je serai sans excuse, la prochaine fois
sinon, possibilité ou pas de les supprimer ?
pour le retour à la ligne, est-ce bien "\n" ?
avant que je corrige le script
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager