diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/telemetry/telemetry/internal/util/global_hooks.py | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/tools/telemetry/telemetry/internal/util/global_hooks.py b/tools/telemetry/telemetry/internal/util/global_hooks.py index b1541e9..8fe80d0 100644 --- a/tools/telemetry/telemetry/internal/util/global_hooks.py +++ b/tools/telemetry/telemetry/internal/util/global_hooks.py @@ -3,9 +3,11 @@ # found in the LICENSE file. """Hooks that apply globally to all scripts that import or use Telemetry.""" - +import atexit +import os import signal import sys +import logging from telemetry.internal.util import exception_formatter @@ -14,7 +16,7 @@ def InstallHooks(): InstallUnhandledExceptionFormatter() InstallStackDumpOnSigusr1() InstallTerminationHook() - + InstallListStrayProcessesUponExitHook() def InstallUnhandledExceptionFormatter(): """Print prettier exceptions that also contain the stack frame's locals.""" @@ -40,3 +42,33 @@ def InstallTerminationHook(): exception_formatter.PrintFormattedFrame(stack_frame, exception_string) sys.exit(-1) signal.signal(signal.SIGTERM, PrintStackAndExit) + + +def InstallListStrayProcessesUponExitHook(): + def _ListAllSubprocesses(): + try: + import psutil + except ImportError: + logging.error( + 'psutil is not installed on the system. Not listing possible ' + 'leaked processes. To install psutil, see: ' + 'https://pypi.python.org/pypi/psutil') + telemetry_pid = os.getpid() + parent = psutil.Process(telemetry_pid) + if hasattr(parent, 'children'): + children = parent.children(recursive=True) + else: # Some old version of psutil use get_children instead children. + children = parent.get_children() + if children: + leak_processes_info = [] + for p in children: + process_info = '%s (%s)' % (p.name(), p.pid) + try: + process_info += ' - %s' % p.cmdline() + except Exception: + pass + leak_processes_info.append(process_info) + logging.error('Telemetry leaks these processes: %s', + ', '.join(leak_processes_info)) + + atexit.register(_ListAllSubprocesses) |