IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Script de nettoyage des processus selon date


Sujet :

Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 108
    Points : 57
    Points
    57
    Par défaut Script de nettoyage des processus selon date
    Bonjour tout le monde,
    je suis novice en python et je souhaite créer un script qui permet le nettoyage d'un répertoire ( répertoire /tmp) des fichiers (et/ou répertoire) correspond à un processus spécifique selon la date.

    Les étapes:

    1- Je dois chercher tous les processus d'un programme en cours d'exécution , par exemple openOffice , appartenant à un User , en déterminant la date/heure de démarrage des plus ancien d'entre eux.

    2- Ensuite supprimer tous les fichiers/répertoires dans le "/tmp" des processus Openoffice les plus ancien ( date déterminé à l'étape 1)

    Je souhaite avoir des idées ou des fonctions à utiliser pour ce script. Si des exemples existent je serais preneur

    Merci

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    1- Je dois chercher tous les processus d'un programme en cours d'exécution , par exemple openOffice , appartenant à un User , en déterminant la date/heure de démarrage des plus ancien d'entre eux.
    Sur quel système d'exploitation?
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 108
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Sur quel système d'exploitation?
    J'ai oublié de le marquer : Linux (Red Hat)

  4. #4
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Il existe le module psutil, un exemple sur stackoverflow.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 108
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Il existe le module psutil, un exemple sur stackoverflow.
    Je te remercie. Il n'existe aucune autre solution ? parce que je ne souhaite pas installer des modules extérieur sachant que mon script doit être transportable et doit fonctionner avec python 2.4 natif (le module psutil n'est pas présent de base dans python).

    Des idées pour le calcul des dates les plus anciennes? pour éviter au passage le problème lié au passage de l'heure après minuit...

    Merci d'avance

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Avez vous regardé la commande/utilitaire tmpwatch?
    Sinon, sous Lunix vous avez la possibilité de récupérer nombre d'informations sur les process "vivants" dans le pseudo file system appelé /proc, voir man.
    Après avoir joué un peu avec via les commandes Bash ls et cat pour définir les informations que vous recherchez, vous pourriez les récupérer sous Python via os.listdir et open.
    Restera à les mettre en forme pour en extraire plus facilement les informations que vous souhaitez.

    Cordialement,
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Comme le dit wiztricks vous avez tout sous la main.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    import os
    import pwd
     
    def pid_list():
        return [int(x) for x in os.listdir('/proc') if x.isdigit()]
     
    def pid_to_name(pid):
        with open("/proc/%s/stat" % pid) as f:
            return f.read().split()[1].replace('(', '').replace(')', '')
     
    def find_owner(pid):
        return pwd.getpwuid(os.stat("/proc/%s" % pid).st_uid).pw_name
     
    def open_files(pid):
        open_files = []
        try:
            files = os.listdir("/proc/%s/fd" % pid)
        except OSError:
            return "Access Error for process %d" % pid
        for fd in files:
            fic = "/proc/%s/fd/%s" % (pid, fd)
            if os.path.islink(fic):
                fic = os.readlink(fic)
            if os.path.isfile(fic) and not fic in open_files:
                open_files.append(fic)
        return open_files
     
    def start_time(pid):
        with open("/proc/%s/stat" % pid) as f:
            return f.read().split()[21]
     
    def test(proc_name, user_name):
        print "test for %s process / user %s" % (proc_name, user_name)
        for pid in pid_list():
            if pid_to_name(pid) == proc_name and find_owner(pid) == user_name:
                print "Process %d (%s):" % (pid, proc_name)
                f_list = open_files(pid)
                if list(f_list) == f_list:
                    print "Fichiers ouverts : %s" % str(f_list)
                else:
                    print "Fichiers ouverts : %s" % f_list
                print "Process demarrer (starttime) : %s" % start_time(pid)
     
    test('geany', 'patrice')
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    test for geany process / user patrice
    Process 1989 (geany):
    Fichiers ouverts : ['/home/patrice/.xsession-errors']
    Process demarrer (starttime) : 81599
    Process 1993 (geany):
    Fichiers ouverts : Access Error for process 1993
    Process demarrer (starttime) : 81807
    Process 2654 (geany):
    Fichiers ouverts : ['/home/patrice/.xsession-errors']
    Process demarrer (starttime) : 315254
    Process 2658 (geany):
    Fichiers ouverts : Access Error for process 2658
    Process demarrer (starttime) : 315409
    Process 2916 (geany):
    Fichiers ouverts : ['/home/patrice/.xsession-errors']
    Process demarrer (starttime) : 592163
    Process 2920 (geany):
    Fichiers ouverts : Access Error for process 2920
    Process demarrer (starttime) : 592269
    starttime (%llu) donne le temps ou le processus a commencer après le boot, donc pas de souci d'heure.

    @+
    Merci d'utiliser le forum pour les questions techniques.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 108
    Points : 57
    Points
    57
    Par défaut
    Merci à wiztricks et surtout à PauseKawa. C'est exactement ce que je cherchais

    Je mettrai le code complet après l'avoir fini.

  9. #9
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    Il reste des détails quand même:

    1) Supprimer des temporaires sans killer le processus c'est sans doute se retrouver avec un zombi ou un plantage.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    def kill_by_pid(pid):
        os.kill(int(pid), signal.SIGTERM)
        try: 
           os.kill(int(pid), 0)
           return True
        except OSError:
           return False
    
    def test(proc_name, user_name):
        print "test for %s process / user %s" % (proc_name, user_name)
        for pid in pid_list():
            if pid_to_name(pid) == proc_name and find_owner(pid) == user_name:
                print "Process %d (%s):" % (pid, proc_name)
                f_list = open_files(pid)
                if list(f_list) == f_list:
                    print "Fichiers ouverts : %s" % str(f_list)
                else:
                    print "Fichiers ouverts : %s" % f_list
                print "Process demarrer (starttime) : %s" % start_time(pid)
                print "Kill the process %s with result %s" % (pid, kill_by_pid(pid))
    
    test('geany', 'patrice')
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    test for geany process / user patrice
    Process 3110 (geany):
    Fichiers ouverts : ['/home/patrice/.xsession-errors']
    Process demarrer (starttime) : 1623935
    Kill the process 3110 with result True
    Process 3114 (geany):
    Fichiers ouverts : Access Error for process 3114
    Process demarrer (starttime) : 1624024
    Kill the process 3114 with result True
    2) Le code présenté ne contient pas de test (ou presque) sur les erreurs possibles (OS/IO).

    3) Il est dit: appartenant à un User.
    Cela implique la notion de droits : Soit le script est lancé en root soit c'est pour l'utilisateur ? A définir : vos besoins.

    4) Ensuite supprimer tous les fichiers/répertoires dans le "/tmp" > Utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            if os.path.isfile(fic) and not fic in open_files and fic.startswith('/tmp/'):
                open_files.append(fic)
    5) Si un processus est actif pourquoi supprimer ses fichiers temporaires ? (voir 1) A définir : vos besoins.

    6) Le code présenté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def open_files(pid):
        open_files = []
        try:
            files = os.listdir("/proc/%s/fd" % pid)
        except OSError:
            return "Access Error for process %d" % pid
        for fd in files:
            fic = "/proc/%s/fd/%s" % (pid, fd)
            if os.path.islink(fic):
                fic = os.readlink(fic)
            if os.path.isfile(fic) and not fic in open_files:
                open_files.append(fic)
        return open_files
    ne tiens pas compte de : des fichiers (et/ou répertoire) correspond à un processus spécifique

    Etc...

    @+

    Ps: Ma grosse question c'est la 5 en fait.
    Merci d'utiliser le forum pour les questions techniques.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 108
    Points : 57
    Points
    57
    Par défaut
    Merci pour ton aide PauseKawa

    Effectivement j'ai mal expliqué mon besoin. Ce script a été demandé car une application X utilise en permanence soffice pour ouvrir des fichiers mais celle ci bug par moment et ne ferme pas soffice proprement ce qui laissait des fichiers temporaires dans /tmp. C'est ces fichiers ( ou dossiers) que je devais nettoyer. Sachant que l'application X utilisent 2 processus soffice différents...

    Les étapes expliqués dans mon premier poste sont exactes, il fallait supprimer tous les fichiers temporaires des anciens processus mal fermés. Aucun processsus ne doit être killé.

    Voici le résultat pour ceux que ça interesse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
    #! /usr/bin/env python
    # -*- coding: utf-8 -*-
     
    import os
    import pwd
    import shutil
    import fnmatch
    import datetime
     
    path = "/tmp"
    process_name= "soffice"
    User_connected = pwd.getpwuid(os.getuid())[0]
     
     
    def pid_list():
        return [int(x) for x in os.listdir('/proc') if x.isdigit()]
     
    def pid_to_name(pid):
        f= open("/proc/%s/stat" % pid,"r")
        try:
            return f.read().split()[1].replace('(', '').replace(')', '')
        finally:
            f.close()
     
    def find_owner(pid):
        return pwd.getpwuid(os.stat("/proc/%s" % pid).st_uid).pw_name
     
     
    def get_start_time(pid):
        """time in jiffies the process started after system boot"""
        f= open("/proc/%s/stat" % pid,"r")
        try:
            return f.read().split()[21]
        finally:
            f.close()
     
    def get_boot_time():
        """Return system boot time ( in seconds)"""
        f = open('/proc/stat', 'r')
        try:
            for line in f:
                if line.startswith('btime'):
                    return float(line.strip().split()[1])
            raise RuntimeError("line not found")
        finally:
            f.close()
     
     
     
    def flush_tmp_dir(proc_name,user_name):
        HZ= os.sysconf(os.sysconf_names['SC_CLK_TCK']) #the frequency (hertz) of the system timer
     
        p_starttimes = []
        for pid in pid_list():
            if pid_to_name(pid) == proc_name and find_owner(pid) == user_name:
     
                p_seconds_since_boot= int(get_start_time(pid))/ HZ # start-time of process since boot time (in seconds)
                p_starttime= get_boot_time()+ p_seconds_since_boot #the absolute start time of process ( time in seconds since the epoch)
                p_starttimes.append(p_starttime)
     
        if len(p_starttimes) == 0:
            print("No process found")
            return 
     
        else:
     
            min_starttime = min(p_starttimes) # select old process  
            #print ("Mini time of process since epoch= %d " % min_starttime)
            proc_time= datetime.datetime.fromtimestamp(min_starttime) # conversion
     
            print ("The oldest process was launched at:  %s" % str(proc_time))
     
            for f in os.listdir(path):
                fullpath = os.path.join(path, f)
                owner = pwd.getpwuid(os.stat(fullpath).st_uid).pw_name
                if owner == User_connected:
                    if (fnmatch.fnmatch(f, 'sv*')):
                            path_modified = os.path.getmtime(fullpath) #Return the time of last access of path in seconds since the epoch
                            tmp_time= datetime.datetime.fromtimestamp(path_modified)
     
                            time_diff= proc_time - tmp_time 
     
                            if (time_diff) > datetime.timedelta(minutes=5):
                                print ("Time difference:  %s" %str(time_diff))
                                if os.path.isfile(fullpath):
                                    print("Temporary soffice files:  [%s] " %fullpath)
                                    """os.remove(fullpath)
                                    print("File  [%s] was removed " %f)"""
     
                                elif os.path.isdir(fullpath):
                                    print("Temporary soffice directories:  [%s] " %fullpath)
                                    """shutil.rmtree(fullpath, False, None)
                                    print("Directory  [%s] was removed " %f) """ 
     
     
    print ("User connected: %s" %User_connected)
    flush_tmp_dir(process_name,User_connected)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Script pour collecte des processus
    Par loubna04 dans le forum VBScript
    Réponses: 2
    Dernier message: 29/03/2010, 14h16
  2. problème report des valeurs selon date
    Par Bricoltou dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 06/12/2009, 13h52
  3. Coloration des cases selon dates
    Par Je-cherche-pfe dans le forum Langage
    Réponses: 5
    Dernier message: 22/10/2008, 09h16
  4. Additionner des heures selon Date et heure
    Par samawati dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 11/04/2008, 19h47
  5. Réponses: 3
    Dernier message: 01/02/2007, 20h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo