4.1.0 - 2016-03-12
==================
**Enhancements**
- #777: [Linux] Process.open_files() on Linux return 3 new fields: position,
mode and flags.
- #779: Process.cpu_times() returns two new fields, 'children_user' and
'children_system' (always set to 0 on OSX and Windows).
- #789: [Windows] psutil.cpu_times() return two new fields: "interrupt" and
"dpc". Same for psutil.cpu_times_percent().
- #792: new psutil.cpu_stats() function returning number of CPU ctx switches
interrupts, soft interrupts and syscalls.
**Bug fixes**
- #774: [FreeBSD] net_io_counters() dropout is no longer set to 0 if the kernel
provides it.
- #776: [Linux] Process.cpu_affinity() may erroneously raise NoSuchProcess.
(patch by wxwright)
- #780: [OSX] psutil does not compile with some gcc versions.
- #786: net_if_addrs() may report incomplete MAC addresses.
- #788: [NetBSD] virtual_memory()'s buffers and shared values were set to 0.
- #790: [OSX] psutil won't compile on OSX 10.4.
4.0.0 - 2016-02-17
==================
**Enhancements**
- #523: [Linux, FreeBSD] disk_io_counters() return a new "busy_time" field.
- #660: [Windows] make.bat is smarter in finding alternative VS install
locations. (patch by mpderbec)
- #732: Process.environ(). (patch by Frank Benkstein)
- #753: [Linux, OSX, Windows] Process USS and PSS (Linux) "real" memory stats.
(patch by Eric Rahm)
- #755: Process.memory_percent() "memtype" parameter.
- #758: tests now live in psutil namespace.
- #760: expose OS constants (psutil.LINUX, psutil.OSX, etc.)
- #756: [Linux] disk_io_counters() return 2 new fields: read_merged_count and
write_merged_count.
- #762: new scripts/procsmem.py script.
**Bug fixes**
- #685: [Linux] virtual_memory() provides wrong results on systems with a lot
of physical memory.
- #704: [Solaris] psutil does not compile on Solaris sparc.
- #734: on Python 3 invalid UTF-8 data is not correctly handled for process
name(), cwd(), exe(), cmdline() and open_files() methods resulting in
UnicodeDecodeError exceptions. 'surrogateescape' error handler is now
used as a workaround for replacing the corrupted data.
- #737: [Windows] when the bitness of psutil and the target process was
different cmdline() and cwd() could return a wrong result or incorrectly
report an AccessDenied error.
- #741: [OpenBSD] psutil does not compile on mips64.
- #751: [Linux] fixed call to Py_DECREF on possible Null object.
- #754: [Linux] cmdline() can be wrong in case of zombie process.
- #759: [Linux] Process.memory_maps() may return paths ending with " (deleted)"
- #761: [Windows] psutil.boot_time() wraps to 0 after 49 days.
- #764: [NetBSD] fix compilation on NetBSD-6.x.
- #766: [Linux] net_connections() can't handle malformed /proc/net/unix file.
- #767: [Linux] disk_io_counters() may raise ValueError on 2.6 kernels and it's
broken on 2.4 kernels.
- #770: [NetBSD] disk_io_counters() metrics didn't update.
* Upstream supports NetBSD and remove local patches
Changelog:
3.4.2 - 2016-01-20
==================
**Enhancements**
- #728: [Solaris] exposed psutil.PROCFS_PATH constant to change the default
location of /proc filesystem.
**Bug fixes**
- #730: [FreeBSD] psutil.virtual_memory() crashes.
3.4.1 - 2016-01-15
==================
**Enhancements**
- #557: [NetBSD] added NetBSD support. (contributed by Ryo Onodera and
Thomas Klausner)
- #708: [Linux] psutil.net_connections() and Process.connections() on Python 2
can be up to 3x faster in case of many connections.
Also psutil.Process.memory_maps() is slightly faster.
- #718: process_iter() is now thread safe.
**Bug fixes**
- #714: [OpenBSD] virtual_memory().cached value was always set to 0.
- #715: don't crash at import time if cpu_times() fail for some reason.
- #717: [Linux] Process.open_files fails if deleted files still visible.
- #722: [Linux] swap_memory() no longer crashes if sin/sout can't be determined
due to missing /proc/vmstat.
- #724: [FreeBSD] virtual_memory().total is slightly incorrect.
* Add preliminary NetBSD support code.
It is sufficient to run letsencrypt python client on NetBSD.
Changelog:
3.3.0 - 2015-11-25
==================
**Enhancements**
- #558: [Linux] exposed psutil.PROCFS_PATH constant to change the default
location of /proc filesystem.
- #615: [OpenBSD] added OpenBSD support. (contributed by Landry Breuil)
**Bug fixes**
- #692: [UNIX] Process.name() is no longer cached as it may change.
3.2.2 - 2015-10-04
==================
**Bug fixes**
- #517: [SunOS] net_io_counters failed to detect network interfaces
correctly on Solaris 10
- #541: [FreeBSD] disk_io_counters r/w times were expressed in seconds instead
of milliseconds. (patch by dasumin)
- #610: [SunOS] fix build and tests on Solaris 10
- #623: [Linux] process or system connections raises ValueError if IPv6 is not
supported by the system.
- #678: [Linux] can't install psutil due to bug in setup.py.
- #688: [Windows] compilation fails with MSVC 2015, Python 3.5. (patch by
Mike Sarahan)
3.2.1 - 2015-09-03
==================
**Bug fixes**
- #677: [Linux] can't install psutil due to bug in setup.py.
3.2.0 - 2015-09-02
==================
**Enhancements**
- #644: [Windows] added support for CTRL_C_EVENT and CTRL_BREAK_EVENT signals
to use with Process.send_signal().
- #648: CI test integration for OSX. (patch by Jeff Tang)
- #663: [UNIX] net_if_addrs() now returns point-to-point (VPNs) addresses.
- #655: [Windows] different issues regarding unicode handling were fixed. On
Python 2 all APIs returning a string will now return an encoded version of it
by using sys.getfilesystemencoding() codec. The APIs involved are:
- psutil.net_if_addrs()
- psutil.net_if_stats()
- psutil.net_io_counters()
- psutil.Process.cmdline()
- psutil.Process.name()
- psutil.Process.username()
- psutil.users()
**Bug fixes**
- #513: [Linux] fixed integer overflow for RLIM_INFINITY.
- #641: [Windows] fixed many compilation warnings. (patch by Jeff Tang)
- #652: [Windows] net_if_addrs() UnicodeDecodeError in case of non-ASCII NIC
names.
- #655: [Windows] net_if_stats() UnicodeDecodeError in case of non-ASCII NIC
names.
- #659: [Linux] compilation error on Suse 10. (patch by maozguttman)
- #664: [Linux] compilation error on Alpine Linux. (patch by Bart van Kleef)
- #670: [Windows] segfgault of net_if_addrs() in case of non-ASCII NIC names.
(patch by sk6249)
- #672: [Windows] compilation fails if using Windows SDK v8.0. (patch by
Steven Winfield)
- #675: [Linux] net_connections(); UnicodeDecodeError may occur when listing
UNIX sockets.
3.1.1 - 2015-07-15
==================
**Bug fixes**
- #603: [Linux] ionice_set value range is incorrect. (patch by spacewander)
- #645: [Linux] psutil.cpu_times_percent() may produce negative results.
- #656: 'from psutil import *' does not work.
3.1.0 - 2015-07-15
==================
**Enhancements**
- #534: [Linux] disk_partitions() added support for ZFS filesystems.
- #646: continuous tests integration for Windows with
https://ci.appveyor.com/project/giampaolo/psutil.
- #647: new dev guide:
https://github.com/giampaolo/psutil/blob/master/DEVGUIDE.rst
- #651: continuous code quality test integration with
https://scrutinizer-ci.com/g/giampaolo/psutil/
**Bug fixes**
- #340: [Windows] Process.open_files() no longer hangs. Instead it uses a
thred which times out and skips the file handle in case it's taking too long
to be retrieved. (patch by Jeff Tang, PR #597)
- #627: [Windows] Process.name() no longer raises AccessDenied for pids owned
by another user.
- #636: [Windows] Process.memory_info() raise AccessDenied.
- #637: [UNIX] raise exception if trying to send signal to Process PID 0 as it
will affect os.getpid()'s process group instead of PID 0.
- #639: [Linux] Process.cmdline() can be truncated.
- #640: [Linux] *connections functions may swallow errors and return an
incomplete list of connnections.
- #642: repr() of exceptions is incorrect.
- #653: [Windows] Add inet_ntop function for Windows XP to support IPv6.
- #641: [Windows] Replace deprecated string functions with safe equivalents.
3.0.1 - 2015-06-18
==================
**Bug fixes**
- #632: [Linux] better error message if cannot parse process UNIX connections.
- #634: [Linux] Proces.cmdline() does not include empty string arguments.
- #635: [UNIX] crash on module import if 'enum' package is installed on python
< 3.4.
3.0.0 - 2015-06-13
==================
**Enhancements**
- #250: new psutil.net_if_stats() returning NIC statistics (isup, duplex,
speed, MTU).
- #376: new psutil.net_if_addrs() returning all NIC addresses a-la ifconfig.
- #469: on Python >= 3.4 ``IOPRIO_CLASS_*`` and ``*_PRIORITY_CLASS`` constants
returned by psutil.Process' ionice() and nice() methods are enums instead of
plain integers.
- #581: add .gitignore. (patch by Gabi Davar)
- #582: connection constants returned by psutil.net_connections() and
psutil.Process.connections() were turned from int to enums on Python > 3.4.
- #587: Move native extension into the package.
- #589: Process.cpu_affinity() accepts any kind of iterable (set, tuple, ...),
not only lists.
- #594: all deprecated APIs were removed.
- #599: [Windows] process name() can now be determined for all processes even
when running as a limited user.
- #602: pre-commit GIT hook.
- #629: enhanced support for py.test and nose test discovery and tests run.
- #616: [Windows] Add inet_ntop function for Windows XP.
**Bug fixes**
- #428: [all UNIXes except Linux] correct handling of zombie processes;
introduced new ZombieProcess exception class.
- #512: [BSD] fix segfault in net_connections().
- #555: [Linux] psutil.users() correctly handles ":0" as an alias for
"localhost"
- #579: [Windows] Fixed open_files() for PID>64K.
- #579: [Windows] fixed many compiler warnings.
- #585: [FreeBSD] net_connections() may raise KeyError.
- #586: [FreeBSD] cpu_affinity() segfaults on set in case an invalid CPU
number is provided.
- #593: [FreeBSD] Process().memory_maps() segfaults.
- #606: Process.parent() may swallow NoSuchProcess exceptions.
- #611: [SunOS] net_io_counters has send and received swapped
- #614: [Linux]: cpu_count(logical=False) return the number of physical CPUs
instead of physical cores.
- #618: [SunOS] swap tests fail on Solaris when run as normal user
- #628: [Linux] Process.name() truncates process name in case it contains
spaces or parentheses.
2.2.1 - 2015-02-02
==================
**Bug fixes**
- #496: [Linux] fix "ValueError: ambiguos inode with multiple PIDs references"
(patch by Bruno Binet)
2.2.0 - 2015-01-06
==================
**Enhancements**
- #521: drop support for Python 2.4 and 2.5.
- #553: new examples/pstree.py script.
- #564: C extension version mismatch in case the user messed up with psutil
installation or with sys.path is now detected at import time.
- #568: New examples/pidof.py script.
- #569: [FreeBSD] add support for process CPU affinity.
**Bug fixes**
- #496: [Solaris] can't import psutil.
- #547: [UNIX] Process.username() may raise KeyError if UID can't be resolved.
- #551: [Windows] get rid of the unicode hack for net_io_counters() NIC names.
- #556: [Linux] lots of file handles were left open.
- #561: [Linux] net_connections() might skip some legitimate UNIX sockets.
(patch by spacewander)
- #565: [Windows] use proper encoding for psutil.Process.username() and
psutil.users(). (patch by Sylvain Mouquet)
- #567: [Linux] in the alternative implementation of CPU affinity PyList_Append
and Py_BuildValue return values are not checked.
- #569: [FreeBSD] fix memory leak in psutil.cpu_count(logical=False).
- #571: [Linux] Process.open_files() might swallow AccessDenied exceptions and
return an incomplete list of open files.
Problems found with existing digests:
Package memconf distfile memconf-2.16/memconf.gz
b6f4b736cac388dddc5070670351cf7262aba048 [recorded]
95748686a5ad8144232f4d4abc9bf052721a196f [calculated]
Problems found locating distfiles:
Package dc-tools: missing distfile dc-tools/abs0-dc-burn-netbsd-1.5-0-gae55ec9
Package ipw-firmware: missing distfile ipw2100-fw-1.2.tgz
Package iwi-firmware: missing distfile ipw2200-fw-2.3.tgz
Package nvnet: missing distfile nvnet-netbsd-src-20050620.tgz
Package syslog-ng: missing distfile syslog-ng-3.7.2.tar.gz
Otherwise, existing SHA1 digests verified and found to be the same on
the machine holding the existing distfiles (morden). All existing
SHA1 digests retained for now as an audit trail.
2.1.2 - 2014-09-21
==================
**Enhancements**
- #407: project moved from Google Code to Github; code moved from Mercurial
to Git.
- #492: use tox to run tests on multiple python versions. (patch by msabramo)
- #505: [Windows] distribution as wheel packages.
- #511: new examples/ps.py sample code.
**Bug fixes**
- #340: [Windows] Process.get_open_files() no longer hangs. (patch by
Jeff Tang)
- #501: [Windows] disk_io_counters() may return negative values.
- #503: [Linux] in rare conditions Process exe(), open_files() and
connections() methods can raise OSError(ESRCH) instead of NoSuchProcess.
- #504: [Linux] can't build RPM packages via setup.py
- #506: [Linux] python 2.4 support was broken.
- #522: [Linux] Process.cpu_affinity() might return EINVAL. (patch by David
Daeschler)
- #529: [Windows] Process.exe() may raise unhandled WindowsError exception
for PIDs 0 and 4. (patch by Jeff Tang)
- #530: [Linux] psutil.disk_io_counters() may crash on old Linux distros
(< 2.6.5) (patch by Yaolong Huang)
- #533: [Linux] Process.memory_maps() may raise TypeError on old Linux distros.
2.1.0 - 2014-04-08
------------------
ENHANCEMENTS
* 387: system-wide open connections a-la netstat.
BUG FIXES
* 421: [Solaris] psutil does not compile on SunOS 5.10 (patch by Naveed
Roudsari)
* 489: [Linux] psutil.disk_partitions() return an empty list.
2.0.0 - 2014-03-10
------------------
ENHANCEMENTS
* #424: [Windows] installer for Python 3.X 64 bit.
* #427: number of logical and physical CPUs (psutil.cpu_count()).
* #447: psutil.wait_procs() timeout parameter is now optional.
* #452: make Process instances hashable and usable with set()s.
* #453: tests on Python < 2.7 require unittest2 module.
* #459: add a make file for running tests and other repetitive tasks (also
on Windows).
* #463: make timeout parameter of cpu_percent* functions default to 0.0 'cause
it's a common trap to introduce slowdowns.
* #468: move documentation to readthedocs.com.
* #477: process cpu_percent() is about 30% faster. (suggested by crusaderky)
* #478: [Linux] almost all APIs are about 30% faster on Python 3.X.
* #479: long deprecated psutil.error module is gone; exception classes now
live in "psutil" namespace only.
BUG FIXES
* #193: psutil.Popen constructor can throw an exception if the spawned process
terminates quickly.
* #340: [Windows] process get_open_files() no longer hangs. (patch by
jtang@vahna.net)
* #443: [Linux] fix a potential overflow issue for Process.set_cpu_affinity()
on systems with more than 64 CPUs.
* #448: [Windows] get_children() and ppid() memory leak (patch by Ulrich
Klank).
* #457: [POSIX] pid_exists() always returns True for PID 0.
* #461: namedtuples are not pickle-able.
* #466: [Linux] process exe improper null bytes handling. (patch by
Gautam Singh)
* #470: wait_procs() might not wait. (patch by crusaderky)
* #471: [Windows] process exe improper unicode handling. (patch by
alex@mroja.net)
* #473: psutil.Popen.wait() does not set returncode attribute.
* #474: [Windows] Process.cpu_percent() is no longer capped at 100%.
* #476: [Linux] encoding error for process name and cmdline.
API CHANGES
For the sake of consistency a lot of psutil APIs have been renamed.
In most cases accessing the old names will work but it will cause a DeprecationWarning.
* psutil.* module level constants have being replaced by functions:
---------------------------------------------------------
| Old name | Replacement |
---------------------------------------------------------
| - psutil.NUM_CPUS | psutil.cpu_cpunt() |
| - psutil.BOOT_TIME | psutil.boot_time() |
| - psutil.TOTAL_PHYMEM | psutil.virtual_memory().total |
---------------------------------------------------------
* Renamed psutil.* functions:
-----------------------------------------------
| Old name | Replacement |
-----------------------------------------------
| - psutil.get_pid_list() | psutil.pids() |
| - psutil.get_users() | psutil.users() |
| - psutil.get_boot_time() | psutil.boot_time() |
-----------------------------------------------
* All psutil.Process get_* methods lost the "get_" prefix.
get_ext_memory_info() renamed to memory_info_ex().
Assuming "p = psutil.Process()":
-------------------------------------------------
| Old name | Replacement |
-------------------------------------------------
| p.get_children() | p.children() |
| p.get_connections() | p.connections() |
| p.get_cpu_affinity() | p.cpu_affinity() |
| p.get_cpu_percent() | p.cpu_percent() |
| p.get_cpu_times() | p.cpu_times() |
| p.get_ext_memory_info() | p.memory_info_ex() |
| p.get_io_counters() | p.io_counters() |
| p.get_ionice() | p.ionice() |
| p.get_memory_info() | p.memory_info() |
| p.get_memory_maps() | p.memory_maps() |
| p.get_memory_percent() | p.memory_percent() |
| p.get_nice() | p.nice() |
| p.get_num_ctx_switches() | p.num_ctx_switches() |
| p.get_num_fds() | p.num_fds() |
| p.get_num_threads() | p.num_threads() |
| p.get_open_files() | p.open_files() |
| p.get_rlimit() | p.rlimit() |
| p.get_threads() | p.threads() |
| p.getcwd() | p.cwd() |
-------------------------------------------------
* All psutil.Process set_* methods lost the "set_" prefix.
Assuming "p = psutil.Process()":
--------------------------------------------------------
| Old name | Replacement |
--------------------------------------------------------
| p.set_nice() | p.nice(value) |
| p.set_ionice() | p.ionice(ioclass, value=None) |
| p.set_cpu_affinity() | p.cpu_affinity(cpus) |
| p.set_rlimit() | p.rlimit(resource, limits=None) |
--------------------------------------------------------
* Except for 'pid' all psutil.Process class properties have been turned into
methods. This is the only case which there are no aliases.
Assuming "p = psutil.Process()":
---------------------------------
| Old name | Replacement |
---------------------------------
| p.name | p.name() |
| p.parent | p.parent() |
| p.ppid | p.ppid() |
| p.exe | p.exe() |
| p.cmdline | p.cmdline() |
| p.status | p.status() |
| p.uids | p.uids() |
| p.gids | p.gids() |
| p.username | p.username() |
| p.create_time | p.create_time() |
---------------------------------
* Others:
* timeout parameter of cpu_percent* functions defaults to 0.0 instead of 0.1.
* long deprecated psutil.error module is gone; exception classes now live in
"psutil" namespace only.
* Process instances' "retcode" attribute returned by psutil.wait_procs() has
been renamed to "returncode" for consistency with subprocess.Popen.
either because they themselves are not ready or because a
dependency isn't. This is annotated by
PYTHON_VERSIONS_INCOMPATIBLE= 33 # not yet ported as of x.y.z
or
PYTHON_VERSIONS_INCOMPATIBLE= 33 # py-foo, py-bar
respectively, please use the same style for other packages,
and check during updates.
Use versioned_dependencies.mk where applicable.
Use REPLACE_PYTHON instead of handcoded alternatives, where applicable.
Reorder Makefile sections into standard order, where applicable.
Remove PYTHON_VERSIONS_INCLUDE_3X lines since that will be default
with the next commit.
Whitespace cleanups and other nits corrected, where necessary.
1.2.1 - 2013-11-25
------------------
BUG FIXES
* #348: [Windows XP] fixed "ImportError: DLL load failed" occurring on module
import.
* #425: [Solaris] crash on import due to failure at determining BOOT_TIME.
* #443: [Linux] can't set CPU affinity on systems with more than 64 cores.
1.2.0 - 2013-11-20
------------------
ENHANCEMENTS
* #439: assume os.getpid() if no argument is passed to psutil.Process
constructor.
* #440: new psutil.wait_procs() utility function which waits for multiple
processes to terminate.
BUG FIXES
* #348: [Windows XP/Vista] fixed "ImportError: DLL load failed" occurring on
module import.
1.1.3 - 2013-11-07
------------------
BUG FIXES
* #442: [Linux] psutil won't compile on certain version of Linux because of
missing prlimit(2) syscall.
1.1.2 - 2013-10-22
------------------
BUG FIXES
* #442: [Linux] psutil won't compile on Debian 6.0 because of missing
prlimit(2) syscall.
1.1.1 - 2013-10-08
------------------
BUG FIXES
* #438: [Linux] psutil won't compile on kernels < 2.6.36 due to missing
prlimit(2) syscall.
1.1.0 - 2013-09-28
------------------
ENHANCEMENTS
* #410: tar.gz and windows binary files are now hosted on PYPI.
* #412: [Linux] get/set process resource limits.
* #415: [Windows] Process.get_children() is an order of magnitude faster.
* #426: [Windows] Process.name is an order of magnitude faster.
* #431: [UNIX] Process.name is slightly faster because it unnecessarily
retrieved also process cmdline.
BUG FIXES
* #391: [Windows] psutil.cpu_times_percent() returns negative percentages.
* #408: STATUS_* and CONN_* constants don't properly serialize on JSON.
* #411: [Windows] examples/disk_usage.py may pop-up a GUI error.
* #413: [Windows] Process.get_memory_info() leaks memory.
* #414: [Windows] Process.exe on Windows XP may raise ERROR_INVALID_PARAMETER.
* #416: psutil.disk_usage() doesn't work well with unicode path names.
* #430: [Linux] process IO counters report wrong number of r/w syscalls.
* #435: [Linux] psutil.net_io_counters() might report erreneous NIC names.
* #436: [Linux] psutil.net_io_counters() reports a wrong 'dropin' value.
API CHANGES
* #408: STATUS_* and CONN_* constants (returned by Process' status() and
get_connections() methods respectively) have been turned from constant
objects to plain Python strings.
util is a module providing an interface for retrieving information,
on all running processes and system utilization (CPU, memory, disks,
network, users) in a portable way by using Python, implementing
many functionalities offered by command line tools such as ps, top,
df, netstat, who, kill, uptime, free, lsof, ifconfig, nice, ionice,
iostat, iotop, pidof, tty, taskset, or pmap.
Ported to NetBSD by tron & myself, but more work to do.