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 17/06/2008, à 08:12

deathstone42

script BASH

Bonjour à tous,

J'ai créer un script de sauvegarde en bash assez simple mais qui fonctionne très bien, je l'utilise pour passé un examen jeudi -_-". Après avoir mis en place ce script sur une "vrai" maichine, j'ai voulu utiliser le cron pour evidement utiliser le script journalièrement, c'est à ce moment la qu'un problement est survenu, en passant par le cron une partie du scripte (fichier log) ne s'effectu pas alors que lorsque je le lance de la manière "./monscripte" il n'y a aucun probleme, donc dans un premier temps j'ai testé :

- Cron en mode root --> fonctionne pas donc pas de probleme de droit
- Verification que tout mes liens sont en chemin absolue --> Fonctionne toujour pas -_-"

Voici la partie principal du scripte qui n'est pas effectué avec le cron


fct_log () {

        if [ $num -lt 10 ]; then
echo "ici"
                echo "0"$num :  Sauvegarde faite le $(date) :"sauvergarde_du_"$madate.tar.gz >> $fichier_log
        else
echo "la"
                echo $num :  Sauvegarde faite le $(date) :"sauvergarde_du_"$madate.tar.gz >> $fichier_log
        fi

Les rapports d'erreur qui vont dans un log erreur sont aussi pas prise en compte, enfaite toutes me incrementation de fichier texte ne fonctionne pas ! QUE FAIRE !! HELPPPPPPPPPP

Merci pour votre aide

Hors ligne

#2 Le 17/06/2008, à 08:18

DoK

Re : script BASH

rajoute au debut de ton script #!/bin/sh

Hors ligne

#3 Le 17/06/2008, à 08:20

deathstone42

Re : script BASH

au debut de mon scripte j'ai mis "#!/bin/bash"

Hors ligne

#4 Le 17/06/2008, à 11:30

Dark-Sham

Re : script BASH

echo "0"$num :  Sauvegarde faite le $(date) :"sauvergarde_du_"$madate.tar.gz >> $fichier_log
echo $num :  Sauvegarde faite le $(date) :"sauvergarde_du_"$madate.tar.gz >> $fichier_log

Ces deux lignes sont très bizarres, essaye

echo "0$num :  Sauvegarde faite le `date` :sauvergarde_du_$madate.tar.gz" >> $fichier_log
echo "$num :  Sauvegarde faite le `date` :sauvergarde_du_$madate.tar.gz" >> $fichier_log

Script de sauvegarde/restauration APT

Ubuntu 8.04 "Hardy Heron"
CPU : AMD Athlon XP 2800+ ; GPU : ATI Radeon 9250/9200 Series ; RAM : 2 Gigots + 512 Mégots ; Carte mère : Asus A7N8X-E Deluxe

Hors ligne

#5 Le 17/06/2008, à 12:02

deathstone42

Re : script BASH

Donc, j'ai pu tester le #!/bin/sh --> ne fonctionne absolument pas

echo "0$num :  Sauvegarde faite le `date` :sauvergarde_du_$madate.tar.gz" >> $fichier_log
echo "$num :  Sauvegarde faite le `date` :sauvergarde_du_$madate.tar.gz" >> $fichier_log

cela ne peu pas marcher car si je place des côtes a ces endroits mes variables $num et $madate seront vu comme une chaine de caractère

Hors ligne

#6 Le 17/06/2008, à 12:05

wblitz

Re : script BASH

tu peux poster tout le script ? ça aidera...


"Un optimiste, c'est un homme qui plante deux glands et qui s'achète un hamac" - Jean de Lattre de Tassigny
Pensez à mettre [RÉSOLU] dans le sujet de vos posts une fois qu'ils le sont...
quelques docs

Hors ligne

#7 Le 17/06/2008, à 12:10

deathstone42

Re : script BASH

$1 correspond a la destination de la sauvegarde
$2 correspond a la destination des fichiers log
$3 est un fichier text contenant les lien des fichiers ou dossiers a sauvegarder (un peu spécial je sais ^^)

Le scripte fait 5 sauvegarde (decidé sa pour le moment je rajoutrait un $4 si on souhaite modifié ce nombre) et efface la plus ancienne

Il reste pas mal de messages d'erreurs possible que je n'ai pas pris en comte

voila smile

merci pour votre aide


#!/bin/bash
#------------------------------------------------------------
#Verification si le fichier log existe, si "NON" il le crée
if [ ! -e $2 ]; then
        echo > $2
fi
if [ ! -e $2".error" ]; then
        echo > $2".error"
fi
#-------------------------------------------------------------
#Creation des variables
#-------------------------------------------------------------
madate=$(date +%b-%H%M%S)
destination=$1
fichier_log=$2
fichier_sav=$3
#Recupère le plus grand "nombre" parmis les sauvegardes
num=$(cut -f1 -d ":" $2 | sort -r | head -1)
if [ "$num" == "" ]; then
num="0"
fi
#La variable num et en base 10 (et non en octal comme par default)
num=$((10#$num))
#Incrementation de la variable "num"
num=$(($num+1))
#--------------------------------------------------------------
#Verification que le dossier de destination existe, si non, il la crée
#--------------------------------------------------------------
if [ ! -e $1 ]; then
mkdir $1 2>> $2".error"
fi
#--------------------------------------------------------------
#Recuperation des adresses de fichier ou dossier a sauvegarder
#--------------------------------------------------------------
#lecture ligne par ligne du fichier "fichier", adresse de dossiers ou fichiers à sauvegarder
#Test si le(s) chemin(s) dans "fichier" existe(nt)
#la variable "fichier" contiendra toutes les adresse de dossier ou fichier à sauvegarder
while read var_fichier

do
echo $var_fichier
                #Si le chemin existe pas

                if [ ! -e $var_fichier ]; then
                        echo ------------------------------------ >> $2".error"
                        echo $(date) >> $2".error"
                        echo -e "le chemin est introuvable : " $var_fichier >> $2".error"


                #Sinon si il existe
                else

                        fichier=$fichier" "$var_fichier
                fi

done<$3

#-------------------------------------------------------------
#Compression des dossiers et fichiers
#-------------------------------------------------------------

fct_compression () {

tar -cvzf $destination/sauvergarde_du_$madate.tar.gz $fichier 2>> $fichier_log".error"
echo "Sauvegarde effectuée"
echo $(date)

}

fct_log () {
echo $fichier_log
echo $num

        if [ $num -lt 10 ]; then
echo "ici"
                echo "0"$num :  Sauvegarde faite le $(date) :"sauvergarde_du_"$madate.tar.gz >> $fichier_log
        else
echo "la"
                echo $num :  Sauvegarde faite le $(date) :"sauvergarde_du_"$madate.tar.gz >> $fichier_log
        fi
}


#test si la destination du fichier compressée existe, si oui, la sauvegarde commence
#Si le chemin existe pas
if [ ! -e $destination ]; then

        echo -e "le chemin est introuvable : " $destination >> $2"error"

#Sinon si il existe
else
        fct_compression
fi

#--------------------------------------------------------------
#Supression de la plus ancienne sauvegarde
#--------------------------------------------------------------
#Control du nombre de sauvegarde deja faite
if [ $num -gt 5 ]; then

        if [ $num -gt 14 ]; then
                soustrac=$(($num-5))
                else
                soustrac="0"$(($num-5))
        fi
fi
if [ $num -lt 6 ]; then
        fct_log
else
        fichclear=$(grep "^$soustrac" $fichier_log | cut -d : -f 5)
        fichclear=$1"/"$fichclear
        echo $fichclear
        rm $fichclear
        fct_log
fi
#-------------------------------------------------------------------------------
exit 0

Dernière modification par deathstone42 (Le 17/06/2008, à 12:10)

Hors ligne

#8 Le 17/06/2008, à 12:31

wblitz

Re : script BASH

déjà, pour les chaînes de caratères, tu peux utiliser la syntaxe :

echo "$ma_variable"

qui t'affichera le contenu de ma_variable (ou alors tu as une version de bash très bizarre wink)
tu peux aussi utiliser la syntaxe :

echo "${ma_variable}"

s'il y a des caractères "collés" à la suite de ta variable :

echo "le prix est de ${prix}€"

pour les variables qui doivent contenir le résultat d'une commande :

variable="`date '+%b-%H%M%S'`"

suffit.

tu définis 3 variables que tu ne sembles pas utiliser par la suite (tu utilises encore $1, $2 et $3) c'est mieux des les utiliser et ça sera plus lisible pour toi.

je te conseille aussi de déclarer tes fonctions en début de fichier, c'est plus pratique pour s'y retrouver wink

tu peux poster le contenu du fichier sur lequel est effectué la commande cut ?

pour le pb du cron, peux-tu poster l'entrée correspondant au lancement de ton script ?


"Un optimiste, c'est un homme qui plante deux glands et qui s'achète un hamac" - Jean de Lattre de Tassigny
Pensez à mettre [RÉSOLU] dans le sujet de vos posts une fois qu'ils le sont...
quelques docs

Hors ligne

#9 Le 17/06/2008, à 12:38

deathstone42

Re : script BASH

le cut me permet de recuperer le nombre le plus grand de ma sauvegarde dans mon fichier log, c'est a dire la base j'aurais :
exemple :

01 : sauvegarde1.tar.gz
02 : sauvegarde2.tar.gz
03 : sauvegarde3.tar.gz

en fesant sa il inverse la premiere colone :

03
02
01

et selectione la premiere ligne que je met dans ma variable $num soit 03 comme dans l'exemple ce qui me permettra de recuperer le nom de la sauvegarde que je souhaite

pour les $1 $2 $3 ^^ pas faux, jvai y modifier, j'ai du les mettre dans d'autre variables car mes fonctios ne prenaient pas en compte les variables "$1 ..."

Dans mon cron j'ai :

52 22 * * *  /home/administrateur/savsite/./scpsav/home/administrateur/sauvegarde/ /home/administrateur/log.sh /home/administrateur/savsite/fichier

Dernière modification par deathstone42 (Le 17/06/2008, à 12:40)

Hors ligne

#10 Le 17/06/2008, à 12:48

Totor

Re : script BASH

deathstone42 a écrit :

pour les $1 $2 $3 ^^ pas faux, jvai y modifier, j'ai du les mettre dans d'autre variables car mes fonctios ne prenaient pas en compte les variables "$1 ..."

Les fonctions prennent en compte les variables $1, $2 ... mais il s'agit des paramètres de la fonction (et non du script) et ont donc une portée locale à la fonction.


-- Lucid Lynx --

Hors ligne

#11 Le 17/06/2008, à 12:50

wblitz

Re : script BASH

pour ta variable num, pas besoin de t'embêter, tu peux l'incrémenter directement (je viens de tester) :

num=`cut -f1 -d ":" $2 | sort -r | head -1`
if [ -x $num ]; then
num=0
fi
#Incrementation de la variable "num"
num=$(($num+1))

pour le cron, il te faut une entrée comme suit :

52 22 * * *      /home/administrateur/repertoire/mon_script.sh /chemin/de/la/sauvegarde /chemin/fichier/log /chemin/fichier/liens

parce que là, si je lis bien, ta ligne me paraît très bizarre...


"Un optimiste, c'est un homme qui plante deux glands et qui s'achète un hamac" - Jean de Lattre de Tassigny
Pensez à mettre [RÉSOLU] dans le sujet de vos posts une fois qu'ils le sont...
quelques docs

Hors ligne

#12 Le 17/06/2008, à 13:17

deathstone42

Re : script BASH

oups, petite faute de copier ^^ 52 22 * * *  /home/administrateur/savsite/./scpsav /home/administrateur/sauvegarde/ /home/administrateur/log.sh /home/administrateur/savsite/fichier

un espace en moin ^^ sry

#La variable num et en base 10 (et non en octal comme par default)
num=$((10#$num))
#Incrementation de la variable "num"
num=$(($num+1))

J'avais mis cette fonction il y un moment deja car lorsque je fesai des opération dans ma consol etait fait en octal alors ne me demandez pas pourquoi, donc j'ai convertie num en base 10 et plus de problemes de ce coté la ^^

Hors ligne

#13 Le 17/06/2008, à 13:25

deathstone42

Re : script BASH

Mais ce que je ne comprend pas c'est que lorsque je marque : 

/home/administrateur/savsite/./scpsav /home/administrateur/sauvegarde/ /home/administrateur/log.sh /home/administrateur/savsite/fichier

dans la consol cela fonctionne sans aucun problemes mais pas dans le cron que j'utilise avec root, le fichier .tar.gz ce crèe bien mais il n'arrive pas faire la fonction log

Dernière modification par deathstone42 (Le 17/06/2008, à 13:26)

Hors ligne

#14 Le 17/06/2008, à 13:37

DoK

Re : script BASH

cela fonctionne dans ta console car tes variables d'environnement sont chargées, elles ne le sont pas quand c'est cron qui lance le script

Hors ligne

#15 Le 17/06/2008, à 13:43

deathstone42

Re : script BASH

DoK a écrit :

cela fonctionne dans ta console car tes variables d'environnement sont chargées, elles ne le sont pas quand c'est cron qui lance le script

Mes vraibles d'environements fonction car $2 qui represente mes fichier log sont belle et bien créer quand je fait :
#Verification si le fichier log existe, si "NON" il le crée
if [ ! -e $2 ]; then
        echo > $2
fi
if [ ! -e $2".error" ]; then
        echo > $2".error"
fi

mais mes fichiers log restent vide et idem pour $1 et $3 elles fonctionnent

Dernière modification par deathstone42 (Le 17/06/2008, à 13:44)

Hors ligne

#16 Le 17/06/2008, à 14:09

wblitz

Re : script BASH

ça fonctionne l'appel à la fonction fct_compression quand c'est appelé au travers de cron ?


"Un optimiste, c'est un homme qui plante deux glands et qui s'achète un hamac" - Jean de Lattre de Tassigny
Pensez à mettre [RÉSOLU] dans le sujet de vos posts une fois qu'ils le sont...
quelques docs

Hors ligne

#17 Le 17/06/2008, à 14:33

deathstone42

Re : script BASH

Bon apres quelque verification, il y a une erreur lors da la fonction compression, lorsque mon scripte sauvegarde mon fichier /var/www et plante absolument tout et arrete le scripte (avec le cron) mais ne plante pas avec la ligne de commande clasique.
Donc pourquoi ^^ smile:) ? mon cron est pourtant bien renseigné en root, donc tout les acces devrai etre possible non ?

Hors ligne

#18 Le 17/06/2008, à 15:07

wblitz

Re : script BASH

Donc pourquoi ^^ ? mon cron est pourtant bien renseigné en root, donc tout les acces devrai etre possible non ?

rien ne te prouve (pour le moment) que c'est un problème de droits... remplace :

#!/bin/bash

par :

#!/bin/bash -x

et dans l'entrée cron, ajoute ceci à la fin :

> /var/log/script.log 2> /var/log/script.error

regarde ensuite ce qu'il y aura dans les deux fichiers script.log et script.error


"Un optimiste, c'est un homme qui plante deux glands et qui s'achète un hamac" - Jean de Lattre de Tassigny
Pensez à mettre [RÉSOLU] dans le sujet de vos posts une fois qu'ils le sont...
quelques docs

Hors ligne

#19 Le 17/06/2008, à 15:34

deathstone42

Re : script BASH

il y a juste le log avec les erreurs (2) qui a créer un fichier :

+ '[' '!' -e /home/administrateur/log.sh.error ']'
++ date +%b-%H%M%S
+ madate=jun-163301
+ destination=/home/administrateur/sauvegarde/
+ fichier_log=/home/administrateur/log.sh
+ fichier_sav=/home/administrateur/savsite/fichier
++ cut -f1 -d : /home/administrateur/log.sh
++ sort -r
++ head -1
+ num='06 '
+ '[' '06 ' == '' ']'
+ num=6
+ num=7
+ '[' '!' -e /home/administrateur/sauvegarde/ ']'
+ read var_fichier
+ echo /var/www
+ '[' '!' -e /var/www ']'
+ fichier=' /var/www'
+ read var_fichier
+ echo /home/administrateur/Bureau
+ '[' '!' -e /home/administrateur/Bureau ']'
+ fichier=' /var/www /home/administrateur/Bureau'
+ read var_fichier
+ '[' '!' -e /home/administrateur/sauvegarde/ ']'
+ fct_compression
+ tar -cvzf /home/administrateur/sauvegarde//sauvergarde_du_jun-163301.tar.gz /var/www /home/administrateur/Bureau
+ echo 'Sauvegarde effectuée'

Hors ligne

#20 Le 19/06/2008, à 08:16

wblitz

Re : script BASH

essaie en remplaçant $(date) par une variable contenant `date` :

fct_compression () {
date_courante="`date`"
tar -cvzf ${destination}/sauvergarde_du_${madate}.tar.gz $fichier 2>> ${fichier_log}.error
echo "Sauvegarde effectuée"
echo "$date_courante"

}

fct_log () {
date_courante="`date`"
echo $fichier_log
echo $num

        if [ $num -lt 10 ]; then
echo "ici"
                echo "0${num} :  Sauvegarde faite le ${date_courante} : sauvergarde_du_${madate}.tar.gz" >> $fichier_log
        else
echo "la"
                echo "$num :  Sauvegarde faite le ${date_courante} : sauvergarde_du_${madate}.tar.gz" >> $fichier_log
        fi
}

"Un optimiste, c'est un homme qui plante deux glands et qui s'achète un hamac" - Jean de Lattre de Tassigny
Pensez à mettre [RÉSOLU] dans le sujet de vos posts une fois qu'ils le sont...
quelques docs

Hors ligne