Annonce

Réduire
Aucune annonce.

Programme de gestion de processus

Réduire
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • Programme de gestion de processus

    Bonjour,

    Programme en ligne de commande permettant de gérer des processus.

    Pour l'instant il ne fait que
    1. chercher des processus tournant actuellement sur votre OS
    2. retourner la liste de tous les processus tournant actuellement sur votre OS
    3. tuer un processus par
      • PID
      • nom du processus
    4. tuer plusieurs processus par
      • PIDs
      • noms de processus


    exemple:

    Tuer plusieurs processus:

    python3 hackTest.py -kap 4884 11755

    Tuera les PID 4884 et 11755

    Lister tous les processus:

    python3 hackTest.py -l

    Listera tous les processus en donnant le PID et le nom du processus lié sous la forme PID -> nom du processus

    Tuer un processus par nom:

    python3 hackTest.py -kn bash

    Tuera le processus dont le nom est bash

    etc...

    Toutes les options possibles:

    -sn -> searchNameProcess name
    -ka -> killAllProcesses names
    -kn -> killNameProcess name
    -kp -> killPID pid
    -kap -> killAllProcesses pids

    QUELLE VERSION PYTHON ?

    Python 3.4

    QUELLE LIBRAIRIE À TÉLÉCHARGER ?

    Une seule, psutil

    Pour Windows -> https://pypi.python.org/packages/3.4...efbef280a2b2b1
    Pour Unix versions linux et mac (pas testé) ->

    LE CODE

    Code:
    import psutil
    import sys
    
    OPTIONS = {
                '-kn': 'killNameProcess name',
                '-kp': 'killPID pid',
                '-ka': 'killAllProcesses names',
                '-sn': 'searchNameProcess name',
                '-kap': 'killAllProcesses pids'
              }
    
    class KillProcessError(Exception):
        pass
    
    class Process:
        def __init__(self, pid):
            self.pid = pid
            
            self.p = psutil.Process(pid)
            self.name = self.p.name()
            self.user = self.p.username()
            self.status = self.p.status()
        
        def killProcess(self):
            """kill the process"""
            try:
                self.p.kill()
            except:
                raise KillProcessError("Bad user: use {}".format(self.user))
                    
        def __str__(self):
            """information PID and name of process"""
            return "{pid} -> {name}".format(pid=self.pid, name=self.name)
    
    class Processes:
        def __init__(self):
            self.list = [Process(pid) for pid in psutil.get_pid_list()]
    
        def killPID(self, pid):
            """search and kill PID"""
            for p in self.list:
                if p.pid == pid:
                    p.killProcess()
                    print("Process {} killed !".format(p.name))
                    break
        
        def killNameProcess(self, name):
            """search and kill all process with name"""
            if self.list:
                for p in self.list:
                    if p.name == name:
                        p.killProcess()
                        print("Process {} killed !".format(p.name))
            
        def searchNameProcess(self, name):
            """search processes with pattern name"""
            self.search = []
            for p in self.list:
                if p.name.lower().find(name) != -1:
                    yield str(p)
            
        def __str__(self):
            """list all processes"""
            return '\n'.join([str(p) for p in self.list])
                
    
    def parseLineCommand():
        command = sys.argv
        option, process = None, tuple()
        if len(command) == 2:
            option = command[1]
        elif len(command) > 2:
            option, *process = command[1:]
        return option, process
    
    def main():
        opt, proc = parseLineCommand()
        listOfProcess = Processes()
        if opt == '-l':
            print(listOfProcess)
        elif opt == '-kp' and proc:
            pid = int(proc[0])
            listOfProcess.killPID(pid)
        elif opt == '-kn' and proc:
            name = ' '.join(proc)
            listOfProcess.killNameProcess(name)
        elif opt == '-ka' and proc:
            for name in proc:
                listOfProcess.killNameProcess(name)
        elif opt == '-sn' and proc:
            name = proc[0]
            res = listOfProcess.searchNameProcess(name)
            print('\n'.join(res))
        elif opt == '-kap' and proc:
            for pid in proc:
                p = int(pid)
                listOfProcess.killPID(p)
        else:
            print("USE OPTIONS: ")
            for opt in OPTIONS:
                print("{0} -> {1}".format(opt, OPTIONS[opt]))
    main()
    Si il y a des bugs, n'hésitez pas !

    Bien sûr si vous voyez des améliorations dans la gestion de processus, dites-le, je modifierais et updaterais
    Dernière modification par fred, 07 août 2014, 21h28.

  • #2
    bug OS X :

    http://hackademics.fr/showthread.php...4487#post24487

    OS X:

    Code:
    sh-3.2# python kill.py -l
      File "kill.py", line 72
        option, *process = command[1:]
                ^
    SyntaxError: invalid syntax
    Code:
    sh-3.2# python kill.py -l
    Traceback (most recent call last):
      File "kill.py", line 1, in <module>
        import psutil
    ImportError: No module named psutil
    j'ai fait :

    Code:
    curl -O https://raw.githubusercontent.com/pypa/pip/master/contrib/get-pip.py
    (install succeeded)

    et via macports :

    Code:
    port
    Code:
    search psutil
    Code:
    install py32-psutil
    (install succeeded)

    Code:
    sh-3.2# python kill.py -l
    Traceback (most recent call last):
      File "kill.py", line 1, in <module>
        import psutil
    ImportError: No module named psutil
    sigpic

    Cyprium Download Link

    Plus j'étudie plus j'me rends compte que je n'sais rien.

    †|

    Commentaire


    • #3
      Ok, ah OSX

      Une fois que tu as téléchargé pip avec curl, pourquoi ne pas l'avoir utilisé ?

      Code:
      pip3 install psutil
      Apparemment tu as réussi avec macports, ce qui est bizarre c'est qu'il ne voit pas psutil, du coup je me demande si tu ne devrais pas mettre plutôt

      Code:
      python3 kill.py -l
      Il manquerait le 3 après python...

      Commentaire


      • #4
        en fait j'avais pas sauvegardé après avoir enlevé l'astérisque

        donc ça marche sans l' "*" à la ligne 72

        je ferai + de tests tout à l'heure
        sigpic

        Cyprium Download Link

        Plus j'étudie plus j'me rends compte que je n'sais rien.

        †|

        Commentaire


        • #5
          En y réfléchissant oui ça doit fonctionner aussi sans l'étoile, mais c'est surprenant que chez toi ça ne fonctionne pas avec.

          Bref l'essentiel est que ça fonctionne maintenant, tu pourras faire plein de tests

          Commentaire


          • #6
            -sn: python kill.py -sn safari

            err: ne trouve pas le navigateur
            sol: rendre la recherche des 'name' insensible à la casse

            (vérifié: si je rentre 'python kill.py -sn Safari' ça le trouve)

            cependant, si je rentre :

            -sn: python kill.py -sn chrome

            ça ne trouve pas chrome, et si je rentre :

            -sn: python kill.py -sn Chrome

            ça ne le trouve pas non plus.

            il faut que je rentre :

            -sn: python kill.py -sn Google

            pour le trouver...

            Par ailleurs on ne peut rentrer qu'un seul mot :

            err:

            Code:
            sh-3.2# python kill.py -sn Google Chrome
            Traceback (most recent call last):
              File "kill.py", line 101, in <module>
                main()
              File "kill.py", line 76, in main
                opt, proc = parseLineCommand()
              File "kill.py", line 72, in parseLineCommand
                option, process = command[1:]
            ValueError: too many values to unpack
            ce qui est fâcheux quand on a plusieurs processus ayant un mot commun mais que l'on en recherche un précis.

            Idem, cela rend impossible la suppression par nom :

            sh-3.2# python kill.py -kn Google Chrome

            (donne la même erreur)

            Bon, voilà, ça c'était pour les mini retours.

            Maintenant, la chose qui fâche ^^

            sh-3.2# python kill.py -sn Google
            677 -> Google Chrome Helper
            663 -> Google Chrome Helper
            660 -> Google Chrome

            sh-3.2# python kill.py -kp 660

            Chrome ne s'arrête pas ^^

            Si j'en prend un autre :

            python kill.py -kp 1805

            Là ça fonctionne !

            Code:
            Process launchd killed !
            Donc, y'a comme un petit hic car si je passe par l'habituelle commande kill pour faire cesser Chrome :

            Code:
            sh-3.2# kill 660
            ça fonctionne
            sigpic

            Cyprium Download Link

            Plus j'étudie plus j'me rends compte que je n'sais rien.

            †|

            Commentaire


            • #7
              Alors pour l'option -sn, oui il ne cherche qu'un seul processus dont on sait qu'il commence par quelque-chose, exemple

              Code:
              python kill.py -sn go
              Mettras tous les processus commençant par go, donc normal que ta recherche avec chrome ne fonctionne pas, tu aurais dû mettre google dans ton cas, mais si tu préfères une recherche par pattern, allons-y, modifié !

              Pour moi, une seule recherche me paraît normale, par contre avec l'option -l on voit tous les processus et on peut kill de multi PIDs avec -kap.

              Après pour kill un processus, le PID doit être exact comme le nom du processus, ça doit être le même principe, donc sensible à la casse, par contre je n'ai pas de processus avec des espaces, j'ai pas du tout pensé à ça ! J'ai édité le code en conséquence... Pareil sous Linux, les processus sont tous en minuscules, donc pour la recherche je n'y ai pas pensé non plus, c'est modifié aussi.

              Ce qui me gêne c'est la non fermeture de Chrome par l'appel de kill.py -kp 660, peux-tu essayer en administrateur ?

              Car si ton nom de user pour utiliser kill.py n'est pas le même que celui qui a démarrer le processus à tuer, ça fonctionnera pas, c'est fait pour. Si tu es administrateur, normalement ça doit fonctionner pour tuer ce que tu veux.

              Au final, j'ai modifié pour
              • La recherche (Casse et espace + recherche par pattern)

              Commentaire


              • #8
                Programme de gestion de processus

                Comme indiqué ci-dessus j'étais bien root :

                sh-3.2# python kill.py -kp 660

                Donc oui c'est un petit peu problématique :s
                sigpic

                Cyprium Download Link

                Plus j'étudie plus j'me rends compte que je n'sais rien.

                †|

                Commentaire


                • #9
                  et en le tuant par son nom en admin ça donne quoi maintenant que j'ai changé le code ?

                  Commentaire


                  • #10
                    idem.

                    Code:
                    sh-3.2# python k.py -kp 6586
                    (renvoie rien comme s'il avait bel et bien kill le pid mais que nenni)
                    Code:
                    sh-3.2# python k.py -kn Google Chrome
                    err:
                    Code:
                    Traceback (most recent call last):
                      File "k.py", line 102, in <module>
                        main()
                      File "k.py", line 77, in main
                        opt, proc = parseLineCommand()
                      File "k.py", line 73, in parseLineCommand
                        option, process = command[1:]
                    ValueError: too many values to unpack
                    sigpic

                    Cyprium Download Link

                    Plus j'étudie plus j'me rends compte que je n'sais rien.

                    †|

                    Commentaire


                    • #11
                      Eh bien oui il te manque l'* avant process (nouvelle syntaxe avec la version 3.3 ou 3.4) et je pense que c'est dû à ta version python qui n'est pas la 3.4 comme je l'ai précisé dans mon 1er post.

                      Deux solutions, soit tu mets l'* et la version python 3.4, soit tu remplaces

                      Code:
                      option, *process = command[1:]
                      par

                      Code:
                      option, process = command[1], command[2:]
                      Pas testé, donc on verra si ça fonctionne.

                      Pour le kill c'est assez surprenant, je peux faire ce que je veux, en administrateur je tue tout !

                      Il faudrait voir avec d'autres Mac OSX, si vous rencontrez tous ce problème.

                      Pour le paramètre -sn c'est ok ?

                      Commentaire


                      • #12
                        It works!
                        sigpic

                        Cyprium Download Link

                        Plus j'étudie plus j'me rends compte que je n'sais rien.

                        †|

                        Commentaire


                        • #13
                          Tout ? Toujours le problème de kill ?

                          Commentaire


                          • #14
                            Tout !

                            Tout fonctionne
                            sigpic

                            Cyprium Download Link

                            Plus j'étudie plus j'me rends compte que je n'sais rien.

                            †|

                            Commentaire

                            Chargement...
                            X