Wayset Technologie Logo TECHNOLOGIE

Pour un processus de développement logiciel simplifié
Watchdog version Python
200x
Facebook Twitter Google+
 

Pour le plaisir de la chose, voici un petit script qui sert de watchdog en python. Il ne vous reste qu'à configurer votre cron pour l'exécuter à intervalle régulier... et à y modifier la ligne de commande qu'il vérifie (il peut en vérifier plusieurs). Ça reste simple à mettre en place et peut servir de façon temporaire et vu sa simplicité, rapidement! Ne vous inquiétez pas pour la taille du fichier de log, une vérification est réalisée au démarrage, s'il est supérieur à 50k (vous pouvez modifier la valeur du MAX_LOG_SIZE), il sera renommé en .old et un nouveau fichier sera créé.Si un ancien fichier existe déjà, ce dernier sera perdu.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import sys
import os
import datetime


MAX_LOG_SIZE = 50000

class ProcessWatcher(object):
    def __init__(self, procs):
        self.procs = procs
        self.log_name = self.__class__.__name__ + ".log"
        self.log = self._init_loghandle()

    def _init_loghandle(self):
        f_dir = os.path.dirname(os.path.realpath(__file__))
        f_name = f_dir + "/" + self.log_name

        if os.path.isfile(f_name):
            f_size = os.path.getsize(f_name)

            if f_size > MAX_LOG_SIZE:
                os.rename(f_name, f_dir + "/" + self.log_name + ".old")

        return open(self.log_name, 'a')

    def to_log(self, info):
        print(datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S') +
              " => " + info, file=self.log)

    def run(self):
        if not os.geteuid() == 0:
            sys.exit("\nOnly root can run this script\n")

        start_time = datetime.datetime.now()

        self.to_log("Verifying running process...")
        tmp = os.popen("ps -Aeo pid,pcpu,pmem,args").read().split("\n")

        for t in tmp:
            if len(t) > 2:
                line = t.split()
                apps = line[3]

                for proc in self.procs:
                    if apps == proc['start'] and \
                                    proc['args'] in ' '.join(line[4:]):
                        proc['exists'] = True
                        self.to_log("Process (" + apps + ") is already running... "
                                    "PID : " + line[0] + " CPU : " + line[1] + 
                                    " Mem : " + line[2])

        for proc in self.procs:
            if not proc['exists']:
                n_proc = "nohup %s %s &" % (proc['start'], proc['args'])
                self.to_log("New process started with " + n_proc)
                # os.system(n_proc)

        self.to_log("Script " + os.path.basename(__file__) + " done (" + 
                    str((start_time - datetime.datetime.now()).microseconds / 1000) + 
                    " ms)")

        self.log.close()


if __name__ == '__main__':
    watcher = ProcessWatcher((dict(start='tcpdump', args='-vv src port 41299', exists=False),
                              dict(start='tcpdump', args='-vv src port 44130', exists=False)))
    watcher.run()

Copyright (c) 2014-2017 Wayset Technologie
Loading... Veuillez patienter...