2022-09-22 02:07:29 +00:00
|
|
|
|
|
|
|
import psutil
|
|
|
|
import filelock
|
|
|
|
|
|
|
|
|
|
|
|
def can_spawn_tahoe(pidfile):
|
|
|
|
"""
|
|
|
|
Determine if we can spawn a Tahoe-LAFS for the given pidfile. That
|
|
|
|
pidfile may be deleted if it is stale.
|
|
|
|
|
|
|
|
:param pathlib.Path pidfile: the file to check, that is the Path
|
|
|
|
to "running.process" in a Tahoe-LAFS configuration directory
|
|
|
|
|
|
|
|
:returns bool: True if we can spawn `tahoe run` here
|
|
|
|
"""
|
|
|
|
lockpath = pidfile.parent / (pidfile.name + ".lock")
|
|
|
|
with filelock.FileLock(lockpath):
|
|
|
|
try:
|
|
|
|
with pidfile.open("r") as f:
|
|
|
|
pid, create_time = f.read().strip().split(" ", 1)
|
|
|
|
except FileNotFoundError:
|
|
|
|
return True
|
|
|
|
|
2022-09-25 06:46:30 +00:00
|
|
|
# somewhat interesting: we have a pidfile
|
|
|
|
pid = int(pid)
|
|
|
|
create_time = float(create_time)
|
|
|
|
|
|
|
|
try:
|
|
|
|
proc = psutil.Process(pid)
|
|
|
|
# most interesting case: there _is_ a process running at the
|
|
|
|
# recorded PID -- but did it just happen to get that PID, or
|
|
|
|
# is it the very same one that wrote the file?
|
|
|
|
if create_time == proc.create_time():
|
|
|
|
# _not_ stale! another intance is still running against
|
|
|
|
# this configuration
|
|
|
|
return False
|
|
|
|
|
|
|
|
except psutil.NoSuchProcess:
|
|
|
|
pass
|
2022-09-22 02:07:29 +00:00
|
|
|
|
2022-09-28 15:35:17 +00:00
|
|
|
# the file is stale
|
|
|
|
pidfile.unlink()
|
|
|
|
return True
|
2022-09-22 02:07:29 +00:00
|
|
|
|
|
|
|
|
|
|
|
from pathlib import Path
|
|
|
|
print("can spawn?", can_spawn_tahoe(Path("running.process")))
|