Changeset 8

Show
Ignore:
Timestamp:
11/22/07 01:10:13 (3 years ago)
Author:
twidi
Message:

amelioration du mode demon, et sys_alive utilisable dans /etc/init.d et autres /etc/rc.d

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • sys_alive.pl

    r7 r8  
    2020############################################################### 
    2121# DerniÚre version sur : http://scripts.twidi.com/            # 
     22# Informations : http://b.twidi.com/index.php/tag/sys_alive   # 
    2223############################################################### 
    2324# Contributeurs :                                             # 
     
    2728############################################################### 
    2829# Historique :                                                # 
     30# v 1.5.1: 2007-11-21 : mode "demon" utilisable en tant que   # 
     31#                       script de démarrage (/etc/init.d)     # 
    2932# v 1.5  : 2007-11-19 : mode "demon", tentatives supll.       # 
    3033#                       d'arrets de demons                    # 
     
    7073# 2) adapter la configuration dans le fichier sys_alive.conf  # 
    7174# 3) mettre la configuration en chmod 600                     # 
    72 # 4) mettre le script en cron (en root) toutes les minutes :  # 
     75# 4) mettre le script en cron(4.1) ou le lancer en demon(4.2) # 
     76# 4.1) mettre le script en cron (en root) toutes les minutes: # 
     77#    Mettre en conf mode_demon.actif à 0                      # 
    7378#    Lancer, en root : crontab -e                             # 
    74 #    Et ajouter : * * * * * /chemin_de_sys_alive/sys_alive.pl # 
     79#    Et ajouter : * * * * * /chemin/de/sys_alive/sys_alive.pl # 
     80# 4.2) lancer le script en demon                              # 
     81#    Mettre en conf mode_demon.actif à 1                      # 
     82#    Le lancer : /chemin/de/sys_alive/sys_alive.pl start      # 
     83#    Le lier par exemple vers /etc/init.d/sys_alive et mettre # 
     84#    à jour les scripts de démarrage pour un lancement        # 
     85#    automatique (en fonction de votre distribution)          # 
    7586############################################################### 
    7687 
     
    8091use File::Pid; 
    8192 
    82 Proc::Daemon::Init; 
    83  
    8493#------------------------------------------------------------------------------# 
    8594# répertoire des données : remplacer *éventuellement* GetLocalRep() par 
    8695# le répertoires où est stocké le fichier de configuration, uniquement s'il ne 
    87 # doit pas être stocké dans le même répertoire que ce programme 
     96# doit pas être stocké dans le même répertoire que ce programme ou si sys_alive 
     97# est configuré pour tourner en mode démon 
    8898 
    8999my $rep_conf = GetLocalRep(); 
     
    94104#------------------------------------------------------------------------------# 
    95105# fichier de configuration 
     106die 'Fichier conf non trouvé' if ! -e $rep_conf.'/sys_alive.conf'; 
    96107require($rep_conf.'/sys_alive.conf'); 
    97108 
     
    101112 
    102113# variables globales 
    103 my $version = '1.5'; 
     114my $version = '1.5.1'; 
    104115my $arg = lc(shift(@ARGV)); 
    105116if (!$main::logfile) { $main::logfile = $main::rep_log.'/sys_alive.log'; } 
     
    113124); 
    114125 
     126my $demon_running = demon_running(); 
     127my $mode_demon_actif = $main::mode_demon{'actif'} || $demon_running; 
     128 
    115129my $term = $ENV{'TERM'} ? '' : 'TERM=vt100; export TERM;'; # on simule un terminal si la variable d'environnement n'est pas définie 
    116130 
     
    118132if ($arg eq 'stop') { 
    119133        SetInfo('stopped', 1); 
    120         WriteLog('Arrêt de sys_alive'); 
     134        if ($mode_demon_actif) { 
     135                $pid{'obj'} = File::Pid->new({ 
     136                        file => $pid{'file'}, 
     137                        pid  => $demon_running, 
     138                }); 
     139                $pid{'value'} = $demon_running; 
     140        } else { 
     141                WriteLog('Désactivation de sys_alive'); 
     142        } 
    121143} elsif ($arg eq 'start') { 
    122144        SetInfo('stopped', 0); 
    123         WriteLog('Redémarrage de sys_alive'); 
    124 
    125  
    126 if ($main::mode_demon{'actif'}) { 
     145        WriteLog('Réactivation de sys_alive') if !$mode_demon_actif; 
     146} elsif ($mode_demon_actif) { 
     147        WriteLog('Usage en mode demon : /chemin/de/sys_alive/sys_alive.pl start|stop', 1); 
     148
     149 
     150exit if $infos{'stopped'}; 
     151 
     152if ($mode_demon_actif) { 
    127153        mode_demon(); 
    128154} else { 
     
    132158# mode demon 
    133159sub mode_demon { 
    134  
     160        WriteLog('Erreur : Sys_alive est déjà lancé en mode démon (pid='.$demon_running.')', 1) if $main::mode_demon{'actif'} and $demon_running; 
     161 
     162        Proc::Daemon::Init; 
    135163        $pid{'obj'} = File::Pid->new({ 
    136164                file => $pid{'file'}, 
     
    138166        }); 
    139167 
    140         if (-e $pid{'file'}) { 
    141                 my $current_pid; 
    142                 eval { $current_pid = $pid{'obj'}->running(); }; 
    143                 WriteLog('Erreur : ProblÚme en accédant au fichier pid : '.$@, 1) if $@; 
    144                 WriteLog('Erreur : Sys_alive est déjà lancé en mode démon (pid='.$current_pid.')', 1) if $current_pid; 
    145         } 
    146  
    147168        if ($pid{'value'} = $pid{'obj'}->write()) { 
    148169                WriteLog('Sys_alive lancé en mode démon (pid='.$pid{'value'}.')'); 
     
    152173 
    153174        while(1) { 
     175                %infos = LireFichier(); 
     176                last if $infos{'stopped'}; 
    154177                sys_alive(); 
    155178                sleep($main::mode_demon{'wait'} || 60); 
     
    170193        my %process; 
    171194 
    172         %infos = LireFichier(); 
    173195        # on ne vas gérer le tout que si sys_alive n'est pas stoppé 
    174196        if (!$infos{'stopped'}) { 
     
    465487-- 
    466488Mail envoyé par sys_alive.pl, programme de surveillance serveur v$version 
    467 -> http://scripts.twidi.com/script.cgi?script=./sys_alive.pl <- 
     489http://scripts.twidi.com/ ou http://b.twidi.com/index.php/tag/sys_alive 
    468490ENDFINMAIL 
    469491 
     
    617639sub WriteLog { 
    618640        my ($texte, $die) = @_; 
     641        print $texte."\n" if $die; 
    619642        LockFichier($main::logfile, 1); 
    620643        my %d = GetTime(); 
     
    624647        close(LOG); 
    625648        LockFichier($main::logfile, 0); 
    626         die if $die; 
     649        exit 1 if $die; 
    627650        return 1; 
    628651} 
     
    737760# ================================================================= 
    738761 
     762# test si un demon sys_alive tourne deja 
     763sub demon_running { 
     764        $pid{'obj'} = File::Pid->new({ 
     765                file => $pid{'file'}, 
     766                pid  => $$, 
     767        }); 
     768 
     769        my $current_pid; 
     770        if (-e $pid{'file'}) { 
     771                eval { $current_pid = $pid{'obj'}->running(); }; 
     772                WriteLog('Erreur : ProblÚme en accédant au fichier pid : '.$@, 1) if $main::mode_demon{'actif'} and $@; 
     773        } 
     774 
     775        return $current_pid; 
     776} # fin de demon_running 
     777 
    739778# END : appelé à la fin du script : supprime le fichier pid si besoin 
    740779sub END { 
    741         if ($main::mode_demon{'actif'} and $pid{'obj'} and $pid{'value'}) { 
     780        if ($mode_demon_actif and $pid{'obj'} and $pid{'value'}) { 
    742781                $pid{'obj'}->remove(); 
     782                Execute('kill -15 '.$pid{'value'}) if $pid{'value'} != $$; 
    743783                WriteLog('Sys_alive stoppé en mode démon (pid='.$pid{'value'}.')'); 
    744784        }