def fork_waitfor_timed(tmp, pid, timeout): """ Waits for pid until it terminates or timeout expires. If timeout expires, test subprocess is killed. """ timer_expired = True poll_time = 2 time_passed = 0 while time_passed < timeout: time.sleep(poll_time) (child_pid, status) = os.waitpid(pid, os.WNOHANG) if (child_pid, status) == (0, 0): time_passed = time_passed + poll_time else: timer_expired = False break if timer_expired: logging.info('Timer expired (%d sec.), nuking pid %d', timeout, pid) utils.nuke_pid(pid) (child_pid, status) = os.waitpid(pid, 0) raise error.TestError("Test timeout expired, rc=%d" % (status)) else: _check_for_subprocess_exception(tmp, pid) if status: raise error.TestError("Test subprocess failed rc=%d" % (status))
def cleanup(container, options): """Cleanup orphaned container. @param container: A Container object to be cleaned up. @param options: Options to do cleanup. @return: True if cleanup is successful. False otherwise. """ if not options.execute: logging.info('dryrun: Cleanup container %s', container.name) return False try: _, pid = get_info(container.name) # Kill autoserv process if pid and utils.pid_is_alive(pid): logging.info('Stopping process %s...', pid) utils.nuke_pid(int(pid), (signal.SIGKILL, )) # Destroy container logging.info('Destroying container %s...', container.name) container.destroy() return True except Exception as e: logging.error('Failed to cleanup container %s. Error: %s', container.name, e) return False
def list_and_kill_processes(name): process_list = get_process_list(name) try: for pid in [int(str_pid) for str_pid in process_list]: utils.nuke_pid(pid) except error.AutoservPidAlreadyDeadError: pass return process_list
def fork_waitfor(self, timeout=None): if not timeout: return self.wait() else: _, result = retry.timeout(self.wait, timeout_sec=timeout) if result is None: utils.nuke_pid(self.pid) print "subcommand failed pid %d" % self.pid print "%s" % (self.func, ) print "timeout after %ds" % timeout print result = self.wait() return result
def fork_waitfor(self, timeout=None): if not timeout: return self.wait() else: start_time = time.time() while time.time() <= start_time + timeout: self.poll() if self.returncode is not None: return self.returncode time.sleep(1) utils.nuke_pid(self.pid) print "subcommand failed pid %d" % self.pid print "%s" % (self.func,) print "timeout after %ds" % timeout print return None
def fork_waitfor(self, timeout=None): if not timeout: return self.wait() else: end_time = time.time() + timeout while time.time() <= end_time: returncode = self.poll() if returncode is not None: return returncode time.sleep(1) utils.nuke_pid(self.pid) print "subcommand failed pid %d" % self.pid print "%s" % (self.func, ) print "timeout after %ds" % timeout print return None
def nuke_process_by_name(name, with_prejudice=False): """Tell the oldest process specified by name to exit. Arguments: name: process name specifier, as understood by pgrep. with_prejudice: if True, don't allow for graceful exit. Raises: error.AutoservPidAlreadyDeadError: no existing process matches name. """ try: pid = get_oldest_pid_by_name(name) except Exception as e: logging.error(e) return if pid is None: raise error.AutoservPidAlreadyDeadError('No process matching %s.' % name) if with_prejudice: utils.nuke_pid(pid, [signal.SIGKILL]) else: utils.nuke_pid(pid)
def fork_nuke_subprocess(tmp, pid): utils.nuke_pid(pid) _check_for_subprocess_exception(tmp, pid)
def kill_process(self, process): signal_queue = (signal.SIGCONT, signal.SIGTERM, signal.SIGKILL) utils.nuke_pid(process.pid, signal_queue=signal_queue)
def stop(self, test): utils.nuke_pid(self.pid)