| OLD | NEW |
| (Empty) |
| 1 #!/usr/bin/env python | |
| 2 # | |
| 3 # $Id: _psbsd.py 1142 2011-10-05 18:45:49Z g.rodola $ | |
| 4 # | |
| 5 # Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved. | |
| 6 # Use of this source code is governed by a BSD-style license that can be | |
| 7 # found in the LICENSE file. | |
| 8 | |
| 9 """FreeBSD platform implementation.""" | |
| 10 | |
| 11 import errno | |
| 12 import os | |
| 13 | |
| 14 import _psutil_bsd | |
| 15 import _psutil_posix | |
| 16 import _psposix | |
| 17 from psutil.error import AccessDenied, NoSuchProcess, TimeoutExpired | |
| 18 from psutil._compat import namedtuple | |
| 19 from psutil._common import * | |
| 20 | |
| 21 __extra__all__ = [] | |
| 22 | |
| 23 # --- constants | |
| 24 | |
| 25 NUM_CPUS = _psutil_bsd.get_num_cpus() | |
| 26 BOOT_TIME = _psutil_bsd.get_system_boot_time() | |
| 27 _TERMINAL_MAP = _psposix._get_terminal_map() | |
| 28 _cputimes_ntuple = namedtuple('cputimes', 'user nice system idle irq') | |
| 29 | |
| 30 # --- public functions | |
| 31 | |
| 32 def phymem_usage(): | |
| 33 """Physical system memory as a (total, used, free) tuple.""" | |
| 34 total = _psutil_bsd.get_total_phymem() | |
| 35 free = _psutil_bsd.get_avail_phymem() | |
| 36 used = total - free | |
| 37 # XXX check out whether we have to do the same math we do on Linux | |
| 38 percent = usage_percent(used, total, _round=1) | |
| 39 return ntuple_sysmeminfo(total, used, free, percent) | |
| 40 | |
| 41 def virtmem_usage(): | |
| 42 """Virtual system memory as a (total, used, free) tuple.""" | |
| 43 total = _psutil_bsd.get_total_virtmem() | |
| 44 free = _psutil_bsd.get_avail_virtmem() | |
| 45 used = total - free | |
| 46 percent = usage_percent(used, total, _round=1) | |
| 47 return ntuple_sysmeminfo(total, used, free, percent) | |
| 48 | |
| 49 def get_system_cpu_times(): | |
| 50 """Return system per-CPU times as a named tuple""" | |
| 51 user, nice, system, idle, irq = _psutil_bsd.get_system_cpu_times() | |
| 52 return _cputimes_ntuple(user, nice, system, idle, irq) | |
| 53 | |
| 54 def get_system_per_cpu_times(): | |
| 55 """Return system CPU times as a named tuple""" | |
| 56 ret = [] | |
| 57 for cpu_t in _psutil_bsd.get_system_per_cpu_times(): | |
| 58 user, nice, system, idle, irq = cpu_t | |
| 59 item = _cputimes_ntuple(user, nice, system, idle, irq) | |
| 60 ret.append(item) | |
| 61 return ret | |
| 62 | |
| 63 def disk_partitions(all=False): | |
| 64 retlist = [] | |
| 65 partitions = _psutil_bsd.get_disk_partitions() | |
| 66 for partition in partitions: | |
| 67 device, mountpoint, fstype = partition | |
| 68 if device == 'none': | |
| 69 device = '' | |
| 70 if not all: | |
| 71 if not os.path.isabs(device) \ | |
| 72 or not os.path.exists(device): | |
| 73 continue | |
| 74 ntuple = ntuple_partition(device, mountpoint, fstype) | |
| 75 retlist.append(ntuple) | |
| 76 return retlist | |
| 77 | |
| 78 get_pid_list = _psutil_bsd.get_pid_list | |
| 79 pid_exists = _psposix.pid_exists | |
| 80 get_disk_usage = _psposix.get_disk_usage | |
| 81 network_io_counters = _psutil_osx.get_network_io_counters | |
| 82 | |
| 83 | |
| 84 def wrap_exceptions(method): | |
| 85 """Call method(self, pid) into a try/except clause so that if an | |
| 86 OSError "No such process" exception is raised we assume the process | |
| 87 has died and raise psutil.NoSuchProcess instead. | |
| 88 """ | |
| 89 def wrapper(self, *args, **kwargs): | |
| 90 try: | |
| 91 return method(self, *args, **kwargs) | |
| 92 except OSError, err: | |
| 93 if err.errno == errno.ESRCH: | |
| 94 raise NoSuchProcess(self.pid, self._process_name) | |
| 95 if err.errno in (errno.EPERM, errno.EACCES): | |
| 96 raise AccessDenied(self.pid, self._process_name) | |
| 97 raise | |
| 98 return wrapper | |
| 99 | |
| 100 _status_map = { | |
| 101 _psutil_bsd.SSTOP : STATUS_STOPPED, | |
| 102 _psutil_bsd.SSLEEP : STATUS_SLEEPING, | |
| 103 _psutil_bsd.SRUN : STATUS_RUNNING, | |
| 104 _psutil_bsd.SIDL : STATUS_IDLE, | |
| 105 _psutil_bsd.SWAIT : STATUS_WAITING, | |
| 106 _psutil_bsd.SLOCK : STATUS_LOCKED, | |
| 107 _psutil_bsd.SZOMB : STATUS_ZOMBIE, | |
| 108 } | |
| 109 | |
| 110 | |
| 111 class Process(object): | |
| 112 """Wrapper class around underlying C implementation.""" | |
| 113 | |
| 114 __slots__ = ["pid", "_process_name"] | |
| 115 | |
| 116 def __init__(self, pid): | |
| 117 self.pid = pid | |
| 118 self._process_name = None | |
| 119 | |
| 120 @wrap_exceptions | |
| 121 def get_process_name(self): | |
| 122 """Return process name as a string of limited len (15).""" | |
| 123 return _psutil_bsd.get_process_name(self.pid) | |
| 124 | |
| 125 @wrap_exceptions | |
| 126 def get_process_exe(self): | |
| 127 """Return process executable pathname.""" | |
| 128 return _psutil_bsd.get_process_exe(self.pid) | |
| 129 | |
| 130 @wrap_exceptions | |
| 131 def get_process_cmdline(self): | |
| 132 """Return process cmdline as a list of arguments.""" | |
| 133 return _psutil_bsd.get_process_cmdline(self.pid) | |
| 134 | |
| 135 @wrap_exceptions | |
| 136 def get_process_terminal(self): | |
| 137 tty_nr = _psutil_bsd.get_process_tty_nr(self.pid) | |
| 138 try: | |
| 139 return _TERMINAL_MAP[tty_nr] | |
| 140 except KeyError: | |
| 141 return None | |
| 142 | |
| 143 @wrap_exceptions | |
| 144 def get_process_ppid(self): | |
| 145 """Return process parent pid.""" | |
| 146 return _psutil_bsd.get_process_ppid(self.pid) | |
| 147 | |
| 148 @wrap_exceptions | |
| 149 def get_process_uids(self): | |
| 150 """Return real, effective and saved user ids.""" | |
| 151 real, effective, saved = _psutil_bsd.get_process_uids(self.pid) | |
| 152 return ntuple_uids(real, effective, saved) | |
| 153 | |
| 154 @wrap_exceptions | |
| 155 def get_process_gids(self): | |
| 156 """Return real, effective and saved group ids.""" | |
| 157 real, effective, saved = _psutil_bsd.get_process_gids(self.pid) | |
| 158 return ntuple_gids(real, effective, saved) | |
| 159 | |
| 160 @wrap_exceptions | |
| 161 def get_cpu_times(self): | |
| 162 """return a tuple containing process user/kernel time.""" | |
| 163 user, system = _psutil_bsd.get_cpu_times(self.pid) | |
| 164 return ntuple_cputimes(user, system) | |
| 165 | |
| 166 @wrap_exceptions | |
| 167 def get_memory_info(self): | |
| 168 """Return a tuple with the process' RSS and VMS size.""" | |
| 169 rss, vms = _psutil_bsd.get_memory_info(self.pid) | |
| 170 return ntuple_meminfo(rss, vms) | |
| 171 | |
| 172 @wrap_exceptions | |
| 173 def get_process_create_time(self): | |
| 174 """Return the start time of the process as a number of seconds since | |
| 175 the epoch.""" | |
| 176 return _psutil_bsd.get_process_create_time(self.pid) | |
| 177 | |
| 178 @wrap_exceptions | |
| 179 def get_process_num_threads(self): | |
| 180 """Return the number of threads belonging to the process.""" | |
| 181 return _psutil_bsd.get_process_num_threads(self.pid) | |
| 182 | |
| 183 @wrap_exceptions | |
| 184 def get_process_threads(self): | |
| 185 """Return the number of threads belonging to the process.""" | |
| 186 rawlist = _psutil_bsd.get_process_threads(self.pid) | |
| 187 retlist = [] | |
| 188 for thread_id, utime, stime in rawlist: | |
| 189 ntuple = ntuple_thread(thread_id, utime, stime) | |
| 190 retlist.append(ntuple) | |
| 191 return retlist | |
| 192 | |
| 193 def get_open_files(self): | |
| 194 """Return files opened by process by parsing lsof output.""" | |
| 195 lsof = _psposix.LsofParser(self.pid, self._process_name) | |
| 196 return lsof.get_process_open_files() | |
| 197 | |
| 198 def get_connections(self): | |
| 199 """Return network connections opened by a process as a list of | |
| 200 namedtuples by parsing lsof output. | |
| 201 """ | |
| 202 lsof = _psposix.LsofParser(self.pid, self._process_name) | |
| 203 return lsof.get_process_connections() | |
| 204 | |
| 205 @wrap_exceptions | |
| 206 def process_wait(self, timeout=None): | |
| 207 try: | |
| 208 return _psposix.wait_pid(self.pid, timeout) | |
| 209 except TimeoutExpired: | |
| 210 raise TimeoutExpired(self.pid, self._process_name) | |
| 211 | |
| 212 @wrap_exceptions | |
| 213 def get_process_nice(self): | |
| 214 return _psutil_posix.getpriority(self.pid) | |
| 215 | |
| 216 @wrap_exceptions | |
| 217 def set_process_nice(self, value): | |
| 218 return _psutil_posix.setpriority(self.pid, value) | |
| 219 | |
| 220 @wrap_exceptions | |
| 221 def get_process_status(self): | |
| 222 code = _psutil_bsd.get_process_status(self.pid) | |
| 223 if code in _status_map: | |
| 224 return _status_map[code] | |
| 225 return constant(-1, "?") | |
| 226 | |
| 227 @wrap_exceptions | |
| 228 def get_process_io_counters(self): | |
| 229 rc, wc, rb, wb = _psutil_bsd.get_process_io_counters(self.pid) | |
| 230 return ntuple_io(rc, wc, rb, wb) | |
| OLD | NEW |