Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

probleme de log

2 réponses
Avatar
sébastien
bonjour,

j'utilise le script ci-dessous pour effectuer des sauvegardes de certains
répertoires toutes les heures. a priori il le fait très bien. mon seul
souci réside dans le fichier de log ( $FLOG ). je retrouve bien mes logs
dans le fichier mais à chaque execution le fichier log est réinitalisé
alors que au contraire j'aimerais pourvoir garder un historique des logs.

quelqu'un sait il ce que je dois modifier dans mon perl pour corriger cela ?

par avance merci.


----------script-------------
#!/usr/bin/perl
# -- include des modules necessaires
use File::Find; # -- module contenant la fonction de parcours recursif d'une
arborescence
use File::Path; # -- module contenant les fonctions portables de creation et
suppression de repertoire
use File::Copy; # -- module contenant les fonctions de copie et de
deplacement de fichiers

#-------------------------------------------#
# CORPS DU PROGRAMME #
#-------------------------------------------#
# -- sauvegarde des handles d'origine STDOUT et STDERR
open SAUV_STDOUT, ">&STDOUT";
open SAUV_STDERR, ">&STDERR";

# -- recuperer les parametres transmis
my $SOURCE = $ARGV[0];
my $DESTINATION = $ARGV[1];
my $EXCLUDE = $ARGV[2];
my $FLOG = '/home/sebastien/tmp/copie_fichier.log';

# -- variables locales pour le traitement des erreur(s)
my $ERR = 0; # -- nbre d'erreurs survenues
my $RC = 0; # -- code retour

if ( -e $SOURCE ) {
if ( $DESTINATION eq $SOURCE ) {
print "\n\nERREUR SUR COPIE DE $SOURCE VERS $DESTINATION : \n\n\tLe
dossier de destination est un sous-dossier du dossier source !\n\n";
$RC =1;
} else {
# -- traitement principal
&trace_log;
&main;
}
} elsif (not -e $SOURCE) {
print "\n\nERREUR SUR COPIE DE $SOURCE VERS $DESTINATION : \n\n\tDossier
source inexistant !\n\n";
$RC =1;
}

# -- restitution des handles d'origine
open STDOUT, ">&SAUV_STDOUT";
open STDERR, ">&SAUV_STDERR";
exit $RC;

# -- fin programme principal --

#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>PROCEDURES APPELEES

