2014-05-04 2 views
1

J'écris un script bash qui effectue une sauvegarde sur un lecteur monté. La sauvegarde elle-même fonctionne bien, mais même s'il y a une erreur lors du transfert, elle sera réussie.Bash - code d'erreur dans si l'instruction ne fonctionne pas

backup() { 
echo -e "Backup Started\n" >> $1 
echo -e "Mounting backup Drive" >> $1 
mount $2 /mnt 2>>$1 
if [ $? -eq 0 ] ; then 
    echo -e "Backup Drive: $2 mounted successfully" >> $1 
    cd/
    echo -e "Sync data to $2\n" >> $1 
    nice -n 19 rsync -lHa --exclude-from '/opt/ts/bin/exclude.txt'//mnt/ 2> ${ERROR} 
    local RETURNCODE=$? 
    if [ $RETURNCODE -eq 23 ] ; then backup_failed "Backup Warning: Some files did not copy" $1 $2; fi 
    if [ $RETURNCODE -eq 20 ] ; then backup_failed "Backup Failed: Transfer was terminated prematurely" $1 $2; fi 
    if [ $RETURNCODE -eq 11 ] ; then backup_failed "Backup Failed: Input/Output Error [URGENT]" $1 $2; fi 
    if [ $RETURNCODE -ne 0 ] ; then backup_failed "Backup Failed: Error while copying data" $1 $2; fi 
    echo -e "Backup completed Successfully with code $RETURNCODE `date`\n" >> $1 
    echo -e >> $1 
    printf "Time taken: "%dh:%dm:%ds"\n" $(($SECONDS/3600)) $(($SECONDS%3600/60)) $(($SECONDS%60)) >> $1 
    echo -e "##############################\n" >> $1 
    mkdir -p /mnt/mnt /mnt/proc /mnt/tmp /mnt/lost+found 
    cp -a /proc/mounts /proc/filesystems /mnt/proc 
    umount $2 
fi 
} 

Malgré $ RETURNCODE donnant une valeur de 20, il ne se déclenche pas. La sortie est ci-dessous.

sauvegarde de montage pour disque lecteur de sauvegarde:/dev/hda4 monté avec succès Sync/dev/hda4

Sauvegarde terminée avec succès avec le code 20 Sun 4 mai 2014 11:04:48 EST

Temps prise: 0h: 0m: 3s

#

Si quelqu'un a des suggestions, il serait apprécié :)

+0

'set -x' est votre ami. Tracez l'exécution du script et voyez ce qu'il fait réellement. –

+0

En outre, je recommande fortement d'exécuter ceci à travers http://shellcheck.net/ - il a beaucoup de bugs mineurs qui ne sont probablement pas responsables de votre question, mais devrait toujours être corrigé. –

Répondre

3

Êtes-vous sûr que le func tion backup_failed se comporte comme prévu?

Notez également que backup_failed sera déclenché deux fois lorsque RETURNCODE est différent de 0 et backup_failed ne se termine pas le script:

if [ $RETURNCODE -eq 20 ] ; then backup_failed ... 
... 
if [ $RETURNCODE -ne 0 ] ; then backup_failed ... 

Hope this helps.

+1

Merci threadp :) Vous aviez raison, backup_failed ne se comportait pas comme prévu. Il y avait une instruction if qui comparait les fichiers qui ne sauvegardaient pas à une liste d'exclusions. Cela venait d'une version plus ancienne du script et ne se déclencherait jamais dans la version actuelle. – user3600401

+0

En fait, c'est encore pire que ça, parce que si RETURNCODE est 20, il appellera 'backup_failed' deux fois (comme décrit), et aussi" Sauvegarde terminée avec succès avec le code 20 ... " –

+0

backup_failed termine le script une fois qu'il a terminé, il fonctionne comme prévu mais je prévois d'améliorer le code (je n'ai pas fait le script à l'origine, on m'a demandé d'ajouter une erreur de gestion et de changer de cpio à rsync) :) – user3600401