File: check_running.py

package info (click to toggle)
tahoe-lafs 1.20.0-6
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 10,996 kB
  • sloc: python: 88,831; makefile: 382; sh: 104; lisp: 89; xml: 37
file content (47 lines) | stat: -rw-r--r-- 1,442 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

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

        # 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

        # the file is stale
        pidfile.unlink()
        return True


from pathlib import Path
print("can spawn?", can_spawn_tahoe(Path("running.process")))