Aller au contenu principal

Ordonnanceurs < Les incontournables < Autosys < Exploitation

Script de purge respectant la fréquence de soumission

Ce script Perl s’appuie sur la norme de nommage pour supprimer les fichiers en fonction de leur fréquence de soumission (quotidienne, hebdomadaire, mensuelle, annuelle...).

E. Angenault

8 mars 2009

 POPULARITE : 582 visites

Autosys supprime les logs de l’agent par deux moyens :
- l’activation de la purge automatique en cas de succès du traitement mais les journaux d’agent des jobs en erreur restent à la charge de celui qui fait le diagnostic.
- le clean_files qui permet d’effacer les journaux mais était limité à 200 machines (cette limitation a du être corrigée avec les nouvelles versions).

Par contre, Autosys ne prend pas en charge la purge des journaux applicatifs, un simple script de purge peut être soumis par un job pour effacer les fichiers trop anciens. Le script proposé va un peu plus loin en s’appuyant sur la norme de nommage des traitements du site afin de supprimer les fichiers en fonction de leur période de soumission.

Les fichiers logs de l’agent sont déduits du nom du traitement et donc supprimés dans le même temps.

Arguments

Args Description Defaut
p Répertoire dans lequel se trouve les fichiers à purge
d Nombre de jours pour les traitements quotidiens 7
w Nombre de jours pour les traitements hebdomadaires 30
m Nombre de jours pour les traitements mensuels 40
y Nombre de jours pour les traitements annuels 400
c Nombre de jours pour les traitements cycliques 3

Exemples

La norme est à indiquer dans le script dans la partie déclaration des variables, il s’agit d’une expression régulière permettant d’identifier les logs applicatifs.

Par défaut, la variable standard contient : ^.3([YMWDC])\-.6

cela signifie qu’on se base sur un fichier commencant par 3 caractères, puis la fréquence suivie d’un tiret et de 6 caractères quelconques. On a indiqué la liste [YMWDC] entre parenthèses afin de conserver la valeur pour récupérer la fréquence.


purge.pl (PERL)

Script Perl de purge se basant sur la norme de nommage des traitements pour déduire la fréquence.

#!/bin/perl
# Script de purge de fichiers
# Version 2.0  
# Historique:
# 2008/10 (A. Klein) : Ajout de la duree de retention en fonction de la frequance
# 2002/06 (E. Angenault)  : Suppression des fichiers a n jours

use Getopt::Std;
getopts( 'p:y:m:d:c:w:h') or usage();

usage() if $opt_h;

#Declaration des variables
my $standard = '^.{3}([YMWDC])\-.{6}';
my $year_to_keep;
my $month_to_keep;
my $day_to_keep;
my $cycl_to_keep;
my $week_to_keep;
my ($rep, $file, $f);
my ($periode, $indice);
my $defaut_periode = 14;
my @Delete;

$keep_year = $opt_y || 400; #400
$month_to_keep = $opt_m || 40; #40
$day_to_keep = $opt_d || 7; #7
$week_to_keep = $opt_w || 30; #30 
$cycl_to_keep = $opt_c || 3; #3
$rep = $opt_p || die "Repertoire de purge non defini";

# Affichage des parametres 
print "Parameters :\n";
print "\tDay :\t$day_to_keep\n";
print "\tWeek :\t$week_to_keep\n";
print "\tMonth :\t$month_to_keep\n";
print "\tYear :\t$keep_year\n\n";

#verification de la validite des parametres rentres
check_arg($keep_year);
check_arg($month_to_keep); 
check_arg($day_to_keep);
check_arg($week_to_keep);
check_arg($cycl_to_keep);

#Repertoire existe?

if (! -d $rep )
{
 print " le repertoire $rep n\'existe pas!\n";
 exit 1;
}

