web-dev-qa-db-fra.com

Comment terminer le processus de Python en utilisant pid?

J'essaie d'écrire un court script dans python qui en créerait un autre python code dans le sous-processus si ce n'est pas déjà fait, sinon terminez terminal & app (Linux) .

Donc, il ressemble à:

#!/usr/bin/python
from subprocess import Popen

text_file = open(".proc", "rb")
dat = text_file.read()
text_file.close()

def do(dat):

    text_file = open(".proc", "w")
    p = None

    if dat == "x" :

        p = Popen('python StripCore.py', Shell=True)
        text_file.write( str( p.pid ) )

    else :
        text_file.write( "x" )

        p = # Assign process by pid / pid from int( dat )
        p.terminate()

    text_file.close()

do( dat )

Avoir un problème de manque de connaissances pour nommer proces par pid quelle application lit à partir du fichier ". Proc". L'autre problème est que l'interprète dit que la chaîne nommée dat n'est pas égale à "x" ??? Qu'est-ce que j'ai manqué?

36
Alex

Utiliser la bibliothèque géniale psutil c'est assez simple:

p = psutil.Process(pid)
p.terminate()  #or p.kill()

Si vous ne souhaitez pas installer une nouvelle bibliothèque, vous pouvez utiliser le module os:

import os
import signal

os.kill(pid, signal.SIGTERM) #or signal.SIGKILL 

Voir aussi le os.kill documentation .


Si vous souhaitez lancer la commande python StripCore.py S'il ne fonctionne pas et le supprime sinon, vous pouvez utiliser psutil pour le faire de manière fiable.

Quelque chose comme:

import psutil
from subprocess import Popen

for process in psutil.process_iter():
    if process.cmdline() == ['python', 'StripCore.py']:
        print('Process found. Terminating it.')
        process.terminate()
        break
else:
    print('Process not found: starting it.')
    Popen(['python', 'StripCore.py'])

Échantillon échantillon:

$python test_strip.py   #test_strip.py contains the code above
Process not found: starting it.
$python test_strip.py 
Process found. Terminating it.
$python test_strip.py 
Process not found: starting it.
$killall python
$python test_strip.py 
Process not found: starting it.
$python test_strip.py 
Process found. Terminating it.
$python test_strip.py 
Process not found: starting it.

Remarque : Dans les versions précédentes psutil versions cmdline était un attribut au lieu d'un méthode.

90
Bakuriu

Je voulais faire la même chose que, mais je voulais le faire dans un fichier.

La logique serait donc la suivante:

  • si un script portant mon nom est en cours d'exécution, tuez-le, puis quittez
  • si un script avec mon nom ne fonctionne pas, faire des choses

J'ai modifié la réponse de Bakuriu et suis venu avec ceci:

from os import getpid
from sys import argv, exit
import psutil  ## pip install psutil

myname = argv[0]
mypid = getpid()
for process in psutil.process_iter():
    if process.pid != mypid:
        for path in process.cmdline():
            if myname in path:
                print "process found"
                process.terminate()
                exit()

## your program starts here...

Exécuter le script fera tout ce que le script fait. L'exécution d'une autre instance du script supprime toute instance existante du script.

J'utilise cela pour afficher un petit widget de calendrier PyGTK qui s'exécute lorsque je clique sur l'horloge. Si je clique et que le calendrier n'est pas affiché, le calendrier s'affiche. Si le calendrier est en cours d'exécution et que je clique sur l'horloge, le calendrier disparaît.

3
suprjami