Perl - exemples

De UnixManiax
Aller à : navigation, rechercher


Affiche une table de multiplication (passage de paramètre, regexp)

#!/usr/bin/perl
# Affiche une table de multiplication.
use strict;
use warnings;

my $nb; # Le nombre dont on veut afficher la table.

# Teste si on a passe le nombre en parametre, sinon le demande.
if ($ARGV[0]) {
    $nb = $ARGV[0];
}
else {
    print "Quelle table de multiplication voulez-vous afficher ? ";
    $nb = <>;
}

# On supprime le saut de ligne pour l'affichage
chomp $nb;
# On vérifie que $nb est bien une valeur numérique (on autorise les nb negatifs et a virgule).
if (!($nb =~ /^(\-)?\d+(\.\d*)?+$/)) { die 'Erreur : "' . $nb . '"' . " n'est pas un nombre.\n"; }

# On affiche la table
for(my $i = 1; $i <= 10; $i++) {
    print "$nb x $i = " . $nb * $i . "\n";
}

Recherche et compresse un fichier

#!/usr/bin/perl
#
# 2013-03-19 : author@domain
#              This script search for last month Oracle backup log.
#              If this file exist, the script compress it. If not, do nothing.


## Variables
my $log_path = "/apps/oracle/backup/log/";
my $hostname = `hostname`; chomp($hostname);


## Determines last month number (two digits)
($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(time);
$month     += 1;
$year      += 1900;
$p_year     = $year;
$prev_month = $month -1;                        if ($prev_month == 0) { $prev_month = 12; $p_year = $year -1; };
$prev_month = sprintf("%02d",$prev_month);


## Test if log file exist and compress it
my $log_file = $log_path.$hostname."_".$prev_month.".lst";
if (! -e $log_file ) {
    print "ERROR: log file '$log_file' not found.\n";
    print "Aborting.\n";
    exit 2; }
else {
    print "Log file '$log_file' found.\nCompressing.\n";
    `gzip $log_file`;                           if ( $? != 0 ) { print "ERROR: unable to gzip $log_file.\nAborting.\n"; exit 2; }
    `mv $log_file".gz" $log_file.$p_year".gz"`; if ( $? != 0 ) { print "Warning: unable to rename $log_file."; }
    print "Done.\n";
};

Solaris - consommation mémoire et cpu d'une liste de process

Le script suivi prend une liste de process (variable @list) et renvoie pour chacun le nombre de processus trouvés, ainsi que la somme des consommations mémoire et cpu. Le tout est retourné au format nagios. D'ailleurs, le template pnp4nagios correspondant est visible dans ce wiki.

#!/usr/bin/perl
#
# Script de surveillance pour nagios
# Affiche la consommation memoire et cpu des process sas, ainsi que
# leur nombre.
#


###################### Variables #################################
my $mem = "";
my $cpu = "";
my %mem_total;
my %cpu_total;
my %nb_proc;
my $status = 0;
my @list = ("sasexe", "sasauth", "elssrv");
my $text = "Status Ok";
my $perf_data = "";


##################################################################
# Programme principal                                            #
##################################################################


my @ps = `ps -edf`;

foreach my $re_proc(@list) {
    my @process = grep(/$re_proc/, @ps);
    $nb_proc{$re_proc} = scalar(@process);
    $mem_total{$re_proc} = 0;
    $cpu_total{$re_proc} = 0;
    foreach my $ps_line(@process) {
        # On supprime les espaces en debut et en fin
        $ps_line =~ s/(^\s+|\s+$)//;
        # Recuperation des infos sur les process
        my($user, $pid, $ppid) = split(/\s+/, $ps_line);
        # Lancement d'un prstat
        my $cmd = "prstat -p $pid 1 1";
        my @prstat = `$cmd`;
        # Recuperation de la ligne qui nous interesse et decoupage
        my @info = split(/\s+/, $prstat[1]);
        my($mem, $cpu) = ($info[3], $info[9]);
        # Realignement de la memoire en octet
        my $unit_count = 1024;
        foreach my $unit("K", "M", "G", "T") {
            if($mem =~ /(\d+)$unit$/) {
            $mem = $1 * $unit_count
            }
            $unit_count *= 1024;
        }
        $mem_total{$re_proc} += $mem;
        $cpu_total{$re_proc} += $cpu;
    }
}

foreach my $re_proc(@list) {
    $perf_data = $perf_data."cpu_$re_proc=".$cpu_total{$re_proc}." mem_$re_proc=".$mem_total{$re_proc}."  nb_proc_$re_proc=".$nb_proc{$re_proc}." ";
}


print $text."|".$perf_data."\n";
exit $status

Exemple de résultat :

Status Ok|cpu_sasexe=11 mem_sasexe=5545918464 nb_proc_sasexe=40 cpu_sasauth=0 mem_sasauth=13516800 nb_proc_sasauth=3 cpu_elssrv=0 mem_elssrv=107380736 nb_proc_elssrv=37