#Lecture du repertoire source
opendir(DIR, $rep) || die "$rep n\'existe pas";
my @Dir = readdir (DIR);
foreach $f (sort @Dir)
{
 $file="$rep/$f";
 #On ne traite que les fichiers
 if ( -f $file)
 {
  # On recupere toutes les informations de chaque fichier
  ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
  $atime,$mtime,$ctime,$blksize,$blocks) = stat($file);
 
  #On s'occupe des auto_rem en fonction des logs. On ne les purge pas directement
  next if ($f =~ /auto_rem/);

  #Analyse du nom du fichier pour traitement de la duree de retention
  #La lettre a analyser est la 4eme lettre du nom xxx[Y|M|W|D|C]-xxxxxx..
  #Apres analyse on set la duree de retention en fonction des paremetres
  #passes au script
   
  if ( $f =~ /${standard}/)
  {
   $indice=$1;
   $periode = $year_to_keep if ( $indice eq "Y");
   $periode = $month_to_keep if ( $indice eq "M");
   $periode = $week_to_keep if ( $indice eq "W");
   $periode = $day_to_keep if ( $indice eq "D");
   $periode = $cycl_to_keep if ( $indice eq "C");
  }
  else
  {
   #Cas des fichiers standards ou fichier avec une periodicite "inconnue" et non "auto_rem"
   $periode = $defaut_periode;
  }

  #On selectionne ceux de plus de $periode jours
  $age = int(time/86400) - int($mtime/86400);
  $Size[$age]+=$size;
  $Count[$age]++;
  $older=$age if ($age>$older);

  if ($age>=$periode)
  {
   #Le fichier est a supprime
   #On verifie qu'un eventuel fichier auto_rem associe n'existe pas
   #L'auto_rem associe possede la meme sequence de fin que le fichier log
   
   $f =~ /\-(\d*)\-(\d*)$/ ;
   push @autorem , (grep /^auto_rem.*$1\.$2$/, @Dir);
  
   ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($mtime);
   printf ("%4d/%02d/%02d %2d:%02d\t$f\n",$year+1900,$mon+1,$mday,$hour,$min,$f);
   push(@Delete,$file);                
  }
 }
}

#Suppression des doublons de la liste des auto_rem
my %dejavu;
map {$dejavu{$_}++} @autorem;
@unique_autorem = sort keys %dejavu;
@unique_autorem = map ( $rep."/$_", @unique_autorem);


#Integration des auto_rem dans le report
foreach $r (@unique_autorem)
{
  ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
  $atime,$mtime,$ctime,$blksize,$blocks) = stat("$r");

  $age = int(time/86400) - int($mtime/86400);
  $Size[$age]+=$size;
  $Count[$age]++;
  $older=$age if ($age>$older)
}


#Suppression des deux listes de fichiers
unlink @Delete;
unlink @unique_autorem;

printf("==== ============= =====\n");
print  "Days   Size (Ko)   Count\n";
printf("==== ============= =====\n");
for ($i=0;$i<$older;$i++)
{
 if ($Count[$i]>0)
 {
  $delete += $Size[$i];
  $nbdel  += $Count[$i];
  printf("%4s %13.2f %5d\n",$i,$Size[$i]/1024,$Count[$i]);
 }
}
printf("---- ------------- -----\n");
printf("Del  %13.2f %5d\n",$delete/1024,$nbdel);
printf("==== ============= =====\n");

exit ;

sub usage
{
 print "$0 -p PATH [-y] [-m] [-d] [-c]\n";
 print "definition en jour en fonction de la periodicite de la retention\n";
 print "\ty: annees, defaut=300\n";
 print "\tm: mois, defaut=40\n";
 print "\td: jours, defaut=7\n";
 print "\tw: semaine, defaut=30\n";
 print "\tc: traitements cycliques, defaut=3\n";
 exit 0;
}

sub check_arg
{
 my ($var)= @_ ;
 if (!( $var =~ /\d*/ and $var > 0 ))
 {
  print " parametre incorrect: $var ! \n Verifiez les arguments passes en parametre\n";
  exit 1;
 }
}

Télécharger PERL (4534 octets)

Doc
Scripts

Ces scripts sont destinés aux utilisateurs d’ordonnanceurs, qu’ils soient simple utilisateurs ou administrateurs.

Voir aussi...
A la une, autotrad, Cas pratique, Communiqué de Presse, Documentation, Eyrolles, FAQ, Fiche technique, Forum utilisateur, graphique, news, Procédure d’installation

Le document issu de http://Ordonnancement.org est mis à disposition sous les termes de la licence Creative Commons, vous pouvez l'utilisez dans vos documents à condition de citer l'auteur E. Angenault, vous êtes aussi libre de le modifier. Par contre, vous devez le redistribuer dans les mêmes conditions et la commercialisation ne peut se faire qu'avec l'accord de l'auteur.