Chtěl jsem udělat to samé jako, ale chtěl jsem to udělat v jednom souboru.
Takže logika by byla:
- pokud je spuštěn skript s mým jménem, ukončete jej a ukončete
- pokud skript s mým jménem neběží, udělejte to
Upravil jsem odpověď od Bakuriu a přišel s tímto:
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...
Spuštění skriptu udělá vše, co skript udělá. Spuštění další instance skriptu ukončí všechny existující instance skriptu.
Používám to k zobrazení malého widgetu kalendáře PyGTK, který se spustí, když kliknu na hodiny. Pokud kliknu a kalendář není spuštěn, zobrazí se kalendář. Pokud kalendář běží a kliknu na hodiny, kalendář zmizí.
Pomocí úžasného psutil
knihovna je docela jednoduchá:
p = psutil.Process(pid)
p.terminate() #or p.kill()
Pokud nechcete instalovat novou knihovnu, můžete použít os
modul:
import os
import signal
os.kill(pid, signal.SIGTERM) #or signal.SIGKILL
Viz také os.kill
dokumentaci.
Pokud máte zájem spustit příkaz python StripCore.py
pokud neběží a jinak jej zabíjíte, můžete použít psutil
abychom to dělali spolehlivě.
Něco jako:
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'])
Ukázkový běh:
$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.
Poznámka :V předchozím psutil
verze cmdline
byl atribut místo metody.