Pages : 1
#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
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_fichierdo
echo $var_fichier
#Si le chemin existe pasif [ ! -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
elsefichier=$fichier" "$var_fichier
fidone<$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 $numif [ $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 ]; thenecho -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 ]; thenif [ $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 )
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
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
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
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 ^^ :) ? 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
Pages : 1