Index: third_party/psutil/psutil/__init__.py |
diff --git a/third_party/psutil/psutil/__init__.py b/third_party/psutil/psutil/__init__.py |
deleted file mode 100644 |
index 93724fca1a97788acf6dcba48a57d255d329f8cd..0000000000000000000000000000000000000000 |
--- a/third_party/psutil/psutil/__init__.py |
+++ /dev/null |
@@ -1,822 +0,0 @@ |
-#!/usr/bin/env python |
-# |
-# $Id: __init__.py 1142 2011-10-05 18:45:49Z g.rodola $ |
-# |
-# Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved. |
-# Use of this source code is governed by a BSD-style license that can be |
-# found in the LICENSE file. |
- |
-"""psutil is a module providing convenience functions for managing |
-processes and gather system information in a portable way by using |
-Python. |
-""" |
- |
-__version__ = "0.3.1" |
-version_info = tuple([int(num) for num in __version__.split('.')]) |
- |
-__all__ = [ |
- # exceptions |
- "Error", "NoSuchProcess", "AccessDenied", "TimeoutExpired", |
- # constants |
- "NUM_CPUS", "TOTAL_PHYMEM", "BOOT_TIME", |
- "version_info", "__version__", |
- "STATUS_RUNNING", "STATUS_IDLE", "STATUS_SLEEPING", "STATUS_DISK_SLEEP", |
- "STATUS_STOPPED", "STATUS_TRACING_STOP", "STATUS_ZOMBIE", "STATUS_DEAD", |
- "STATUS_WAKING", "STATUS_LOCKED", |
- # classes |
- "Process", "Popen", |
- # functions |
- "test", "pid_exists", "get_pid_list", "process_iter", "get_process_list", |
- "phymem_usage", "virtmem_usage" |
- "cpu_times", "per_cpu_times", "cpu_percent", "per_cpu_percent", |
- "network_io_counters", "disk_io_counters", |
- ] |
- |
-import sys |
-import os |
-import time |
-import signal |
-import warnings |
-import errno |
-import subprocess |
-try: |
- import pwd |
-except ImportError: |
- pwd = None |
- |
-from psutil.error import Error, NoSuchProcess, AccessDenied, TimeoutExpired |
-from psutil._compat import property |
-from psutil._common import (STATUS_RUNNING, STATUS_IDLE, STATUS_SLEEPING, |
- STATUS_DISK_SLEEP, STATUS_STOPPED, |
- STATUS_TRACING_STOP, STATUS_ZOMBIE, STATUS_DEAD, |
- STATUS_WAKING, STATUS_LOCKED |
- ) |
- |
-# import the appropriate module for our platform only |
-if sys.platform.lower().startswith("linux"): |
- import psutil._pslinux as _psplatform |
- from psutil._pslinux import (phymem_buffers, |
- cached_phymem, |
- IOPRIO_CLASS_NONE, |
- IOPRIO_CLASS_RT, |
- IOPRIO_CLASS_BE, |
- IOPRIO_CLASS_IDLE) |
- phymem_buffers = _psplatform.phymem_buffers |
- cached_phymem = _psplatform.cached_phymem |
- |
-elif sys.platform.lower().startswith("win32"): |
- import psutil._psmswindows as _psplatform |
- from psutil._psmswindows import (ABOVE_NORMAL_PRIORITY_CLASS, |
- BELOW_NORMAL_PRIORITY_CLASS, |
- HIGH_PRIORITY_CLASS, |
- IDLE_PRIORITY_CLASS, |
- NORMAL_PRIORITY_CLASS, |
- REALTIME_PRIORITY_CLASS) |
- |
-elif sys.platform.lower().startswith("darwin"): |
- import psutil._psosx as _psplatform |
- |
-elif sys.platform.lower().startswith("freebsd"): |
- import psutil._psbsd as _psplatform |
- |
-else: |
- raise NotImplementedError('platform %s is not supported' % sys.platform) |
- |
-__all__.extend(_psplatform.__extra__all__) |
- |
-NUM_CPUS = _psplatform.NUM_CPUS |
-BOOT_TIME = _psplatform.BOOT_TIME |
-TOTAL_PHYMEM = _psplatform.phymem_usage()[0] |
- |
-get_pid_list = _psplatform.get_pid_list |
-pid_exists = _psplatform.pid_exists |
- |
- |
-class Process(object): |
- """Represents an OS process.""" |
- |
- def __init__(self, pid): |
- """Create a new Process object, raises NoSuchProcess if the PID |
- does not exist, and ValueError if the parameter is not an |
- integer PID. |
- """ |
- if not isinstance(pid, int): |
- raise ValueError("an integer is required") |
- if not pid_exists(pid): |
- raise NoSuchProcess(pid, None, "no process found with pid %s" % pid) |
- self._pid = pid |
- # platform-specific modules define an _psplatform.Process |
- # implementation class |
- self._platform_impl = _psplatform.Process(pid) |
- self._last_sys_cpu_times = None |
- self._last_proc_cpu_times = None |
- |
- def __str__(self): |
- try: |
- pid = self.pid |
- name = repr(self.name) |
- except NoSuchProcess: |
- details = "(pid=%s (terminated))" % self.pid |
- except AccessDenied: |
- details = "(pid=%s)" % (self.pid) |
- else: |
- details = "(pid=%s, name=%s)" % (pid, name) |
- return "%s.%s%s" % (self.__class__.__module__, |
- self.__class__.__name__, details) |
- |
- def __repr__(self): |
- return "<%s at %s>" % (self.__str__(), id(self)) |
- |
- @property |
- def pid(self): |
- """The process pid.""" |
- return self._pid |
- |
- @property |
- def ppid(self): |
- """The process parent pid.""" |
- return self._platform_impl.get_process_ppid() |
- |
- @property |
- def parent(self): |
- """Return the parent process as a Process object. If no parent |
- pid is known return None. |
- """ |
- ppid = self.ppid |
- if ppid is not None: |
- try: |
- return Process(ppid) |
- except NoSuchProcess: |
- pass |
- |
- @property |
- def name(self): |
- """The process name.""" |
- name = self._platform_impl.get_process_name() |
- if os.name == 'posix': |
- # On UNIX the name gets truncated to the first 15 characters. |
- # If it matches the first part of the cmdline we return that |
- # one instead because it's usually more explicative. |
- # Examples are "gnome-keyring-d" vs. "gnome-keyring-daemon". |
- cmdline = self.cmdline |
- if cmdline: |
- extended_name = os.path.basename(cmdline[0]) |
- if extended_name.startswith(name): |
- name = extended_name |
- # XXX - perhaps needs refactoring |
- self._platform_impl._process_name = name |
- return name |
- |
- @property |
- def exe(self): |
- """The process executable as an absolute path name.""" |
- exe = self._platform_impl.get_process_exe() |
- # if we have the cmdline but not the exe, figure it out from argv[0] |
- if not exe: |
- cmdline = self.cmdline |
- if cmdline and hasattr(os, 'access') and hasattr(os, 'X_OK'): |
- _exe = os.path.realpath(cmdline[0]) |
- if os.path.isfile(_exe) and os.access(_exe, os.X_OK): |
- return _exe |
- if not exe: |
- raise AccessDenied(self.pid, self._platform_impl._process_name) |
- return exe |
- |
- @property |
- def cmdline(self): |
- """The command line process has been called with.""" |
- return self._platform_impl.get_process_cmdline() |
- |
- @property |
- def status(self): |
- """The process current status as a STATUS_* constant.""" |
- return self._platform_impl.get_process_status() |
- |
- @property |
- def nice(self): |
- """Get or set process niceness (priority).""" |
- return self._platform_impl.get_process_nice() |
- |
- @nice.setter |
- def nice(self, value): |
- # invoked on "p.nice = num"; change process niceness |
- return self._platform_impl.set_process_nice(value) |
- |
- if os.name == 'posix': |
- |
- @property |
- def uids(self): |
- """Return a named tuple denoting the process real, |
- effective, and saved user ids. |
- """ |
- return self._platform_impl.get_process_uids() |
- |
- @property |
- def gids(self): |
- """Return a named tuple denoting the process real, |
- effective, and saved group ids. |
- """ |
- return self._platform_impl.get_process_gids() |
- |
- @property |
- def terminal(self): |
- """The terminal associated with this process, if any, |
- else None. |
- """ |
- return self._platform_impl.get_process_terminal() |
- |
- @property |
- def username(self): |
- """The name of the user that owns the process. |
- On UNIX this is calculated by using *real* process uid. |
- """ |
- if os.name == 'posix': |
- if pwd is None: |
- # might happen if python was installed from sources |
- raise ImportError("requires pwd module shipped with standard python") |
- return pwd.getpwuid(self.uids.real).pw_name |
- else: |
- return self._platform_impl.get_process_username() |
- |
- @property |
- def create_time(self): |
- """The process creation time as a floating point number |
- expressed in seconds since the epoch, in UTC. |
- """ |
- return self._platform_impl.get_process_create_time() |
- |
- # available for Windows and Linux only |
- if hasattr(_psplatform.Process, "get_process_cwd"): |
- |
- def getcwd(self): |
- """Return a string representing the process current working |
- directory. |
- """ |
- return self._platform_impl.get_process_cwd() |
- |
- # Linux, BSD and Windows only |
- if hasattr(_psplatform.Process, "get_process_io_counters"): |
- |
- def get_io_counters(self): |
- """Return process I/O statistics as a namedtuple including |
- the number of read/write calls performed and the amount of |
- bytes read and written by the process. |
- """ |
- return self._platform_impl.get_process_io_counters() |
- |
- # available only on Linux |
- if hasattr(_psplatform.Process, "get_process_ionice"): |
- |
- def get_ionice(self): |
- """Return process I/O niceness (priority) as a namedtuple.""" |
- return self._platform_impl.get_process_ionice() |
- |
- def set_ionice(self, ioclass, value=None): |
- """Set process I/O niceness (priority). |
- ioclass is one of the IOPRIO_CLASS_* constants. |
- iodata is a number which goes from 0 to 7. The higher the |
- value, the lower the I/O priority of the process. |
- """ |
- return self._platform_impl.set_process_ionice(ioclass, value) |
- |
- def get_num_threads(self): |
- """Return the number of threads used by this process.""" |
- return self._platform_impl.get_process_num_threads() |
- |
- def get_threads(self): |
- """Return threads opened by process as a list of namedtuples |
- including thread id and thread CPU times (user/system). |
- """ |
- return self._platform_impl.get_process_threads() |
- |
- def get_children(self): |
- """Return the children of this process as a list of Process |
- objects. |
- """ |
- if not self.is_running(): |
- name = self._platform_impl._process_name |
- raise NoSuchProcess(self.pid, name) |
- retlist = [] |
- for proc in process_iter(): |
- try: |
- if proc.ppid == self.pid: |
- retlist.append(proc) |
- except NoSuchProcess: |
- pass |
- return retlist |
- |
- def get_cpu_percent(self, interval=0.1): |
- """Return a float representing the current process CPU |
- utilization as a percentage. |
- |
- When interval is > 0.0 compares process times to system CPU |
- times elapsed before and after the interval (blocking). |
- |
- When interval is 0.0 or None compares process times to system CPU |
- times elapsed since last call, returning immediately. |
- In this case is recommended for accuracy that this function be |
- called with at least 0.1 seconds between calls. |
- """ |
- blocking = interval is not None and interval > 0.0 |
- if blocking: |
- st1 = sum(cpu_times()) |
- pt1 = self._platform_impl.get_cpu_times() |
- time.sleep(interval) |
- st2 = sum(cpu_times()) |
- pt2 = self._platform_impl.get_cpu_times() |
- else: |
- st1 = self._last_sys_cpu_times |
- pt1 = self._last_proc_cpu_times |
- st2 = sum(cpu_times()) |
- pt2 = self._platform_impl.get_cpu_times() |
- if st1 is None or pt1 is None: |
- self._last_sys_cpu_times = st2 |
- self._last_proc_cpu_times = pt2 |
- return 0.0 |
- |
- delta_proc = (pt2.user - pt1.user) + (pt2.system - pt1.system) |
- delta_time = st2 - st1 |
- # reset values for next call in case of interval == None |
- self._last_sys_cpu_times = st2 |
- self._last_proc_cpu_times = pt2 |
- |
- try: |
- # the utilization split between all CPUs |
- overall_percent = (delta_proc / delta_time) * 100 |
- except ZeroDivisionError: |
- # interval was too low |
- return 0.0 |
- # the utilization of a single CPU |
- single_cpu_percent = overall_percent * NUM_CPUS |
- # ugly hack to avoid troubles with float precision issues |
- if single_cpu_percent > 100.0: |
- return 100.0 |
- return round(single_cpu_percent, 1) |
- |
- def get_cpu_times(self): |
- """Return a tuple whose values are process CPU user and system |
- times. The same as os.times() but per-process. |
- """ |
- return self._platform_impl.get_cpu_times() |
- |
- def get_memory_info(self): |
- """Return a tuple representing RSS (Resident Set Size) and VMS |
- (Virtual Memory Size) in bytes. |
- |
- On UNIX RSS and VMS are the same values shown by ps. |
- |
- On Windows RSS and VMS refer to "Mem Usage" and "VM Size" columns |
- of taskmgr.exe. |
- """ |
- return self._platform_impl.get_memory_info() |
- |
- def get_memory_percent(self): |
- """Compare physical system memory to process resident memory and |
- calculate process memory utilization as a percentage. |
- """ |
- rss = self._platform_impl.get_memory_info()[0] |
- try: |
- return (rss / float(TOTAL_PHYMEM)) * 100 |
- except ZeroDivisionError: |
- return 0.0 |
- |
- def get_open_files(self): |
- """Return files opened by process as a list of namedtuples |
- including absolute file name and file descriptor number. |
- """ |
- return self._platform_impl.get_open_files() |
- |
- def get_connections(self): |
- """Return TCP and UPD connections opened by process as a list |
- of namedtuples. |
- On BSD and OSX results for third party processes (!= os.getpid()) |
- can differ depending on user privileges. |
- """ |
- return self._platform_impl.get_connections() |
- |
- def is_running(self): |
- """Return whether this process is running.""" |
- try: |
- # Test for equality with another Process object based |
- # on pid and creation time. |
- # This pair is supposed to indentify a Process instance |
- # univocally over the time (the PID alone is not enough as |
- # it might refer to a process which is gone in meantime |
- # and its PID reused by another process). |
- new_self = Process(self.pid) |
- p1 = (self.pid, self.create_time) |
- p2 = (new_self.pid, new_self.create_time) |
- except NoSuchProcess: |
- return False |
- else: |
- return p1 == p2 |
- |
- def send_signal(self, sig): |
- """Send a signal to process (see signal module constants). |
- On Windows only SIGTERM is valid and is treated as an alias |
- for kill(). |
- """ |
- # safety measure in case the current process has been killed in |
- # meantime and the kernel reused its PID |
- if not self.is_running(): |
- name = self._platform_impl._process_name |
- raise NoSuchProcess(self.pid, name) |
- if os.name == 'posix': |
- try: |
- os.kill(self.pid, sig) |
- except OSError, err: |
- name = self._platform_impl._process_name |
- if err.errno == errno.ESRCH: |
- raise NoSuchProcess(self.pid, name) |
- if err.errno == errno.EPERM: |
- raise AccessDenied(self.pid, name) |
- raise |
- else: |
- if sig == signal.SIGTERM: |
- self._platform_impl.kill_process() |
- else: |
- raise ValueError("only SIGTERM is supported on Windows") |
- |
- def suspend(self): |
- """Suspend process execution.""" |
- # safety measure in case the current process has been killed in |
- # meantime and the kernel reused its PID |
- if not self.is_running(): |
- name = self._platform_impl._process_name |
- raise NoSuchProcess(self.pid, name) |
- # windows |
- if hasattr(self._platform_impl, "suspend_process"): |
- self._platform_impl.suspend_process() |
- else: |
- # posix |
- self.send_signal(signal.SIGSTOP) |
- |
- def resume(self): |
- """Resume process execution.""" |
- # safety measure in case the current process has been killed in |
- # meantime and the kernel reused its PID |
- if not self.is_running(): |
- name = self._platform_impl._process_name |
- raise NoSuchProcess(self.pid, name) |
- # windows |
- if hasattr(self._platform_impl, "resume_process"): |
- self._platform_impl.resume_process() |
- else: |
- # posix |
- self.send_signal(signal.SIGCONT) |
- |
- def terminate(self): |
- """Terminate the process with SIGTERM. |
- On Windows this is an alias for kill(). |
- """ |
- self.send_signal(signal.SIGTERM) |
- |
- def kill(self): |
- """Kill the current process.""" |
- # safety measure in case the current process has been killed in |
- # meantime and the kernel reused its PID |
- if not self.is_running(): |
- name = self._platform_impl._process_name |
- raise NoSuchProcess(self.pid, name) |
- if os.name == 'posix': |
- self.send_signal(signal.SIGKILL) |
- else: |
- self._platform_impl.kill_process() |
- |
- def wait(self, timeout=None): |
- """Wait for process to terminate and, if process is a children |
- of the current one also return its exit code, else None. |
- """ |
- if timeout is not None and not timeout >= 0: |
- raise ValueError("timeout must be a positive integer") |
- return self._platform_impl.process_wait(timeout) |
- |
- |
-class Popen(Process): |
- """A more convenient interface to stdlib subprocess module. |
- It starts a sub process and deals with it exactly as when using |
- subprocess.Popen class but in addition also provides all the |
- property and methods of psutil.Process class in a unique interface: |
- |
- >>> import psutil |
- >>> from subprocess import PIPE |
- >>> p = psutil.Popen(["/usr/bin/python", "-c", "print 'hi'"], stdout=PIPE) |
- >>> p.name |
- 'python' |
- >>> p.uids |
- user(real=1000, effective=1000, saved=1000) |
- >>> p.username |
- 'giampaolo' |
- >>> p.communicate() |
- ('hi\n', None) |
- >>> p.terminate() |
- >>> p.wait(timeout=2) |
- 0 |
- >>> |
- |
- For method names common to both classes such as kill(), terminate() |
- and wait(), psutil.Process implementation takes precedence. |
- |
- For a complete documentation refers to: |
- http://docs.python.org/library/subprocess.html |
- """ |
- |
- def __init__(self, *args, **kwargs): |
- self.__subproc = subprocess.Popen(*args, **kwargs) |
- Process.__init__(self, self.__subproc.pid) |
- |
- def __dir__(self): |
- return list(set(dir(Popen) + dir(subprocess.Popen))) |
- |
- def __getattribute__(self, name): |
- try: |
- return object.__getattribute__(self, name) |
- except AttributeError: |
- try: |
- return object.__getattribute__(self.__subproc, name) |
- except AttributeError: |
- raise AttributeError("%s instance has no attribute '%s'" |
- %(self.__class__.__name__, name)) |
- |
-def process_iter(): |
- """Return an iterator yielding a Process class instances for all |
- running processes on the local machine. |
- """ |
- pids = get_pid_list() |
- for pid in pids: |
- try: |
- yield Process(pid) |
- except (NoSuchProcess, AccessDenied): |
- continue |
- |
-def get_process_list(): |
- """Return a list of Process class instances for all running |
- processes on the local machine. |
- """ |
- return list(process_iter()) |
- |
-def cpu_times(percpu=False): |
- """Return system-wide CPU times as a namedtuple object. |
- Every CPU time represents the time CPU has spent in the given mode. |
- The attributes availability varies depending on the platform. |
- Here follows a list of all available attributes: |
- - user |
- - system |
- - idle |
- - nice (UNIX) |
- - iowait (Linux) |
- - irq (Linux, FreeBSD) |
- - softirq (Linux) |
- |
- When percpu is True return a list of nameduples for each CPU. |
- First element of the list refers to first CPU, second element |
- to second CPU and so on. |
- The order of the list is consistent across calls. |
- """ |
- if not percpu: |
- return _psplatform.get_system_cpu_times() |
- else: |
- return _psplatform.get_system_per_cpu_times() |
- |
- |
-_last_cpu_times = cpu_times() |
-_last_per_cpu_times = cpu_times(percpu=True) |
- |
-def cpu_percent(interval=0.1, percpu=False): |
- """Return a float representing the current system-wide CPU |
- utilization as a percentage. |
- |
- When interval is > 0.0 compares system CPU times elapsed before |
- and after the interval (blocking). |
- |
- When interval is 0.0 or None compares system CPU times elapsed |
- since last call or module import, returning immediately. |
- In this case is recommended for accuracy that this function be |
- called with at least 0.1 seconds between calls. |
- |
- When percpu is True returns a list of floats representing the |
- utilization as a percentage for each CPU. |
- First element of the list refers to first CPU, second element |
- to second CPU and so on. |
- The order of the list is consistent across calls. |
- """ |
- global _last_cpu_times |
- global _last_per_cpu_times |
- blocking = interval is not None and interval > 0.0 |
- |
- def calculate(t1, t2): |
- t1_all = sum(t1) |
- t1_busy = t1_all - t1.idle |
- |
- t2_all = sum(t2) |
- t2_busy = t2_all - t2.idle |
- |
- # this usually indicates a float precision issue |
- if t2_busy <= t1_busy: |
- return 0.0 |
- |
- busy_delta = t2_busy - t1_busy |
- all_delta = t2_all - t1_all |
- busy_perc = (busy_delta / all_delta) * 100 |
- return round(busy_perc, 1) |
- |
- # system-wide usage |
- if not percpu: |
- if blocking: |
- t1 = cpu_times() |
- time.sleep(interval) |
- else: |
- t1 = _last_cpu_times |
- _last_cpu_times = cpu_times() |
- return calculate(t1, _last_cpu_times) |
- # per-cpu usage |
- else: |
- ret = [] |
- if blocking: |
- tot1 = cpu_times(percpu=True) |
- time.sleep(interval) |
- else: |
- tot1 = _last_per_cpu_times |
- _last_per_cpu_times = cpu_times(percpu=True) |
- for t1, t2 in zip(tot1, _last_per_cpu_times): |
- ret.append(calculate(t1, t2)) |
- return ret |
- |
-def phymem_usage(): |
- """Return the amount of total, used and free physical memory |
- on the system in bytes plus the percentage usage. |
- """ |
- return _psplatform.phymem_usage() |
- |
-def virtmem_usage(): |
- """Return the amount of total, used and free virtual memory |
- on the system in bytes plus the percentage usage. |
- |
- On Linux they match the values returned by free command line utility. |
- On OS X and FreeBSD they represent the same values as returned by |
- sysctl vm.vmtotal. On Windows they are determined by reading the |
- PageFile values of MEMORYSTATUSEX structure. |
- """ |
- return _psplatform.virtmem_usage() |
- |
-def disk_usage(path): |
- """Return disk usage statistics about the given path as a namedtuple |
- including total, used and free space expressed in bytes plus the |
- percentage usage. |
- """ |
- return _psplatform.get_disk_usage(path) |
- |
-def disk_partitions(all=False): |
- """Return mounted partitions as a list of namedtuples including |
- device, mount point and filesystem type. |
- |
- If "all" parameter is False return physical devices only and ignore |
- all others. |
- """ |
- return _psplatform.disk_partitions(all) |
- |
-if hasattr(_psplatform, "network_io_counters"): |
- |
- def network_io_counters(pernic=False): |
- """Return network I/O statistics as a namedtuple including: |
- - number of bytes sent |
- - number of bytes received |
- - number of packets sent |
- - number of packets received |
- |
- If pernic is True return the same information for every |
- network interface installed on the system as a dictionary |
- with network interface names as the keys and the namedtuple |
- described above as the values. |
- """ |
- from psutil._common import ntuple_net_iostat |
- rawdict = _psplatform.network_io_counters() |
- if pernic: |
- for nic, fields in rawdict.iteritems(): |
- rawdict[nic] = ntuple_net_iostat(*fields) |
- return rawdict |
- else: |
- bytes_sent, bytes_recv, packets_sent, packets_recv = 0, 0, 0, 0 |
- for _, fields in rawdict.iteritems(): |
- bytes_sent += fields[0] |
- bytes_recv += fields[1] |
- packets_sent += fields[2] |
- packets_recv += fields[3] |
- return ntuple_net_iostat(bytes_sent, bytes_recv, |
- packets_sent, packets_recv) |
- |
-if hasattr(_psplatform, "disk_io_counters"): |
- |
- def disk_io_counters(perdisk=False): |
- """Return system disk I/O statistics as a namedtuple including: |
- - number of bytes read |
- - number of bytes written |
- - number of reads |
- - number of writes |
- - time spent reading from disk (in nanoseconds) |
- - time spent writing to disk (in nanoseconds) |
- |
- If perdisk is True return the same information for every |
- physical disk installed on the system as a dictionary |
- with partition names as the keys and the namedutuple |
- described above as the values. |
- """ |
- from psutil._common import ntuple_disk_iostat |
- rawdict = _psplatform.disk_io_counters() |
- if perdisk: |
- for disk, fields in rawdict.iteritems(): |
- rawdict[disk] = ntuple_disk_iostat(*fields) |
- return rawdict |
- else: |
- reads, writes, rbytes, wbytes, rtime, wtime = 0, 0, 0, 0, 0, 0 |
- for _, fields in rawdict.iteritems(): |
- reads += fields[0] |
- writes += fields[1] |
- rbytes += fields[2] |
- wbytes += fields[3] |
- rtime += fields[4] |
- wtime += fields[5] |
- return ntuple_disk_iostat(reads, writes, rbytes, wbytes, rtime, wtime) |
- |
- |
-def _deprecated(replacement): |
- # a decorator which can be used to mark functions as deprecated |
- def outer(fun): |
- def inner(*args, **kwargs): |
- msg = "psutil.%s is deprecated; use %s instead" \ |
- % (fun.__name__, replacement) |
- warnings.warn(msg, category=DeprecationWarning, stacklevel=2) |
- return fun(*args, **kwargs) |
- return inner |
- return outer |
- |
-# --- deprecated functions |
- |
-@_deprecated("psutil.phymem_usage") |
-def avail_phymem(): |
- return phymem_usage().free |
- |
-@_deprecated("psutil.phymem_usage") |
-def used_phymem(): |
- return phymem_usage().used |
- |
-@_deprecated("psutil.virtmem_usage") |
-def total_virtmem(): |
- return virtmem_usage().total |
- |
-@_deprecated("psutil.virtmem_usage") |
-def used_virtmem(): |
- return virtmem_usage().used |
- |
-@_deprecated("psutil.virtmem_usage") |
-def avail_virtmem(): |
- return virtmem_usage().free |
- |
-def test(): |
- """List info of all currently running processes emulating a |
- ps -aux output. |
- """ |
- import datetime |
- today_day = datetime.date.today() |
- |
- def get_process_info(pid): |
- proc = Process(pid) |
- user = proc.username |
- if os.name == 'nt' and '\\' in user: |
- user = user.split('\\')[1] |
- pid = proc.pid |
- cpu = round(proc.get_cpu_percent(interval=None), 1) |
- mem = round(proc.get_memory_percent(), 1) |
- rss, vsz = [x / 1024 for x in proc.get_memory_info()] |
- |
- # If process has been created today print H:M, else MonthDay |
- start = datetime.datetime.fromtimestamp(proc.create_time) |
- if start.date() == today_day: |
- start = start.strftime("%H:%M") |
- else: |
- start = start.strftime("%b%d") |
- |
- cputime = time.strftime("%M:%S", time.localtime(sum(proc.get_cpu_times()))) |
- cmd = ' '.join(proc.cmdline) |
- # where cmdline is not available UNIX shows process name between |
- # [] parentheses |
- if not cmd: |
- cmd = "[%s]" % proc.name |
- return "%-9s %-5s %-4s %4s %7s %7s %5s %8s %s" \ |
- % (user, pid, cpu, mem, vsz, rss, start, cputime, cmd) |
- |
- print "%-9s %-5s %-4s %4s %7s %7s %5s %7s %s" \ |
- % ("USER", "PID", "%CPU", "%MEM", "VSZ", "RSS", "START", "TIME", "COMMAND") |
- pids = get_pid_list() |
- pids.sort() |
- for pid in pids: |
- try: |
- line = get_process_info(pid) |
- except (AccessDenied, NoSuchProcess): |
- pass |
- else: |
- print line |
- |
-if __name__ == "__main__": |
- test() |
- |