Christopher Wiley | 2703d12 | 2016-03-07 07:56:53 -0800 | [diff] [blame] | 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: |
Casey Dahlin | 3e080df | 2016-03-17 16:36:04 -0700 | [diff] [blame] | 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)) |