Comment terminer le processus de Python en utilisant pid?

J'essaie d'écrire un script court en python qui démarrerait un autre code python dans le sous-processus si ce n'est pas déjà commencé 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 )

Ont problème de manque de connaissances pour nommer les processus par pid dont l'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 égal à "x" ??? Ce que j'ai manqué ?

25
demandé sur Alex 2013-07-25 15:37:00

2 réponses

En utilisant le génial psutil bibliothèque 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 os module:

import os
import signal

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

Voir aussi l'os.kill documentation.


Si vous êtes intéressé à démarrer la commande python StripCore.py si elle n'est pas en cours d'exécution, et à la tuer 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'])

Exemple d'exécution:

$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.

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

64
répondu Bakuriu 2018-04-08 04:00:06

J'ai voulu faire la même chose, mais je voulais le faire dans un fichier.

Donc la logique serait:

  • Si un script avec mon nom est en cours d'exécution, tuez-le, puis quittez
  • Si un script avec mon nom n'est pas en cours d'exécution, faites des choses

J'ai modifié la réponse de Bakuriu et j'ai trouvé 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...

L'exécution du script fera ce que fait le script. L'exécution d'une autre instance du script va tuer toute instance existante du script.

J'utilise ceci 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 activé, le calendrier s'affiche. Si le calendrier est en cours d'exécution et je clique sur l'horloge, le calendrier disparaît.

3
répondu suprjami 2014-10-30 21:49:22