mirror of
https://github.com/ARM-software/workload-automation.git
synced 2025-03-21 18:18:41 +00:00
Fix: implementing get_pid_of() and ps() for linux devices.
Existing implementation relied on android version of ps.
This commit is contained in:
parent
49d7072440
commit
950f0851bf
@ -24,7 +24,7 @@ import threading
|
|||||||
from subprocess import CalledProcessError
|
from subprocess import CalledProcessError
|
||||||
|
|
||||||
from wlauto.core.extension import Parameter
|
from wlauto.core.extension import Parameter
|
||||||
from wlauto.common.linux.device import BaseLinuxDevice
|
from wlauto.common.linux.device import BaseLinuxDevice, PsEntry
|
||||||
from wlauto.exceptions import DeviceError, WorkerThreadError, TimeoutError, DeviceNotRespondingError
|
from wlauto.exceptions import DeviceError, WorkerThreadError, TimeoutError, DeviceNotRespondingError
|
||||||
from wlauto.utils.misc import convert_new_lines
|
from wlauto.utils.misc import convert_new_lines
|
||||||
from wlauto.utils.types import boolean, regex
|
from wlauto.utils.types import boolean, regex
|
||||||
@ -457,6 +457,38 @@ class AndroidDevice(BaseLinuxDevice): # pylint: disable=W0223
|
|||||||
else:
|
else:
|
||||||
raise ValueError('Background command exited before timeout; got "{}"'.format(output))
|
raise ValueError('Background command exited before timeout; got "{}"'.format(output))
|
||||||
|
|
||||||
|
def get_pids_of(self, process_name):
|
||||||
|
"""Returns a list of PIDs of all processes with the specified name."""
|
||||||
|
result = self.execute('ps {}'.format(process_name[-15:]), check_exit_code=False).strip()
|
||||||
|
if result and 'not found' not in result:
|
||||||
|
return [int(x.split()[1]) for x in result.split('\n')[1:]]
|
||||||
|
else:
|
||||||
|
return []
|
||||||
|
|
||||||
|
def ps(self, **kwargs):
|
||||||
|
"""
|
||||||
|
Returns the list of running processes on the device. Keyword arguments may
|
||||||
|
be used to specify simple filters for columns.
|
||||||
|
|
||||||
|
Added in version 2.1.4
|
||||||
|
|
||||||
|
"""
|
||||||
|
lines = iter(convert_new_lines(self.execute('ps')).split('\n'))
|
||||||
|
lines.next() # header
|
||||||
|
result = []
|
||||||
|
for line in lines:
|
||||||
|
parts = line.split()
|
||||||
|
if parts:
|
||||||
|
result.append(PsEntry(*(parts[0:1] + map(int, parts[1:5]) + parts[5:])))
|
||||||
|
if not kwargs:
|
||||||
|
return result
|
||||||
|
else:
|
||||||
|
filtered_result = []
|
||||||
|
for entry in result:
|
||||||
|
if all(getattr(entry, k) == v for k, v in kwargs.iteritems()):
|
||||||
|
filtered_result.append(entry)
|
||||||
|
return filtered_result
|
||||||
|
|
||||||
def get_properties(self, context):
|
def get_properties(self, context):
|
||||||
"""Captures and saves the information from /system/build.prop and /proc/version"""
|
"""Captures and saves the information from /system/build.prop and /proc/version"""
|
||||||
props = {}
|
props = {}
|
||||||
|
@ -244,36 +244,10 @@ class BaseLinuxDevice(Device): # pylint: disable=abstract-method
|
|||||||
# Process query and control
|
# Process query and control
|
||||||
|
|
||||||
def get_pids_of(self, process_name):
|
def get_pids_of(self, process_name):
|
||||||
"""Returns a list of PIDs of all processes with the specified name."""
|
raise NotImplementedError()
|
||||||
result = self.execute('ps {}'.format(process_name[-15:]), check_exit_code=False).strip()
|
|
||||||
if result and 'not found' not in result:
|
|
||||||
return [int(x.split()[1]) for x in result.split('\n')[1:]]
|
|
||||||
else:
|
|
||||||
return []
|
|
||||||
|
|
||||||
def ps(self, **kwargs):
|
def ps(self, **kwargs):
|
||||||
"""
|
raise NotImplementedError()
|
||||||
Returns the list of running processes on the device. Keyword arguments may
|
|
||||||
be used to specify simple filters for columns.
|
|
||||||
|
|
||||||
Added in version 2.1.4
|
|
||||||
|
|
||||||
"""
|
|
||||||
lines = iter(convert_new_lines(self.execute('ps')).split('\n'))
|
|
||||||
lines.next() # header
|
|
||||||
result = []
|
|
||||||
for line in lines:
|
|
||||||
parts = line.split()
|
|
||||||
if parts:
|
|
||||||
result.append(PsEntry(*(parts[0:1] + map(int, parts[1:5]) + parts[5:])))
|
|
||||||
if not kwargs:
|
|
||||||
return result
|
|
||||||
else:
|
|
||||||
filtered_result = []
|
|
||||||
for entry in result:
|
|
||||||
if all(getattr(entry, k) == v for k, v in kwargs.iteritems()):
|
|
||||||
filtered_result.append(entry)
|
|
||||||
return filtered_result
|
|
||||||
|
|
||||||
def kill(self, pid, signal=None, as_root=False): # pylint: disable=W0221
|
def kill(self, pid, signal=None, as_root=False): # pylint: disable=W0221
|
||||||
"""
|
"""
|
||||||
@ -993,6 +967,35 @@ class LinuxDevice(BaseLinuxDevice):
|
|||||||
command = 'sh -c "{}" 1>/dev/null 2>/dev/null &'.format(escape_double_quotes(command))
|
command = 'sh -c "{}" 1>/dev/null 2>/dev/null &'.format(escape_double_quotes(command))
|
||||||
return self.shell.execute(command)
|
return self.shell.execute(command)
|
||||||
|
|
||||||
|
def get_pids_of(self, process_name):
|
||||||
|
"""Returns a list of PIDs of all processes with the specified name."""
|
||||||
|
# result should be a column of PIDs with the first row as "PID" header
|
||||||
|
result = self.execute('ps -C {} -o pid'.format(process_name), check_exit_code=False).strip().split()
|
||||||
|
if len(result) >= 2: # at least one row besides the header
|
||||||
|
return result[1:]
|
||||||
|
else:
|
||||||
|
return []
|
||||||
|
|
||||||
|
def ps(self, **kwargs):
|
||||||
|
command = 'ps -eo user,pid,ppid,vsize,rss,wchan,pcpu,state,fname'
|
||||||
|
lines = iter(convert_new_lines(self.execute(command)).split('\n'))
|
||||||
|
lines.next() # header
|
||||||
|
|
||||||
|
result = []
|
||||||
|
for line in lines:
|
||||||
|
parts = line.split()
|
||||||
|
if parts:
|
||||||
|
result.append(PsEntry(*(parts[0:1] + map(int, parts[1:5]) + parts[5:])))
|
||||||
|
|
||||||
|
if not kwargs:
|
||||||
|
return result
|
||||||
|
else:
|
||||||
|
filtered_result = []
|
||||||
|
for entry in result:
|
||||||
|
if all(getattr(entry, k) == v for k, v in kwargs.iteritems()):
|
||||||
|
filtered_result.append(entry)
|
||||||
|
return filtered_result
|
||||||
|
|
||||||
# File management
|
# File management
|
||||||
|
|
||||||
def push_file(self, source, dest, as_root=False, timeout=default_timeout): # pylint: disable=W0221
|
def push_file(self, source, dest, as_root=False, timeout=default_timeout): # pylint: disable=W0221
|
||||||
|
Loading…
x
Reference in New Issue
Block a user