commit 5414f5227973587daf67440501cfc71e454f1d65 Author: Leonid Evdokimov leon@darkk.net.ru Date: Wed Oct 12 18:18:20 2016 +0300
Avoid twisted complains about missing pidfile during shutdown
Twisted wants to clean it's pidfiles itself, so `ooniprobe-agent` should remove the pidfile if and only if it's stale. --- ooni/scripts/ooniprobe_agent.py | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-)
diff --git a/ooni/scripts/ooniprobe_agent.py b/ooni/scripts/ooniprobe_agent.py index e670d86..d7f4750 100644 --- a/ooni/scripts/ooniprobe_agent.py +++ b/ooni/scripts/ooniprobe_agent.py @@ -121,6 +121,17 @@ def get_running_pidfile(): return pidfile raise NotRunning
+def is_stale_pidfile(pidfile): + try: + with open(pidfile) as fd: + pid = int(fd.read()) + except Exception: + return False # that's either garbage in the pid-file or a race + return not is_process_running(pid) + +def get_stale_pidfiles(): + return [f for f in [config.system_pid_path, config.user_pid_path] if is_stale_pidfile(f)] + def status_agent(): try: get_running_pidfile() @@ -130,7 +141,7 @@ def status_agent(): print("ooniprobe-agent is NOT running") return 1
-def stop_agent(): +def do_stop_agent(): # This function is borrowed from tahoe try: pidfile = get_running_pidfile() @@ -144,12 +155,7 @@ def stop_agent(): os.kill(pid, signal.SIGTERM) except OSError as ose: if ose.errno == errno.ESRCH: - print("No process was running. Cleaning up.") - # the process didn't exist, so wipe the pid file - try: - os.remove(pidfile) - except EnvironmentError as exc: - print("Failed to delete the pidfile {0}".format(exc)) + print("No process was running.") # it's just a race return 2 elif ose.errno == errno.EPERM: # The process is owned by root. We assume it's running @@ -157,10 +163,7 @@ def stop_agent(): return 3 else: raise - try: - os.remove(pidfile) - except EnvironmentError: - pass + # the process wants to clean it's own pidfile itself start = time.time() time.sleep(0.1) wait = 40 @@ -197,6 +200,16 @@ def stop_agent(): # we define rc=1 to mean "I think something is still running, sorry" return 1
+def stop_agent(): + retval = do_stop_agent() + for pidfile in get_stale_pidfiles(): + try: + os.remove(pidfile) + print("Cleaned up stale pidfile {0}".format(pidfile)) + except EnvironmentError: + print("Failed to delete the pidfile {0}: {1}".format(pidfile, exc)) + return retval + def run(): options = AgentOptions() options.parseOptions()
tor-commits@lists.torproject.org