sub main {
my $racine; # -- repertoire source
my $decalage = 0; # -- var auxilliaire
undef local $refliste;
if (not -e $DESTINATION) {
eval { mkpath ("$DESTINATION") || die " ERREUR : Impossible de creer le
rep $DESTINATION : $!\n"; };
if ($@) {
print "$@";
return ++$ERR;
} else {
print"Creation $DESTINATION\tOK\n";
}
}
$refliste = &recup_motif($EXCLUDE);
print "\n motifs : @{$refliste}\n";
# -- copie incrementale des fichiers du rep $SOURCE vers $DESTINATION
find( \&copie_incrementale_fichier, $SOURCE );
# -- purge des fichiers du rep $DESTINATION
find( \&purge_fichier, $DESTINATION );
return $ERR;
}


sub aff {

next if ($_ =~ m/recycled/i);
print "$File::Find::dir\t";
print "$_\t";
print "$File::Find::name\n\n";
}


sub recup_motif {
my $fichier = $_[0];
my @liste = ();
eval { open( FIC, "<", $fichier) || die " ==> $!"; };
if ($@) {
print "\n ERREUR : Impossible de lire le fichier d\'exclude $fichier";
print "\n$@\n";
return;
}
while(<FIC>) {
# -- on passe les commentaires et les lignes vides
next if( ($_ =~ /^\s*$/ ) || ($_ =~ /^\s*#.*$/ ) );
chomp;
push(@liste, $_);
}
return \@liste;
}


sub copie_incrementale_fichier {

my $rep; # -- recuperation des sous-rep a creer
my $dir; # -- repertoire a creer pour la destination
my $fic; # -- fichier a copier pour la destination
my $motif; # -- motif correspondant aux fichiers a exclure de la copie
my $copie = 1; # -- boolen qui auorise la copie par défaut

# -- copie incrementale des fichiers
if ($_ eq ".") {
$racine = "$File::Find::dir";
$decalage = length $racine;
# -- pas de prise en compte du dernier / ou \ pour $File::Find::dir
++$decalage;
} elsif (-d $_) {
$rep = substr $File::Find::dir, $decalage;
$dir = "$DESTINATION/$rep/$_";
if ( not -e $dir) {
eval { mkpath ("$dir") || die " ERREUR : Impossible de creer le
repertoire $dir : $!\n"; };
if ($@) {
print "$@";
++$ERR;
} else {
print"Creation repertoire $dir\tOK\n";
}
}
} else {
$rep = substr $File::Find::dir, $decalage;
$fic = "$DESTINATION/$rep/$_";
foreach $motif (@{$refliste}) {
next if (not $_ =~ m/$motif/i);
$copie = 0;
}
if ( ($copie == 1) && ( (not -e $fic) || (-M $File::Find::name < -M $fic)
) ) {
eval { copy ("$File::Find::name", "$fic") || die " ERREUR : Impossible
de copier le fichier $File::Find::name vers $fic : $!\n";};
if ($@) {
print "$@";
++$ERR;
} else {
print "Copie fichier $File::Find::name vers $fic\tOK\n";
}
}
}
}


sub purge_fichier {

my $rep = substr $File::Find::dir, $decalage; # -- recuperation
my $dir; # -- repertoire de reference
my $fic;

# -- copie incrementale des fichiers
if ($_ eq ".") {
$racine = "$File::Find::dir";
$decalage = length $racine;
# -- pas de prise en compte du dernier / ou \ pour $File::Find::dir
++$decalage;
} elsif (-d $_) {
$dir = "$SOURCE/$rep/$_";
if ( not -e $dir) {
# -- pas d'analyse en profondeur, suppression du repertoire
$File::Find::prune = 1;
eval { rmtree ("$File::Find::name") || die " ERREUR : Impossible de
detruire le rep $File::Find::name : $!\n"; };
if ($@) {
print "$@";
++$ERR;
} else {
print"Suppression repertoire : $File::Find::name\tOK\n";
}
}
} else {
$fic = "$SOURCE/$rep/$_";
if (not -e $fic) {
eval { unlink ("$File::Find::name") || die " ERREUR : Impossible de
supprimer le fichier $File::Find::name : $!\n";};
if ($@) {
print "$@";
++$ERR;
} else {
print "Suppression fichier : $File::Find::name\tOK\n";
}
}
}
}


sub ouverture_log {
local($nom)=@_;
local($rc)=0;
# -- redirection de la sortie
if (open(STDOUT,">$nom")) {
# -- redirection de l'erreur standard vers la sortie standard
open(STDERR,">&STDOUT");
# -- pour ecriture directe sans passer par le tampon
select(STDERR);
$| = 1;
select(STDOUT);
$| = 1;
$rc=0;
}
else {
$rc=1;
}
return($rc);
}


sub affichage_utilisateur {
# -- restitution des handles d'origine pour affichage
# -- dans la fenêtre MSDOS
open STDOUT, ">&SAUVEGARDE_0MN_STDOUT";
open STDERR, ">&SAUVEGARDE_0MN_STDERR";
}


sub trace_log {
# -- ouverture du fichier log applicatif du job
&ouverture_log($FLOG);
}

#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< PROCEDURES APPELEES

---------------------------

sébastien

la pensée du moment :
"Entre l'amour physique et le ridicule il n'y a qu'un pas." Patrick Süskind

2 réponses

Avatar
jl_morel
Dans l'article <bfbrpr$ude$, sebastien.
a dit...

j'utilise le script ci-dessous pour effectuer des sauvegardes de certains
répertoires toutes les heures. a priori il le fait très bien. mon seul
souci réside dans le fichier de log ( $FLOG ). je retrouve bien mes logs
dans le fichier mais à chaque execution le fichier log est réinitalisé
alors que au contraire j'aimerais pourvoir garder un historique des logs.

quelqu'un sait il ce que je dois modifier dans mon perl pour corriger cela ?

par avance merci.


----------script-------------
#!/usr/bin/perl
[couic...]



Remplacez

# -- redirection de la sortie
if (open(STDOUT,">$nom")) {

par

# -- redirection de la sortie
if (open(STDOUT,">> $nom")) {


Voir perlfunc :

http://www.bribes.org/perl/docfr/perlfunc.html#L3A977B7F

HTH

--
J-L.M.

Avatar
sébastien
Jean-Louis MOREL wrote:


Remplacez

# -- redirection de la sortie
if (open(STDOUT,">$nom")) {

par

# -- redirection de la sortie
if (open(STDOUT,">> $nom")) {


Voir perlfunc :

http://www.bribes.org/perl/docfr/perlfunc.html#L3A977B7F

HTH



merci.

sébastien

la pensée du moment :
"L'amour, c'est offrir à quelqu'un qui n'en veut pas quelque chose que l'on
n'a pas." Jacques Lacan