1# Copyright 2013 The Chromium Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5import logging 6import psutil 7import signal 8 9from devil.android import device_errors 10from devil.android import device_utils 11 12 13def _KillWebServers(): 14 for s in [signal.SIGTERM, signal.SIGINT, signal.SIGQUIT, signal.SIGKILL]: 15 signalled = [] 16 for server in ['lighttpd', 'webpagereplay']: 17 for p in psutil.process_iter(): 18 try: 19 if not server in ' '.join(p.cmdline): 20 continue 21 logging.info('Killing %s %s %s', s, server, p.pid) 22 p.send_signal(s) 23 signalled.append(p) 24 except Exception: # pylint: disable=broad-except 25 logging.exception('Failed killing %s %s', server, p.pid) 26 for p in signalled: 27 try: 28 p.wait(1) 29 except Exception: # pylint: disable=broad-except 30 logging.exception('Failed waiting for %s to die.', p.pid) 31 32 33def CleanupLeftoverProcesses(devices): 34 """Clean up the test environment, restarting fresh adb and HTTP daemons. 35 36 Args: 37 devices: The devices to clean. 38 """ 39 _KillWebServers() 40 device_utils.RestartServer() 41 42 def cleanup_device(d): 43 d.WaitUntilFullyBooted() 44 d.RestartAdbd() 45 try: 46 d.EnableRoot() 47 except device_errors.CommandFailedError: 48 logging.exception('Failed to enable root') 49 d.WaitUntilFullyBooted() 50 51 device_utils.DeviceUtils.parallel(devices).pMap(cleanup_device) 52 53