Je voulais faire la même chose que, mais je voulais le faire dans un seul fichier.
Donc la logique serait :
- si un script portant mon nom est en cours d'exécution, tuez-le, puis quittez
- si un script portant mon nom ne s'exécute pas, 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 tout ce que fait le script. L'exécution d'une autre instance du script tuera toute instance existante du script.
Je l'utilise 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 ouvert, le calendrier s'affiche. Si le calendrier est en cours d'exécution et que je clique sur l'horloge, le calendrier disparaît.
Utilisation du 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
modules :
import os
import signal
os.kill(pid, signal.SIGTERM) #or signal.SIGKILL
Voir aussi le os.kill
documents.
Si vous souhaitez lancer la commande python StripCore.py
s'il ne s'exécute pas et le tue 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.
Remarque :Dans psutil
précédent version cmdline
était un attribut au lieu d'une méthode.