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é ?
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.
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.