1 # Copyright 2016 The Chromium OS 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 5 import time 6 7 from autotest_lib.client.common_lib import error 8 from autotest_lib.client.common_lib import utils 9 10 def pkill_process(process_name, is_full_name=True, 11 timeout_seconds=60, host=None, 12 ignore_status=False): 13 """Run pkill against a process until it dies. 14 15 @param process_name: the name of a process. 16 @param is_full_name: True iff the value of |process_name| is the complete 17 name of the process as understood by pkill. 18 @param timeout_seconds: number of seconds to wait for proceess to die. 19 @param host: host object to kill the process on. Defaults to killing 20 processes on our localhost. 21 @param ignore_status: True iff we should ignore whether we actually 22 managed to kill the given process. 23 24 """ 25 run = host.run if host is not None else utils.run 26 full_flag = '-f' if is_full_name else '' 27 kill_cmd = 'pkill %s "%s"' % (full_flag, process_name) 28 29 result = run(kill_cmd, ignore_status=True) 30 start_time = time.time() 31 while (0 == result.exit_status and 32 time.time() - start_time < timeout_seconds): 33 time.sleep(0.3) 34 result = run(kill_cmd, ignore_status=True) 35 36 if result.exit_status == 0 and not ignore_status: 37 r = run('cat /proc/`pgrep %s`/status' % process_name, 38 ignore_status=True) 39 raise error.TestError('Failed to kill proccess "%s":\n%s' % 40 (process_name, r.stdout)) 41