Volevo fare la stessa cosa di, ma volevo farlo in un unico file.
Quindi la logica sarebbe:
- se è in esecuzione uno script con il mio nome, terminalo, quindi esci
- se uno script con il mio nome non è in esecuzione, fai qualcosa
Ho modificato la risposta di Bakuriu e ho ottenuto questo:
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'esecuzione dello script farà qualunque cosa faccia lo script. L'esecuzione di un'altra istanza dello script interromperà qualsiasi istanza esistente dello script.
Lo uso per visualizzare un piccolo widget del calendario PyGTK che viene eseguito quando faccio clic sull'orologio. Se faccio clic e il calendario non è attivo, viene visualizzato il calendario. Se il calendario è in esecuzione e faccio clic sull'orologio, il calendario scompare.
Usando il fantastico psutil
library è piuttosto semplice:
p = psutil.Process(pid)
p.terminate() #or p.kill()
Se non vuoi installare una nuova libreria, puoi usare os
modulo:
import os
import signal
os.kill(pid, signal.SIGTERM) #or signal.SIGKILL
Vedi anche il os.kill
documentazione.
Se sei interessato ad avviare il comando python StripCore.py
se non è in esecuzione e altrimenti lo uccide, puoi usare psutil
per farlo in modo affidabile.
Qualcosa come:
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'])
Esempio di esecuzione:
$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.
Nota :Nel precedente psutil
versioni cmdline
era un attributo invece di un metodo.