| # Copyright (c) 2013 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import os |
| import re |
| |
| from autotest_lib.client.bin import test |
| from autotest_lib.client.common_lib import error |
| |
| class platform_CheckCriticalProcesses(test.test): |
| """ |
| Builds a process list (without spawning 'ps'), and validates |
| that among these processes all the expected processes are running. |
| """ |
| version = 1 |
| |
| def get_process_name(self, pid): |
| """Gathers info about one process, given its PID |
| |
| @param pid string representing the process ID |
| @return string process name |
| |
| """ |
| with open(os.path.join('/proc', pid, 'status')) as pid_status_file: |
| for line in pid_status_file: |
| fields = re.split('\s+',line) |
| if fields[0] == 'Name:': |
| return fields[1] |
| |
| |
| def get_process_list(self): |
| """Returns the set the process names""" |
| process_names = set() |
| for pid in os.listdir('/proc'): |
| if not pid.isdigit(): |
| continue |
| |
| # There can be a race where after we listdir(), a process |
| # exits. In that case get_process_name will throw an IOError |
| # becase /proc/NNNN won't exist. |
| # In those cases, skip to the next go-round of our loop. |
| try: |
| process_names.add(self.get_process_name(pid)) |
| except IOError: |
| continue |
| |
| return process_names |
| |
| |
| def run_once(self, process_list): |
| """ |
| Verify processes in |process_list| are running. |
| |
| @param process_list: list of process names to check |
| """ |
| processes = self.get_process_list() |
| missing_processes = [] |
| for p in process_list: |
| processes_names = p.split('|') |
| if set(processes_names).isdisjoint(processes): |
| missing_processes.append(p) |
| if missing_processes: |
| raise error.TestFail('The following processes are not running: %r.' |
| % missing_processes) |