summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/build.yml6
-rw-r--r--HISTORY.rst3417
-rw-r--r--psutil/arch/osx/process_info.c5
-rwxr-xr-xpsutil/tests/test_process.py6
4 files changed, 2278 insertions, 1156 deletions
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 5fd6e735..d8940cd0 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -29,7 +29,7 @@ jobs:
fail-fast: false
matrix:
# os: [ubuntu-latest, macos-latest, windows-latest]
- os: [ubuntu-latest, macos-latest]
+ os: [ubuntu-latest, macos-10.15]
include:
- {name: Linux, python: '3.9', os: ubuntu-latest}
env:
@@ -128,7 +128,7 @@ jobs:
python scripts/internal/print_hashes.py wheelhouse/
freebsd:
- runs-on: macos-latest
+ runs-on: macos-10.15
steps:
- name: Cancel previous runs
uses: styfle/cancel-workflow-action@0.6.0
@@ -139,7 +139,7 @@ jobs:
- name: Run tests
id: test
- uses: vmactions/freebsd-vm@v0.1.4
+ uses: vmactions/freebsd-vm@v0.1.5
with:
usesh: true
prepare: pkg install -y gcc python3
diff --git a/HISTORY.rst b/HISTORY.rst
index 37ee57f1..ae2a584e 100644
--- a/HISTORY.rst
+++ b/HISTORY.rst
@@ -7,54 +7,57 @@ XXXX-XX-XX
**Enhancements**
-- 1851_: [Linux] cpu_freq() is slow on systems with many CPUs. Read current
- frequency values for all CPUs from /proc/cpuinfo instead of opening many
- files in /sys fs. (patch by marxin)
-- 1992_: NoSuchProcess message now specifies if the PID has been reused.
-- 1992_: error classes (NoSuchProcess, AccessDenied, etc.) now have a better
- formatted and separated `__repr__` and `__str__` implementations.
-- 1996_: add support for MidnightBSD. (patch by Saeed Rasooli)
-- 1999_: [Linux] disk_partitions(): convert "/dev/root" device (an alias used
- on some Linux distros) to real root device path.
-- 2005_: PSUTIL_DEBUG mode now prints file name and line number of the debug
+- 1851_, [Linux]: `cpu_freq()`_ is slow on systems with many CPUs. Read current
+ frequency values for all CPUs from ``/proc/cpuinfo`` instead of opening many
+ files in ``/sys`` fs. (patch by marxin)
+- 1992_: `NoSuchProcess`_ message now specifies if the PID has been reused.
+- 1992_: error classes (`NoSuchProcess`_, `AccessDenied`_, etc.) now have a better
+ formatted and separated ``__repr__`` and ``__str__`` implementations.
+- 1996_, [BSD]: add support for MidnightBSD. (patch by Saeed Rasooli)
+- 1999_, [Linux]: `disk_partitions()`_: convert ``/dev/root`` device (an alias
+ used on some Linux distros) to real root device path.
+- 2005_: ``PSUTIL_DEBUG`` mode now prints file name and line number of the debug
messages coming from C extension modules.
+- 2042_: rewrite HISTORY.rst to use hyperlinks pointing to psutil API doc.
**Bug fixes**
-- 1456_: [macOS] psutil.cpu_freq()'s min and max are set to 0 if can't be
- determined (instead of crashing).
-- 1512_: [macOS] sometimes Process.connections() will crash with EOPNOTSUPP
- for one connection; this is now ignored.
-- 1598_: [Windows] psutil.disk_partitions() only returns mountpoints on drives
- where it first finds one
-- 1874_: [Solaris] swap output error due to incorrect range.
-- 1892_: [macOS] psutil.cpu_freq() broken on Apple M1.
-- 1901_: [macOS] different functions, especially process' open_files() and
- connections() methods, could randomly raise AccessDenied because the internal
- buffer of `proc_pidinfo(PROC_PIDLISTFDS)` syscall was not big enough. We now
- dynamically increase the buffer size until it's big enough instead of giving
- up and raising AccessDenied, which was a fallback to avoid crashing.
-- 1904_: [Windows] OpenProcess fails with ERROR_SUCCESS due to GetLastError()
- called after sprintf(). (patch by alxchk)
-- 1913_: [Linux] wait_procs seemingly ignoring timeout, TimeoutExpired thrown
-- 1919_: [Linux] sensors_battery() can raise TypeError on PureOS.
-- 1921_: [Windows] psutil.swap_memory() shows committed memory instead of swap
-- 1940_: [Linux] psutil does not handle ENAMETOOLONG when accessing process
+- 1456_, [macOS], **[critical]**: `cpu_freq()`_ ``min`` and ``max`` are set to
+ 0 if can't be determined (instead of crashing).
+- 1512_, [macOS]: sometimes `Process.connections()`_ will crash with
+ ``EOPNOTSUPP`` for one connection; this is now ignored.
+- 1598_, [Windows]: `disk_partitions()`_ only returns mountpoints on drives
+ where it first finds one.
+- 1874_, [SunOS]: swap output error due to incorrect range.
+- 1892_, [macOS]: `cpu_freq()`_ broken on Apple M1.
+- 1901_, [macOS]: different functions, especially `Process.open_files()`_ and
+ `Process.connections()`_, could randomly raise `AccessDenied`_ because the
+ internal buffer of ``proc_pidinfo(PROC_PIDLISTFDS)`` syscall was not big enough.
+ We now dynamically increase the buffer size until it's big enough instead of
+ giving up and raising `AccessDenied`_, which was a fallback to avoid crashing.
+- 1904_, [Windows]: ``OpenProcess`` fails with ``ERROR_SUCCESS`` due to
+ ``GetLastError()`` called after ``sprintf()``. (patch by alxchk)
+- 1913_, [Linux]: `wait_procs()`_ should catch ``subprocess.TimeoutExpired``
+ exception.
+- 1919_, [Linux]: `sensors_battery()`_ can raise ``TypeError`` on PureOS.
+- 1921_, [Windows]: `swap_memory()`_ shows committed memory instead of swap.
+- 1940_, [Linux]: psutil does not handle ``ENAMETOOLONG`` when accessing process
file descriptors in procfs. (patch by Nikita Radchenko)
-- 1948_: Process' memoize_when_activated decorator was not thread-safe. (patch
- by Xuehai Pan)
-- 1953_: [Windows] disk_partitions() crashes due to insufficient buffer len.
- (patch by MaWe2019)
-- 1965_: [Windows] fix "Fatal Python error: deallocating None" when calling
- psutil.users() multiple times.
-- 1980_: [Windows] 32bit / WOW64 processes fails to read process name longer
- than 128 characters resulting in AccessDenied. This is now fixed. (patch
+- 1948_, **[critical]**: ``memoize_when_activated`` decorator is not thread-safe.
+ (patch by Xuehai Pan)
+- 1953_, [Windows], **[critical]**: `disk_partitions()`_ crashes due to
+ insufficient buffer len. (patch by MaWe2019)
+- 1965_, [Windows], **[critical]**: fix "Fatal Python error: deallocating None"
+ when calling `users()`_ multiple times.
+- 1980_, [Windows]: 32bit / WoW64 processes fails to read `Process.name()`_ longer
+ than 128 characters resulting in `AccessDenied`_. This is now fixed. (patch
by PetrPospisil)
-- 1991_: process_iter() can raise TypeError if invoked from multiple threads
- (not thread-safe).
-- 1956_: [macOS] Process.cpu_times() reports incorrect timings on M1 machines.
+- 1991_, **[critical]**: `process_iter()`_ is not thread safe and can raise
+ ``TypeError`` if invoked from multiple threads.
+- 1956_, [macOS]: `Process.cpu_times()`_ reports incorrect timings on M1 machines.
(patch by Olivier Dormond)
-- 2023_: [Linux] cpu_freq() return order is wrong on systems with > 9 CPUs.
+- 2023_, [Linux]: `cpu_freq()`_ return order is wrong on systems with more than
+ 9 CPUs.
5.8.0
=====
@@ -63,9 +66,9 @@ XXXX-XX-XX
**Enhancements**
-- 1863_: `disk_partitions()` exposes 2 extra fields: `maxfile` and `maxpath`,
+- 1863_: `disk_partitions()`_ exposes 2 extra fields: ``maxfile`` and ``maxpath``,
which are the maximum file name and path name length.
-- 1872_: [Windows] added support for PyPy 2.7.
+- 1872_, [Windows]: added support for PyPy 2.7.
- 1879_: provide pre-compiled wheels for Linux and macOS (yey!).
- 1880_: get rid of Travis and Cirrus CI services (they are no longer free).
CI testing is now done by GitHub Actions on Linux, macOS and FreeBSD (yes).
@@ -73,20 +76,25 @@ XXXX-XX-XX
**Bug fixes**
-- 1708_: [Linux] get rid of sensors_temperatures() duplicates. (patch by Tim
+- 1708_, [Linux]: get rid of `sensors_temperatures()`_ duplicates. (patch by Tim
Schlueter).
-- 1839_: [Windows] always raise AccessDenied when failing to query 64 processes
- from 32 bit ones (NtWoW64 APIs).
-- 1866_: [Windows] process exe(), cmdline(), environ() may raise "invalid
- access to memory location" on Python 3.9.
-- 1874_: [Solaris] wrong swap output given when encrypted column is present.
-- 1875_: [Windows] process username() may raise ERROR_NONE_MAPPED if the SID
- has no corresponding account name. In this case AccessDenied is now raised.
-- 1877_: [Windows] OpenProcess may fail with ERROR_SUCCESS. Turn it into
- AccessDenied or NoSuchProcess depending on whether the PID is alive.
-- 1886_: [macOS] EIO error may be raised on cmdline() and environment(). Now
- it gets translated into AccessDenied.
-- 1891_: [macOS] get rid of deprecated getpagesize().
+- 1839_, [Windows], **[critical]**: always raise `AccessDenied`_ instead of
+ ``WindowsError`` when failing to query 64 processes from 32 bit ones by using
+ ``NtWoW64`` APIs.
+- 1866_, [Windows], **[critical]**: `Process.exe()`_, `Process.cmdline()`_,
+ `Process.environ()`_ may raise "[WinError 998] Invalid access to memory
+ location" on Python 3.9 / VS 2019.
+- 1874_, [SunOS]: wrong swap output given when encrypted column is present.
+- 1875_, [Windows], **[critical]**: `Process.username()`_ may raise
+ ``ERROR_NONE_MAPPED`` if the SID has no corresponding account name. In this
+ case `AccessDenied`_ is now raised.
+- 1886_, [macOS]: ``EIO`` error may be raised on `Process.cmdline()`_ and
+ `Process.environ()`_. Now it gets translated into `AccessDenied`_.
+- 1887_, [Windows], **[critical]**: ``OpenProcess`` may fail with
+ "[WinError 0] The operation completed successfully"."
+ Turn it into `AccessDenied`_ or `NoSuchProcess`_ depending on whether the
+ PID is alive.
+- 1891_, [macOS]: get rid of deprecated ``getpagesize()``.
5.7.3
=====
@@ -95,24 +103,24 @@ XXXX-XX-XX
**Enhancements**
-- 809_: [FreeBSD] add support for `Process.rlimit()`.
-- 893_: [BSD] add support for `Process.environ()` (patch by Armin Gruner)
-- 1830_: [UNIX] `net_if_stats()`'s `isup` also checks whether the NIC is
+- 809_, [FreeBSD]: add support for `Process.rlimit()`_.
+- 893_, [BSD]: add support for `Process.environ()`_ (patch by Armin Gruner)
+- 1830_, [POSIX]: `net_if_stats()`_ ``isup`` also checks whether the NIC is
running (meaning Wi-Fi or ethernet cable is connected). (patch by Chris Burger)
-- 1837_: [Linux] improved battery detection and charge "secsleft" calculation
+- 1837_, [Linux]: improved battery detection and charge ``secsleft`` calculation
(patch by aristocratos)
**Bug fixes**
-- 1620_: [Linux] cpu_count(logical=False) result is incorrect on systems with
- more than one CPU socket. (patch by Vincent A. Arcila)
-- 1738_: [macOS] Process.exe() may raise FileNotFoundError if process is still
+- 1620_, [Linux]: `cpu_count()`_ with ``logical=False`` result is incorrect on
+ systems with more than one CPU socket. (patch by Vincent A. Arcila)
+- 1738_, [macOS]: `Process.exe()`_ may raise ``FileNotFoundError`` if process is still
alive but the exe file which launched it got deleted.
-- 1791_: [macOS] fix missing include for getpagesize().
-- 1823_: [Windows] Process.open_files() may cause a segfault due to a NULL
- pointer.
-- 1838_: [Linux] sensors_battery(): if `percent` can be determined but not
- the remaining values, still return a result instead of None.
+- 1791_, [macOS]: fix missing include for ``getpagesize()``.
+- 1823_, [Windows], **[critical]**: `Process.open_files()`_ may cause a segfault
+ due to a NULL pointer.
+- 1838_, [Linux]: `sensors_battery()`_: if `percent` can be determined but not
+ the remaining values, still return a result instead of ``None``.
(patch by aristocratos)
5.7.2
@@ -131,35 +139,28 @@ XXXX-XX-XX
**Enhancements**
-- 1729_: parallel tests on UNIX (make test-parallel). They're twice as fast!
-- 1741_: "make build/install" is now run in parallel and it's about 15% faster
- on UNIX.
-- 1747_: `Process.wait()` on POSIX returns an enum, showing the negative signal
- which was used to terminate the process::
- >>> import psutil
- >>> p = psutil.Process(9891)
- >>> p.terminate()
- >>> p.wait()
- <Negsignal.SIGTERM: -15>
-- 1747_: `Process.wait()` return value is cached so that the exit code can be
+- 1729_: parallel tests on POSIX (``make test-parallel``). They're twice as fast!
+- 1741_, [POSIX]: ``make build`` now runs in parallel on Python >= 3.6 and
+ it's about 15% faster.
+- 1747_: `Process.wait()`_ return value is cached so that the exit code can be
retrieved on then next call.
-- 1747_: Process provides more info about the process on str() and repr()
- (status and exit code)::
- >>> proc
- psutil.Process(pid=12739, name='python3', status='terminated',
- exitcode=<Negsigs.SIGTERM: -15>, started='15:08:20')
+- 1747_, [POSIX]: `Process.wait()`_ on POSIX now returns an enum, showing the
+ negative signal which was used to terminate the process. It returns something
+ like ``<Negsignal.SIGTERM: -15>``.
+- 1747_: `Process`_ class provides more info about the process on ``str()``
+ and ``repr()`` (status and exit code).
- 1757_: memory leak tests are now stable.
-- 1768_: [Windows] added support for Windows Nano Server. (contributed by
+- 1768_, [Windows]: added support for Windows Nano Server. (contributed by
Julien Lebot)
**Bug fixes**
-- 1726_: [Linux] cpu_freq() parsing should use spaces instead of tabs on ia64.
+- 1726_, [Linux]: `cpu_freq()`_ parsing should use spaces instead of tabs on ia64.
(patch by Michał Górny)
-- 1760_: [Linux] Process.rlimit() does not handle long long type properly.
-- 1766_: [macOS] NoSuchProcess may be raised instead of ZombieProcess.
-- 1781_: fix signature of callback function for getloadavg(). (patch by
- Ammar Askar)
+- 1760_, [Linux]: `Process.rlimit()`_ does not handle long long type properly.
+- 1766_, [macOS]: `NoSuchProcess`_ may be raised instead of `ZombieProcess`_.
+- 1781_, **[critical]**: `getloadavg()`_ can crash the Python interpreter.
+ (patch by Ammar Askar)
5.7.0
=====
@@ -168,42 +169,44 @@ XXXX-XX-XX
**Enhancements**
-- 1637_: [SunOS] add partial support for old SunOS 5.10 Update 0 to 3.
-- 1648_: [Linux] sensors_temperatures() looks into an additional /sys/device/
- directory for additional data. (patch by Javad Karabi)
-- 1652_: [Windows] dropped support for Windows XP and Windows Server 2003.
+- 1637_, [SunOS]: add partial support for old SunOS 5.10 Update 0 to 3.
+- 1648_, [Linux]: `sensors_temperatures()`_ looks into an additional
+ ``/sys/device/`` directory for additional data. (patch by Javad Karabi)
+- 1652_, [Windows]: dropped support for Windows XP and Windows Server 2003.
Minimum supported Windows version now is Windows Vista.
-- 1671_: [FreeBSD] add CI testing/service for FreeBSD (Cirrus CI).
-- 1677_: [Windows] process exe() will succeed for all process PIDs (instead of
- raising AccessDenied).
-- 1679_: [Windows] net_connections() and Process.connections() are 10% faster.
-- 1682_: [PyPy] added CI / test integration for PyPy via Travis.
-- 1686_: [Windows] added support for PyPy on Windows.
-- 1693_: [Windows] boot_time(), Process.create_time() and users()'s login time
- now have 1 micro second precision (before the precision was of 1 second).
+- 1671_, [FreeBSD]: add CI testing/service for FreeBSD (Cirrus CI).
+- 1677_, [Windows]: `Process.exe()`_ will succeed for all process PIDs (instead of
+ raising `AccessDenied`_).
+- 1679_, [Windows]: `net_connections()`_ and `Process.connections()`_ are 10% faster.
+- 1682_, [PyPy]: added CI / test integration for PyPy via Travis.
+- 1686_, [Windows]: added support for PyPy on Windows.
+- 1693_, [Windows]: `boot_time()`_, `Process.create_time()`_ and `users()`_'s
+ login time now have 1 micro second precision (before the precision was of 1
+ second).
**Bug fixes**
-- 1538_: [NetBSD] process cwd() may return ENOENT instead of NoSuchProcess.
-- 1627_: [Linux] Process.memory_maps() can raise KeyError.
-- 1642_: [SunOS] querying basic info for PID 0 results in FileNotFoundError.
-- 1646_: [FreeBSD] many Process methods may cause a segfault on FreeBSD 12.0
- due to a backward incompatible change in a C type introduced in 12.0.
-- 1656_: [Windows] Process.memory_full_info() raises AccessDenied even for the
+- 1538_, [NetBSD]: `Process.cwd()`_ may return ``ENOENT`` instead of `NoSuchProcess`_.
+- 1627_, [Linux]: `Process.memory_maps()`_ can raise ``KeyError``.
+- 1642_, [SunOS]: querying basic info for PID 0 results in ``FileNotFoundError``.
+- 1646_, [FreeBSD], **[critical]**: many `Process`_ methods may cause a segfault
+ due to a backward incompatible change in a C type on FreeBSD 12.0.
+- 1656_, [Windows]: `Process.memory_full_info()`_ raises `AccessDenied`_ even for the
current user and os.getpid().
-- 1660_: [Windows] Process.open_files() complete rewrite + check of errors.
-- 1662_: [Windows] process exe() may raise WinError 0.
-- 1665_: [Linux] disk_io_counters() does not take into account extra fields
+- 1660_, [Windows]: `Process.open_files()`_ complete rewrite + check of errors.
+- 1662_, [Windows], **[critical]**: `Process.exe()`_ may raise "[WinError 0]
+ The operation completed successfully".
+- 1665_, [Linux]: `disk_io_counters()`_ does not take into account extra fields
added to recent kernels. (patch by Mike Hommey)
- 1672_: use the right C type when dealing with PIDs (int or long). Thus far
(long) was almost always assumed, which is wrong on most platforms.
-- 1673_: [OpenBSD] Process connections(), num_fds() and threads() returned
- improper exception if process is gone.
-- 1674_: [SunOS] disk_partitions() may raise OSError.
-- 1684_: [Linux] disk_io_counters() may raise ValueError on systems not
- having /proc/diskstats.
-- 1695_: [Linux] could not compile on kernels <= 2.6.13 due to
- PSUTIL_HAVE_IOPRIO not being defined. (patch by Anselm Kruis)
+- 1673_, [OpenBSD]: `Process.connections()`_, `Process.num_fds()`_ and
+ `Process.threads()`_ returned improper exception if process is gone.
+- 1674_, [SunOS]: `disk_partitions()`_ may raise ``OSError``.
+- 1684_, [Linux]: `disk_io_counters()`_ may raise ``ValueError`` on systems not
+ having ``/proc/diskstats``.
+- 1695_, [Linux]: could not compile on kernels <= 2.6.13 due to
+ ``PSUTIL_HAVE_IOPRIO`` not being defined. (patch by Anselm Kruis)
5.6.7
=====
@@ -212,7 +215,8 @@ XXXX-XX-XX
**Bug fixes**
-- 1630_: [Windows] can't compile source distribution due to C syntax error.
+- 1630_, [Windows], **[critical]**: can't compile source distribution due to C
+ syntax error.
5.6.6
=====
@@ -221,14 +225,14 @@ XXXX-XX-XX
**Bug fixes**
-- 1179_: [Linux] Process cmdline() now takes into account misbehaving processes
+- 1179_, [Linux]: `Process.cmdline()`_ now takes into account misbehaving processes
renaming the command line and using inappropriate chars to separate args.
-- 1616_: use of Py_DECREF instead of Py_CLEAR will result in double free and
- segfault
+- 1616_, **[critical]**: use of ``Py_DECREF`` instead of ``Py_CLEAR`` will
+ result in double ``free()`` and segfault
(`CVE-2019-18874 <https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-18874>`__).
(patch by Riccardo Schirone)
-- 1619_: [OpenBSD] compilation fails due to C syntax error. (patch by Nathan
- Houghton)
+- 1619_, [OpenBSD], **[critical]**: compilation fails due to C syntax error.
+ (patch by Nathan Houghton)
5.6.5
=====
@@ -237,7 +241,7 @@ XXXX-XX-XX
**Bug fixes**
-- 1615_: remove pyproject.toml as it was causing installation issues.
+- 1615_: remove ``pyproject.toml`` as it was causing installation issues.
5.6.4
=====
@@ -246,31 +250,33 @@ XXXX-XX-XX
**Enhancements**
-- 1527_: [Linux] added Process.cpu_times().iowait counter, which is the time
- spent waiting for blocking I/O to complete.
+- 1527_, [Linux]: added `Process.cpu_times()`_ ``iowait`` counter, which is the
+ time spent waiting for blocking I/O to complete.
- 1565_: add PEP 517/8 build backend and requirements specification for better
pip integration. (patch by Bernát Gábor)
**Bug fixes**
-- 875_: [Windows] Process' cmdline(), environ() or cwd() may occasionally fail
- with ERROR_PARTIAL_COPY which now gets translated to AccessDenied.
-- 1126_: [Linux] cpu_affinity() segfaults on CentOS 5 / manylinux.
- cpu_affinity() support for CentOS 5 was removed.
-- 1528_: [AIX] compilation error on AIX 7.2 due to 32 vs 64 bit differences.
- (patch by Arnon Yaari)
-- 1535_: 'type' and 'family' fields returned by net_connections() are not
+- 875_, [Windows], **[critical]**: `Process.cmdline()`_, `Process.environ()`_ or
+ `Process.cwd()`_ may occasionally fail with ``ERROR_PARTIAL_COPY`` which now
+ gets translated to `AccessDenied`_.
+- 1126_, [Linux], **[critical]**: `Process.cpu_affinity()`_ segfaults on CentOS
+ 5 / manylinux. `Process.cpu_affinity()`_ support for CentOS 5 was removed.
+- 1528_, [AIX], **[critical]**: compilation error on AIX 7.2 due to 32 vs 64
+ bit differences. (patch by Arnon Yaari)
+- 1535_: ``type`` and ``family`` fields returned by `net_connections()`_ are not
always turned into enums.
-- 1536_: [NetBSD] process cmdline() erroneously raise ZombieProcess error if
+- 1536_, [NetBSD]: `Process.cmdline()`_ erroneously raise `ZombieProcess`_ error if
cmdline has non encodable chars.
- 1546_: usage percent may be rounded to 0 on Python 2.
-- 1552_: [Windows] getloadavg() math for calculating 5 and 15 mins values is
+- 1552_, [Windows]: `getloadavg()`_ math for calculating 5 and 15 mins values is
incorrect.
-- 1568_: [Linux] use CC compiler env var if defined.
-- 1570_: [Windows] `NtWow64*` syscalls fail to raise the proper error code
-- 1585_: [OSX] calling close() (in C) on possible negative integers. (patch
- by Athos Ribeiro)
-- 1606_: [SunOS] compilation fails on SunOS 5.10. (patch by vser1)
+- 1568_, [Linux]: use CC compiler env var if defined.
+- 1570_, [Windows]: ``NtWow64*`` syscalls fail to raise the proper error code
+- 1585_, [OSX]: avoid calling ``close()`` (in C) on possible negative integers.
+ (patch by Athos Ribeiro)
+- 1606_, [SunOS], **[critical]**: compilation fails on SunOS 5.10.
+ (patch by vser1)
5.6.3
=====
@@ -279,16 +285,16 @@ XXXX-XX-XX
**Enhancements**
-- 1494_: [AIX] added support for Process.environ(). (patch by Arnon Yaari)
+- 1494_, [AIX]: added support for `Process.environ()`_. (patch by Arnon Yaari)
**Bug fixes**
-- 1276_: [AIX] can't get whole cmdline(). (patch by Arnon Yaari)
-- 1501_: [Windows] Process cmdline() and exe() raise unhandled "WinError 1168
- element not found" exceptions for "Registry" and "Memory Compression" psuedo
- processes on Windows 10.
-- 1526_: [NetBSD] process cmdline() could raise MemoryError. (patch by
- Kamil Rytarowski)
+- 1276_, [AIX]: can't get whole `Process.cmdline()`_. (patch by Arnon Yaari)
+- 1501_, [Windows]: `Process.cmdline()`_ and `Process.exe()`_ raise unhandled
+ "WinError 1168 element not found" exceptions for "Registry" and
+ "Memory Compression" psuedo processes on Windows 10.
+- 1526_, [NetBSD], **[critical]**: `Process.cmdline()`_ could raise
+ ``MemoryError``. (patch by Kamil Rytarowski)
5.6.2
=====
@@ -297,44 +303,48 @@ XXXX-XX-XX
**Enhancements**
-- 604_: [Windows, Windows] add new psutil.getloadavg(), returning system load
- average calculation, including on Windows (emulated). (patch by Ammar Askar)
-- 1404_: [Linux] cpu_count(logical=False) uses a second method (read from
- `/sys/devices/system/cpu/cpu[0-9]/topology/core_id`) in order to determine
- the number of CPU cores in case /proc/cpuinfo does not provide this info.
-- 1458_: provide coloured test output. Also show failures on KeyboardInterrupt.
-- 1464_: various docfixes (always point to python3 doc, fix links, etc.).
-- 1476_: [Windows] it is now possible to set process high I/O priority
- (ionice()).Also, I/O priority values are now exposed as 4 new constants:
- IOPRIO_VERYLOW, IOPRIO_LOW, IOPRIO_NORMAL, IOPRIO_HIGH.
+- 604_, [Windows]: add new `getloadavg()`_, returning system load average
+ calculation, including on Windows (emulated). (patch by Ammar Askar)
+- 1404_, [Linux]: `cpu_count()`_ with ``logical=False`` uses a second method
+ (read from ``/sys/devices/system/cpu/cpu[0-9]/topology/core_id``) in order to
+ determine the number of CPU cores in case ``/proc/cpuinfo`` does not provide this
+ info.
+- 1458_: provide coloured test output. Also show failures on
+ ``KeyboardInterrupt``.
+- 1464_: various docfixes (always point to Python 3 doc, fix links, etc.).
+- 1476_, [Windows]: it is now possible to set process high I/O priority
+ (`Process.ionice()`_). Also, I/O priority values are now exposed as 4 new
+ constants: ``IOPRIO_VERYLOW``, ``IOPRIO_LOW``, ``IOPRIO_NORMAL``,
+ ``IOPRIO_HIGH``.
- 1478_: add make command to re-run tests failed on last run.
**Bug fixes**
-- 1223_: [Windows] boot_time() may return value on Windows XP.
-- 1456_: [Linux] cpu_freq() returns None instead of 0.0 when min/max not
- available (patch by Alex Manuskin)
-- 1462_: [Linux] (tests) make tests invariant to LANG setting (patch by
+- 1223_, [Windows]: `boot_time()`_ may return incorrect value on Windows XP.
+- 1456_, [Linux]: `cpu_freq()`_ returns ``None`` instead of 0.0 when ``min``
+ and ``max`` fields can't be determined. (patch by Alex Manuskin)
+- 1462_, [Linux]: (tests) make tests invariant to ``LANG`` setting (patch by
Benjamin Drung)
-- 1463_: cpu_distribution.py script was broken.
-- 1470_: [Linux] disk_partitions(): fix corner case when /etc/mtab doesn't
- exist. (patch by Cedric Lamoriniere)
-- 1471_: [SunOS] Process name() and cmdline() can return SystemError. (patch
- by Daniel Beer)
-- 1472_: [Linux] cpu_freq() does not return all CPUs on Rasbperry-pi 3.
-- 1474_: fix formatting of psutil.tests() which mimicks 'ps aux' output.
-- 1475_: [Windows] OSError.winerror attribute wasn't properly checked resuling
- in WindowsError being raised instead of AccessDenied.
-- 1477_: [Windows] wrong or absent error handling for private NTSTATUS Windows
- APIs. Different process methods were affected by this.
-- 1480_: [Windows] psutil.cpu_count(logical=False) could cause a crash due to
- fixed read violation. (patch by Samer Masterson)
-- 1486_: [AIX, SunOS] AttributeError when interacting with Process methods
- involved into oneshot() context.
-- 1491_: [SunOS] net_if_addrs(): free() ifap struct on error. (patch by
- Agnewee)
-- 1493_: [Linux] cpu_freq(): handle the case where
- /sys/devices/system/cpu/cpufreq/ exists but is empty.
+- 1463_: `cpu_distribution.py`_ script was broken.
+- 1470_, [Linux]: `disk_partitions()`_: fix corner case when ``/etc/mtab``
+ doesn't exist. (patch by Cedric Lamoriniere)
+- 1471_, [SunOS]: `Process.name()`_ and `Process.cmdline()`_ can return
+ ``SystemError``. (patch by Daniel Beer)
+- 1472_, [Linux]: `cpu_freq()`_ does not return all CPUs on Rasbperry-pi 3.
+- 1474_: fix formatting of ``psutil.tests()`` which mimicks ``ps aux`` output.
+- 1475_, [Windows], **[critical]**: ``OSError.winerror`` attribute wasn't
+ properly checked resuling in ``WindowsError(ERROR_ACCESS_DENIED)`` being
+ raised instead of `AccessDenied`_.
+- 1477_, [Windows]: wrong or absent error handling for private ``NTSTATUS``
+ Windows APIs. Different process methods were affected by this.
+- 1480_, [Windows], **[critical]**: `cpu_count()`_ with ``logical=False`` could
+ cause a crash due to fixed read violation. (patch by Samer Masterson)
+- 1486_, [AIX], [SunOS]: ``AttributeError`` when interacting with `Process`_
+ methods involved into `Process.oneshot()`_ context.
+- 1491_, [SunOS]: `net_if_addrs()`_: use ``free()`` against ``ifap`` struct
+ on error. (patch by Agnewee)
+- 1493_, [Linux]: `cpu_freq()`_: handle the case where
+ ``/sys/devices/system/cpu/cpufreq/`` exists but it's empty.
5.6.1
=====
@@ -343,11 +353,12 @@ XXXX-XX-XX
**Bug fixes**
-- 1329_: [AIX] psutil doesn't compile on AIX 6.1. (patch by Arnon Yaari)
-- 1448_: [Windows] crash on import due to rtlIpv6AddressToStringA not available
- on Wine.
-- 1451_: [Windows] Process.memory_full_info() segfaults. NtQueryVirtualMemory
- is now used instead of QueryWorkingSet to calculate USS memory.
+- 1329_, [AIX]: psutil doesn't compile on AIX 6.1. (patch by Arnon Yaari)
+- 1448_, [Windows], **[critical]**: crash on import due to ``rtlIpv6AddressToStringA``
+ not available on Wine.
+- 1451_, [Windows], **[critical]**: `Process.memory_full_info()`_ segfaults.
+ ``NtQueryVirtualMemory`` is now used instead of ``QueryWorkingSet`` to
+ calculate USS memory.
5.6.0
=====
@@ -356,48 +367,51 @@ XXXX-XX-XX
**Enhancements**
-- 1379_: [Windows] Process suspend() and resume() now use NtSuspendProcess
- and NtResumeProcess instead of stopping/resuming all threads of a process.
- This is faster and more reliable (aka this is what ProcessHacker does).
-- 1420_: [Windows] in case of exception disk_usage() now also shows the path
+- 1379_, [Windows]: `Process.suspend()`_ and `Process.resume()`_ now use
+ ``NtSuspendProcess`` and ``NtResumeProcess`` instead of stopping/resuming all
+ threads of a process. This is faster and more reliable (aka this is what
+ ProcessHacker does).
+- 1420_, [Windows]: in case of exception `disk_usage()`_ now also shows the path
name.
-- 1422_: [Windows] Windows APIs requiring to be dynamically loaded from DLL
+- 1422_, [Windows]: Windows APIs requiring to be dynamically loaded from DLL
libraries are now loaded only once on startup (instead of on per function
call) significantly speeding up different functions and methods.
-- 1426_: [Windows] PAGESIZE and number of processors is now calculated on
+- 1426_, [Windows]: ``PAGESIZE`` and number of processors is now calculated on
startup.
- 1428_: in case of error, the traceback message now shows the underlying C
function called which failed.
-- 1433_: new Process.parents() method. (idea by Ghislain Le Meur)
-- 1437_: pids() are returned in sorted order.
-- 1442_: python3 is now the default interpreter used by Makefile.
+- 1433_: new `Process.parents()`_ method. (idea by Ghislain Le Meur)
+- 1437_: `pids()`_ are returned in sorted order.
+- 1442_: Python 3 is now the default interpreter used by Makefile.
**Bug fixes**
-- 1353_: process_iter() is now thread safe (it rarely raised TypeError).
-- 1394_: [Windows] Process name() and exe() may erroneously return "Registry".
- QueryFullProcessImageNameW is now used instead of GetProcessImageFileNameW
- in order to prevent that.
-- 1411_: [BSD] lack of Py_DECREF could cause segmentation fault on process
+- 1353_: `process_iter()`_ is now thread safe (it rarely raised ``TypeError``).
+- 1394_, [Windows], **[critical]**: `Process.name()`_ and `Process.exe()`_ may
+ erroneously return "Registry" or fail with "[Error 0] The operation completed
+ successfully".
+ ``QueryFullProcessImageNameW`` is now used instead of
+ ``GetProcessImageFileNameW`` in order to prevent that.
+- 1411_, [BSD]: lack of ``Py_DECREF`` could cause segmentation fault on process
instantiation.
-- 1419_: [Windows] Process.environ() raises NotImplementedError when querying
- a 64-bit process in 32-bit-WoW mode. Now it raises AccessDenied.
-- 1427_: [OSX] Process cmdline() and environ() may erroneously raise OSError
- on failed malloc().
-- 1429_: [Windows] SE DEBUG was not properly set for current process. It is
- now, and it should result in less AccessDenied exceptions for low-pid
+- 1419_, [Windows]: `Process.environ()`_ raises ``NotImplementedError`` when
+ querying a 64-bit process in 32-bit-WoW mode. Now it raises `AccessDenied`_.
+- 1427_, [OSX]: `Process.cmdline()`_ and `Process.environ()`_ may erroneously
+ raise ``OSError`` on failed ``malloc()``.
+- 1429_, [Windows]: ``SE DEBUG`` was not properly set for current process. It is
+ now, and it should result in less `AccessDenied`_ exceptions for low PID
processes.
-- 1432_: [Windows] Process.memory_info_ex()'s USS memory is miscalculated
- because we're not using the actual system PAGESIZE.
-- 1439_: [NetBSD] Process.connections() may return incomplete results if using
- oneshot().
-- 1447_: original exception wasn't turned into NSP/AD exceptions when using
- Process.oneshot() ctx manager.
+- 1432_, [Windows]: `Process.memory_info_ex()`_'s USS memory is miscalculated
+ because we're not using the actual system ``PAGESIZE``.
+- 1439_, [NetBSD]: `Process.connections()`_ may return incomplete results if using
+ `Process.oneshot()`_.
+- 1447_: original exception wasn't turned into `NoSuchProcess`_ / `AccessDenied`_
+ exceptions when using `Process.oneshot()`_ context manager.
**Incompatible API changes**
-- 1291_: [OSX] Process.memory_maps() was removed because inherently broken
- (segfault) for years.
+- 1291_, [OSX], **[critical]**: `Process.memory_maps()`_ was removed because
+ inherently broken (segfault) for years.
5.5.1
=====
@@ -406,17 +420,17 @@ XXXX-XX-XX
**Enhancements**
-- 1348_: [Windows] on Windows >= 8.1 if Process.cmdline() fails due to
- ERROR_ACCESS_DENIED attempt using NtQueryInformationProcess +
- ProcessCommandLineInformation. (patch by EccoTheFlintstone)
+- 1348_, [Windows]: on Windows >= 8.1 if `Process.cmdline()`_ fails due to
+ ``ERROR_ACCESS_DENIED`` attempt using ``NtQueryInformationProcess`` +
+ ``ProcessCommandLineInformation``. (patch by EccoTheFlintstone)
**Bug fixes**
-- 1394_: [Windows] Process.exe() returns "[Error 0] The operation completed
+- 1394_, [Windows]: `Process.exe()`_ returns "[Error 0] The operation completed
successfully" when Python process runs in "Virtual Secure Mode".
-- 1402_: psutil exceptions' repr() show the internal private module path.
-- 1408_: [AIX] psutil won't compile on AIX 7.1 due to missing header. (patch
- by Arnon Yaari)
+- 1402_: psutil exceptions' ``repr()`` show the internal private module path.
+- 1408_, [AIX], **[critical]**: psutil won't compile on AIX 7.1 due to missing
+ header. (patch by Arnon Yaari)
5.5.0
=====
@@ -425,27 +439,27 @@ XXXX-XX-XX
**Enhancements**
-- 1350_: [FreeBSD] added support for sensors_temperatures(). (patch by Alex
+- 1350_, [FreeBSD]: added support for `sensors_temperatures()`_. (patch by Alex
Manuskin)
-- 1352_: [FreeBSD] added support for CPU frequency. (patch by Alex Manuskin)
+- 1352_, [FreeBSD]: added support for `cpu_freq()`_. (patch by Alex Manuskin)
**Bug fixes**
-- 1111_: Process.oneshot() is now thread safe.
-- 1354_: [Linux] disk_io_counters() fails on Linux kernel 4.18+.
-- 1357_: [Linux] Process' memory_maps() and io_counters() method are no longer
- exposed if not supported by the kernel.
-- 1368_: [Windows] fix psutil.Process().ionice(...) mismatch. (patch by
+- 1111_: `Process.oneshot()`_ is now thread safe.
+- 1354_, [Linux]: `disk_io_counters()`_ fails on Linux kernel 4.18+.
+- 1357_, [Linux]: `Process.memory_maps()`_ and `Process.io_counters()`_ methods
+ are no longer exposed if not supported by the kernel.
+- 1368_, [Windows]: fix `Process.ionice()`_ mismatch. (patch by
EccoTheFlintstone)
-- 1370_: [Windows] improper usage of CloseHandle() may lead to override the
+- 1370_, [Windows]: improper usage of ``CloseHandle()`` may lead to override the
original error code when raising an exception.
-- 1373_: incorrect handling of cache in Process.oneshot() context causes
- Process instances to return incorrect results.
-- 1376_: [Windows] OpenProcess() now uses PROCESS_QUERY_LIMITED_INFORMATION
- access rights wherever possible, resulting in less AccessDenied exceptions
+- 1373_, **[critical]**: incorrect handling of cache in `Process.oneshot()`_
+ context causes `Process`_ instances to return incorrect results.
+- 1376_, [Windows]: ``OpenProcess`` now uses ``PROCESS_QUERY_LIMITED_INFORMATION``
+ access rights wherever possible, resulting in less `AccessDenied`_ exceptions
being thrown for system processes.
-- 1376_: [Windows] check if variable is NULL before free()ing it. (patch by
- EccoTheFlintstone)
+- 1376_, [Windows]: check if variable is ``NULL`` before ``free()`` ing it.
+ (patch by EccoTheFlintstone)
5.4.8
=====
@@ -454,28 +468,28 @@ XXXX-XX-XX
**Enhancements**
-- 1197_: [Linux] cpu_freq() is now implemented by parsing /proc/cpuinfo in case
- /sys/devices/system/cpu/* filesystem is not available.
-- 1310_: [Linux] psutil.sensors_temperatures() now parses /sys/class/thermal
- in case /sys/class/hwmon fs is not available (e.g. Raspberry Pi). (patch
+- 1197_, [Linux]: `cpu_freq()`_ is now implemented by parsing ``/proc/cpuinfo``
+ in case ``/sys/devices/system/cpu/*`` filesystem is not available.
+- 1310_, [Linux]: `sensors_temperatures()`_ now parses ``/sys/class/thermal``
+ in case ``/sys/class/hwmon`` fs is not available (e.g. Raspberry Pi). (patch
by Alex Manuskin)
-- 1320_: [Posix] better compilation support when using g++ instead of gcc.
+- 1320_, [POSIX]: better compilation support when using g++ instead of GCC.
(patch by Jaime Fullaondo)
**Bug fixes**
-- 715_: do not print exception on import time in case cpu_times() fails.
-- 1004_: [Linux] Process.io_counters() may raise ValueError.
-- 1277_: [OSX] available and used memory (psutil.virtual_memory()) metrics are
+- 715_: do not print exception on import time in case `cpu_times()`_ fails.
+- 1004_, [Linux]: `Process.io_counters()`_ may raise ``ValueError``.
+- 1277_, [OSX]: available and used memory (`virtual_memory()`_) metrics are
not accurate.
-- 1294_: [Windows] psutil.Process().connections() may sometimes fail with
- intermittent 0xC0000001. (patch by Sylvain Duchesne)
-- 1307_: [Linux] disk_partitions() does not honour PROCFS_PATH.
-- 1320_: [AIX] system CPU times (psutil.cpu_times()) were being reported with
+- 1294_, [Windows]: `Process.connections()`_ may sometimes fail with
+ intermittent ``0xC0000001``. (patch by Sylvain Duchesne)
+- 1307_, [Linux]: `disk_partitions()`_ does not honour `PROCFS_PATH`_.
+- 1320_, [AIX]: system CPU times (`cpu_times()`_) were being reported with
ticks unit as opposed to seconds. (patch by Jaime Fullaondo)
-- 1332_: [OSX] psutil debug messages are erroneously printed all the time.
+- 1332_, [OSX]: psutil debug messages are erroneously printed all the time.
(patch by Ilya Yanok)
-- 1346_: [SunOS] net_connections() returns an empty list. (patch by Oleksii
+- 1346_, [SunOS]: `net_connections()`_ returns an empty list. (patch by Oleksii
Shevchuk)
5.4.7
@@ -485,28 +499,28 @@ XXXX-XX-XX
**Enhancements**
-- 1286_: [macOS] psutil.OSX constant is now deprecated in favor of new
- psutil.MACOS.
-- 1309_: [Linux] added psutil.STATUS_PARKED constant for Process.status().
-- 1321_: [Linux] add disk_io_counters() dual implementation relying on
- /sys/block filesystem in case /proc/diskstats is not available. (patch by
- Lawrence Ye)
+- 1286_, [macOS]: ``psutil.OSX`` constant is now deprecated in favor of new
+ ``psutil.MACOS``.
+- 1309_, [Linux]: added ``psutil.STATUS_PARKED`` constant for `Process.status()`_.
+- 1321_, [Linux]: add `disk_io_counters()`_ dual implementation relying on
+ ``/sys/block`` filesystem in case ``/proc/diskstats`` is not available.
+ (patch by Lawrence Ye)
**Bug fixes**
-- 1209_: [macOS] Process.memory_maps() may fail with EINVAL due to poor
- task_for_pid() syscall. AccessDenied is now raised instead.
-- 1278_: [macOS] Process.threads() incorrectly return microseconds instead of
+- 1209_, [macOS]: `Process.memory_maps()`_ may fail with ``EINVAL`` due to poor
+ ``task_for_pid()`` syscall. `AccessDenied`_ is now raised instead.
+- 1278_, [macOS]: `Process.threads()`_ incorrectly return microseconds instead of
seconds. (patch by Nikhil Marathe)
-- 1279_: [Linux, macOS, BSD] net_if_stats() may return ENODEV.
-- 1294_: [Windows] psutil.Process().connections() may sometime fail with
- MemoryError. (patch by sylvainduchesne)
-- 1305_: [Linux] disk_io_stats() may report inflated r/w bytes values.
-- 1309_: [Linux] Process.status() is unable to recognize "idle" and "parked"
- statuses (returns '?').
-- 1313_: [Linux] disk_io_counters() can report inflated IO counters due to
- erroneously counting base disk device and its partition(s) twice.
-- 1323_: [Linux] sensors_temperatures() may fail with ValueError.
+- 1279_, [Linux], [macOS], [BSD]: `net_if_stats()`_ may return ``ENODEV``.
+- 1294_, [Windows]: `Process.connections()`_ may sometime fail with
+ ``MemoryError``. (patch by sylvainduchesne)
+- 1305_, [Linux]: `disk_io_counters()`_ may report inflated r/w bytes values.
+- 1309_, [Linux]: `Process.status()`_ is unable to recognize ``"idle"`` and
+ ``"parked"`` statuses (returns ``"?"``).
+- 1313_, [Linux]: `disk_io_counters()`_ can report inflated values due to
+ counting base disk device and its partition(s) twice.
+- 1323_, [Linux]: `sensors_temperatures()`_ may fail with ``ValueError``.
5.4.6
=====
@@ -515,12 +529,12 @@ XXXX-XX-XX
**Bug fixes**
-- 1258_: [Windows] Process.username() may cause a segfault (Python interpreter
- crash). (patch by Jean-Luc Migot)
-- 1273_: net_if_addr() namedtuple's name has been renamed from "snic" to
- "snicaddr".
-- 1274_: [Linux] there was a small chance Process.children() may swallow
- AccessDenied exceptions.
+- 1258_, [Windows], **[critical]**: `Process.username()`_ may cause a segfault
+ (Python interpreter crash). (patch by Jean-Luc Migot)
+- 1273_: `net_if_addrs()`_ namedtuple's name has been renamed from ``snic`` to
+ ``snicaddr``.
+- 1274_, [Linux]: there was a small chance `Process.children()`_ may swallow
+ `AccessDenied`_ exceptions.
5.4.5
=====
@@ -529,7 +543,7 @@ XXXX-XX-XX
**Bug fixes**
-- 1268_: setup.py's extra_require parameter requires latest setuptools version,
+- 1268_: setup.py's ``extra_require`` parameter requires latest setuptools version,
breaking quite a lot of installations.
5.4.4
@@ -539,47 +553,47 @@ XXXX-XX-XX
**Enhancements**
-- 1239_: [Linux] expose kernel "slab" memory for psutil.virtual_memory().
+- 1239_, [Linux]: expose kernel ``slab`` memory field for `virtual_memory()`_.
(patch by Maxime Mouial)
**Bug fixes**
-- 694_: [SunOS] cmdline() could be truncated at the 15th character when
- reading it from /proc. An extra effort is made by reading it from process
+- 694_, [SunOS]: `Process.cmdline()`_ could be truncated at the 15th character when
+ reading it from ``/proc``. An extra effort is made by reading it from process
address space first. (patch by Georg Sauthoff)
-- 771_: [Windows] cpu_count() (both logical and cores) return a wrong
+- 771_, [Windows]: `cpu_count()`_ (both logical and cores) return a wrong
(smaller) number on systems using process groups (> 64 cores).
-- 771_: [Windows] cpu_times(percpu=True) return fewer CPUs on systems using
- process groups (> 64 cores).
-- 771_: [Windows] cpu_stats() and cpu_freq() may return incorrect results on
+- 771_, [Windows]: `cpu_times()`_ with ``percpu=True`` return fewer CPUs on
+ systems using process groups (> 64 cores).
+- 771_, [Windows]: `cpu_stats()`_ and `cpu_freq()`_ may return incorrect results on
systems using process groups (> 64 cores).
-- 1193_: [SunOS] Return uid/gid from /proc/pid/psinfo if there aren't
- enough permissions for /proc/pid/cred. (patch by Georg Sauthoff)
-- 1194_: [SunOS] Return nice value from psinfo as getpriority() doesn't
+- 1193_, [SunOS]: return uid/gid from ``/proc/pid/psinfo`` if there aren't
+ enough permissions for ``/proc/pid/cred``. (patch by Georg Sauthoff)
+- 1194_, [SunOS]: return nice value from ``psinfo`` as ``getpriority()`` doesn't
support real-time processes. (patch by Georg Sauthoff)
-- 1194_: [SunOS] Fix double free in psutil_proc_cpu_num(). (patch by Georg
+- 1194_, [SunOS]: fix double ``free()`` in `Process.cpu_num()`_. (patch by Georg
Sauthoff)
-- 1194_: [SunOS] Fix undefined behavior related to strict-aliasing rules
+- 1194_, [SunOS]: fix undefined behavior related to strict-aliasing rules
and warnings. (patch by Georg Sauthoff)
-- 1210_: [Linux] cpu_percent() steal time may remain stuck at 100% due to Linux
+- 1210_, [Linux]: `cpu_percent()`_ steal time may remain stuck at 100% due to Linux
erroneously reporting a decreased steal time between calls. (patch by Arnon
Yaari)
-- 1216_: fix compatibility with python 2.6 on Windows (patch by Dan Vinakovsky)
-- 1222_: [Linux] Process.memory_full_info() was erroneously summing "Swap:" and
+- 1216_: fix compatibility with Python 2.6 on Windows (patch by Dan Vinakovsky)
+- 1222_, [Linux]: `Process.memory_full_info()`_ was erroneously summing "Swap:" and
"SwapPss:". Same for "Pss:" and "SwapPss". Not anymore.
-- 1224_: [Windows] Process.wait() may erroneously raise TimeoutExpired.
-- 1238_: [Linux] sensors_battery() may return None in case battery is not
- listed as "BAT0" under /sys/class/power_supply.
-- 1240_: [Windows] cpu_times() float loses accuracy in a long running system.
+- 1224_, [Windows]: `Process.wait()`_ may erroneously raise `TimeoutExpired`_.
+- 1238_, [Linux]: `sensors_battery()`_ may return ``None`` in case battery is not
+ listed as "BAT0" under ``/sys/class/power_supply``.
+- 1240_, [Windows]: `cpu_times()`_ float loses accuracy in a long running system.
(patch by stswandering)
-- 1245_: [Linux] sensors_temperatures() may fail with IOError "no such file".
-- 1255_: [FreeBSD] swap_memory() stats were erroneously represented in KB.
+- 1245_, [Linux]: `sensors_temperatures()`_ may fail with ``IOError`` "no such file".
+- 1255_, [FreeBSD]: `swap_memory()`_ stats were erroneously represented in KB.
(patch by Denis Krienbühl)
**Backward compatibility**
-- 771_: [Windows] cpu_count(logical=False) on Windows XP and Vista is no
- longer supported and returns None.
+- 771_, [Windows]: `cpu_count()`_ with ``logical=False`` on Windows XP and Vista
+ is no longer supported and returns ``None``.
5.4.3
=====
@@ -588,11 +602,11 @@ XXXX-XX-XX
**Enhancements**
-- 775_: disk_partitions() on Windows return mount points.
+- 775_: `disk_partitions()`_ on Windows return mount points.
**Bug fixes**
-- 1193_: pids() may return False on macOS.
+- 1193_: `pids()`_ may return ``False`` on macOS.
5.4.2
=====
@@ -601,24 +615,24 @@ XXXX-XX-XX
**Enhancements**
-- 1173_: introduced PSUTIL_DEBUG environment variable which can be set in order
+- 1173_: introduced ``PSUTIL_DEBUG`` environment variable which can be set in order
to print useful debug messages on stderr (useful in case of nasty errors).
-- 1177_: added support for sensors_battery() on macOS. (patch by Arnon Yaari)
-- 1183_: Process.children() is 2x faster on UNIX and 2.4x faster on Linux.
-- 1188_: deprecated method Process.memory_info_ex() now warns by using
- FutureWarning instead of DeprecationWarning.
+- 1177_, [macOS]: added support for `sensors_battery()`_. (patch by Arnon Yaari)
+- 1183_: `Process.children()`_ is 2x faster on POSIX and 2.4x faster on Linux.
+- 1188_: deprecated method `Process.memory_info_ex()`_ now warns by using
+ ``FutureWarning`` instead of ``DeprecationWarning``.
**Bug fixes**
-- 1152_: [Windows] disk_io_counters() may return an empty dict.
-- 1169_: [Linux] users() "hostname" returns username instead. (patch by
+- 1152_, [Windows]: `disk_io_counters()`_ may return an empty dict.
+- 1169_, [Linux]: `users()`_ ``hostname`` returns username instead. (patch by
janderbrain)
-- 1172_: [Windows] `make test` does not work.
-- 1179_: [Linux] Process.cmdline() is now able to splits cmdline args for
- misbehaving processes which overwrite /proc/pid/cmdline and use spaces
+- 1172_, [Windows]: ``make test`` does not work.
+- 1179_, [Linux]: `Process.cmdline()`_ is now able to split cmdline args for
+ misbehaving processes which overwrite ``/proc/pid/cmdline`` and use spaces
instead of null bytes as args separator.
-- 1181_: [macOS] Process.memory_maps() may raise ENOENT.
-- 1187_: [macOS] pids() does not return PID 0 on recent macOS versions.
+- 1181_, [macOS]: `Process.memory_maps()`_ may raise ``ENOENT``.
+- 1187_, [macOS]: `pids()`_ does not return PID 0 on recent macOS versions.
5.4.1
=====
@@ -627,18 +641,19 @@ XXXX-XX-XX
**Enhancements**
-- 1164_: [AIX] add support for Process.num_ctx_switches(). (patch by Arnon
+- 1164_, [AIX]: add support for `Process.num_ctx_switches()`_. (patch by Arnon
Yaari)
-- 1053_: abandon Python 3.3 support (psutil still works but it's no longer
+- 1053_: drop Python 3.3 support (psutil still works but it's no longer
tested).
**Bug fixes**
-- 1150_: [Windows] when a process is terminate()d now the exit code is set to
- SIGTERM instead of 0. (patch by Akos Kiss)
-- 1151_: python -m psutil.tests fail
-- 1154_: [AIX] psutil won't compile on AIX 6.1.0. (patch by Arnon Yaari)
-- 1167_: [Windows] net_io_counter() packets count now include also non-unicast
+- 1150_, [Windows]: when a process is terminated now the exit code is set to
+ ``SIGTERM`` instead of ``0``. (patch by Akos Kiss)
+- 1151_: ``python -m psutil.tests`` fail.
+- 1154_, [AIX], **[critical]**: psutil won't compile on AIX 6.1.0.
+ (patch by Arnon Yaari)
+- 1167_, [Windows]: `net_io_counters()`_ packets count now include also non-unicast
packets. (patch by Matthew Long)
5.4.0
@@ -648,22 +663,21 @@ XXXX-XX-XX
**Enhancements**
-- 1123_: [AIX] added support for AIX platform. (patch by Arnon Yaari)
+- 1123_, [AIX]: added support for AIX platform. (patch by Arnon Yaari)
**Bug fixes**
-- 1009_: [Linux] sensors_temperatures() may crash with IOError.
-- 1012_: [Windows] disk_io_counters()'s read_time and write_time were expressed
- in tens of micro seconds instead of milliseconds.
-- 1127_: [macOS] invalid reference counting in Process.open_files() may lead to
- segfault. (patch by Jakub Bacic)
-- 1129_: [Linux] sensors_fans() may crash with IOError. (patch by Sebastian
- Saip)
-- 1131_: [SunOS] fix compilation warnings. (patch by Arnon Yaari)
-- 1133_: [Windows] can't compile on newer versions of Visual Studio 2017 15.4.
+- 1009_, [Linux]: `sensors_temperatures()`_ may crash with ``IOError``.
+- 1012_, [Windows]: `disk_io_counters()`_ ``read_time`` and ``write_time``
+ were expressed in tens of micro seconds instead of milliseconds.
+- 1127_, [macOS], **[critical]**: invalid reference counting in
+ `Process.open_files()`_ may lead to segfault. (patch by Jakub Bacic)
+- 1129_, [Linux]: `sensors_fans()`_ may crash with ``IOError``. (patch by
+ Sebastian Saip)
+- 1131_, [SunOS]: fix compilation warnings. (patch by Arnon Yaari)
+- 1133_, [Windows]: can't compile on newer versions of Visual Studio 2017 15.4.
(patch by Max Bélanger)
-- 1138_: [Linux] can't compile on CentOS 5.0 and RedHat 5.0.
- (patch by Prodesire)
+- 1138_, [Linux]: can't compile on CentOS 5.0 and RedHat 5.0. (patch by Prodesire)
5.3.1
=====
@@ -676,13 +690,13 @@ XXXX-XX-XX
**Bug fixes**
-- 1105_: [FreeBSD] psutil does not compile on FreeBSD 12.
-- 1125_: [BSD] net_connections() raises TypeError.
+- 1105_, [FreeBSD]: psutil does not compile on FreeBSD 12.
+- 1125_, [BSD]: `net_connections()`_ raises ``TypeError``.
**Compatibility notes**
-- 1120_: .exe files for Windows are no longer uploaded on PyPI as per PEP-527;
- only wheels are provided.
+- 1120_: ``.exe`` files for Windows are no longer uploaded on PyPI as per
+ PEP-527. Only wheels are provided.
5.3.0
=====
@@ -691,104 +705,99 @@ XXXX-XX-XX
**Enhancements**
-- 802_: disk_io_counters() and net_io_counters() numbers no longer wrap
- (restart from 0). Introduced a new "nowrap" argument.
-- 928_: psutil.net_connections() and psutil.Process.connections() "laddr" and
- "raddr" are now named tuples.
-- 1015_: swap_memory() now relies on /proc/meminfo instead of sysinfo() syscall
- so that it can be used in conjunction with PROCFS_PATH in order to retrieve
- memory info about Linux containers such as Docker and Heroku.
-- 1022_: psutil.users() provides a new "pid" field.
-- 1025_: process_iter() accepts two new parameters in order to invoke
- Process.as_dict(): "attrs" and "ad_value". With this you can iterate over all
- processes in one shot without needing to catch NoSuchProcess and do list/dict
- comprehensions.
+- 802_: `disk_io_counters()`_ and `net_io_counters()`_ numbers no longer wrap
+ (restart from 0). Introduced a new ``nowrap`` argument.
+- 928_: `net_connections()`_ and `Process.connections()`_ ``laddr`` and
+ ``raddr`` are now named tuples.
+- 1015_: `swap_memory()`_ now relies on ``/proc/meminfo`` instead of ``sysinfo()``
+ syscall so that it can be used in conjunction with `PROCFS_PATH`_ in order to
+ retrieve memory info about Linux containers such as Docker and Heroku.
+- 1022_: `users()`_ provides a new ``pid`` field.
+- 1025_: `process_iter()`_ accepts two new parameters in order to invoke
+ `Process.as_dict()`_: ``attrs`` and ``ad_value``. With these you can iterate
+ over all processes in one shot without needing to catch `NoSuchProcess`_ and
+ do list/dict comprehensions.
- 1040_: implemented full unicode support.
-- 1051_: disk_usage() on Python 3 is now able to accept bytes.
+- 1051_: `disk_usage()`_ on Python 3 is now able to accept bytes.
- 1058_: test suite now enables all warnings by default.
- 1060_: source distribution is dynamically generated so that it only includes
relevant files.
-- 1079_: [FreeBSD] net_connections()'s fd number is now being set for real
- (instead of -1). (patch by Gleb Smirnoff)
-- 1091_: [SunOS] implemented Process.environ(). (patch by Oleksii Shevchuk)
+- 1079_, [FreeBSD]: `net_connections()`_ ``fd`` number is now being set for real
+ (instead of ``-1``). (patch by Gleb Smirnoff)
+- 1091_, [SunOS]: implemented `Process.environ()`_. (patch by Oleksii Shevchuk)
**Bug fixes**
-- 989_: [Windows] boot_time() may return a negative value.
-- 1007_: [Windows] boot_time() can have a 1 sec fluctuation between calls; the
- value of the first call is now cached so that boot_time() always returns the
- same value if fluctuation is <= 1 second.
-- 1013_: [FreeBSD] psutil.net_connections() may return incorrect PID. (patch
+- 989_, [Windows]: `boot_time()`_ may return a negative value.
+- 1007_, [Windows]: `boot_time()`_ can have a 1 sec fluctuation between calls.
+ The value of the first call is now cached so that `boot_time()`_ always
+ returns the same value if fluctuation is <= 1 second.
+- 1013_, [FreeBSD]: `net_connections()`_ may return incorrect PID. (patch
by Gleb Smirnoff)
-- 1014_: [Linux] Process class can mask legitimate ENOENT exceptions as
- NoSuchProcess.
-- 1016_: disk_io_counters() raises RuntimeError on a system with no disks.
-- 1017_: net_io_counters() raises RuntimeError on a system with no network
+- 1014_, [Linux]: `Process`_ class can mask legitimate ``ENOENT`` exceptions as
+ `NoSuchProcess`_.
+- 1016_: `disk_io_counters()`_ raises ``RuntimeError`` on a system with no disks.
+- 1017_: `net_io_counters()`_ raises ``RuntimeError`` on a system with no network
cards installed.
-- 1021_: [Linux] open_files() may erroneously raise NoSuchProcess instead of
- skipping a file which gets deleted while open files are retrieved.
-- 1029_: [macOS, FreeBSD] Process.connections('unix') on Python 3 doesn't
- properly handle unicode paths and may raise UnicodeDecodeError.
-- 1033_: [macOS, FreeBSD] memory leak for net_connections() and
- Process.connections() when retrieving UNIX sockets (kind='unix').
-- 1040_: fixed many unicode related issues such as UnicodeDecodeError on
- Python 3 + UNIX and invalid encoded data on Windows.
-- 1042_: [FreeBSD] psutil won't compile on FreeBSD 12.
-- 1044_: [macOS] different Process methods incorrectly raise AccessDenied for
- zombie processes.
-- 1046_: [Windows] disk_partitions() on Windows overrides user's SetErrorMode.
-- 1047_: [Windows] Process username(): memory leak in case exception is thrown.
-- 1048_: [Windows] users()'s host field report an invalid IP address.
-- 1050_: [Windows] Process.memory_maps memory() leaks memory.
-- 1055_: cpu_count() is no longer cached; this is useful on systems such as
+- 1021_, [Linux]: `Process.open_files()`_ may erroneously raise `NoSuchProcess`_
+ instead of skipping a file which gets deleted while open files are retrieved.
+- 1029_, [macOS], [FreeBSD]: `Process.connections()`_ with ``family=unix`` on Python
+ 3 doesn't properly handle unicode paths and may raise ``UnicodeDecodeError``.
+- 1033_, [macOS], [FreeBSD]: memory leak for `net_connections()`_ and
+ `Process.connections()`_ when retrieving UNIX sockets (``kind='unix'``).
+- 1040_: fixed many unicode related issues such as ``UnicodeDecodeError`` on
+ Python 3 + POSIX and invalid encoded data on Windows.
+- 1042_, [FreeBSD], **[critical]**: psutil won't compile on FreeBSD 12.
+- 1044_, [macOS]: different `Process`_ methods incorrectly raise `AccessDenied`_
+ for zombie processes.
+- 1046_, [Windows]: `disk_partitions()`_ on Windows overrides user's ``SetErrorMode``.
+- 1047_, [Windows]: `Process.username()`_: memory leak in case exception is thrown.
+- 1048_, [Windows]: `users()`_ ``host`` field report an invalid IP address.
+- 1050_, [Windows]: `Process.memory_maps()`_ leaks memory.
+- 1055_: `cpu_count()`_ is no longer cached. This is useful on systems such as
Linux where CPUs can be disabled at runtime. This also reflects on
- Process.cpu_percent() which no longer uses the cache.
+ `Process.cpu_percent()`_ which no longer uses the cache.
- 1058_: fixed Python warnings.
-- 1062_: disk_io_counters() and net_io_counters() raise TypeError if no disks
- or NICs are installed on the system.
-- 1063_: [NetBSD] net_connections() may list incorrect sockets.
-- 1064_: [NetBSD] swap_memory() may segfault in case of error.
-- 1065_: [OpenBSD] Process.cmdline() may raise SystemError.
-- 1067_: [NetBSD] Process.cmdline() leaks memory if process has terminated.
-- 1069_: [FreeBSD] Process.cpu_num() may return 255 for certain kernel
+- 1062_: `disk_io_counters()`_ and `net_io_counters()`_ raise ``TypeError`` if
+ no disks or NICs are installed on the system.
+- 1063_, [NetBSD]: `net_connections()`_ may list incorrect sockets.
+- 1064_, [NetBSD], **[critical]**: `swap_memory()`_ may segfault in case of error.
+- 1065_, [OpenBSD], **[critical]**: `Process.cmdline()`_ may raise ``SystemError``.
+- 1067_, [NetBSD]: `Process.cmdline()`_ leaks memory if process has terminated.
+- 1069_, [FreeBSD]: `Process.cpu_num()`_ may return 255 for certain kernel
processes.
-- 1071_: [Linux] cpu_freq() may raise IOError on old RedHat distros.
-- 1074_: [FreeBSD] sensors_battery() raises OSError in case of no battery.
-- 1075_: [Windows] net_if_addrs(): inet_ntop() return value is not checked.
-- 1077_: [SunOS] net_if_addrs() shows garbage addresses on SunOS 5.10.
+- 1071_, [Linux]: `cpu_freq()`_ may raise ``IOError`` on old RedHat distros.
+- 1074_, [FreeBSD]: `sensors_battery()`_ raises ``OSError`` in case of no battery.
+- 1075_, [Windows]: `net_if_addrs()`_: ``inet_ntop()`` return value is not checked.
+- 1077_, [SunOS]: `net_if_addrs()`_ shows garbage addresses on SunOS 5.10.
(patch by Oleksii Shevchuk)
-- 1077_: [SunOS] net_connections() does not work on SunOS 5.10. (patch by
+- 1077_, [SunOS]: `net_connections()`_ does not work on SunOS 5.10. (patch by
Oleksii Shevchuk)
-- 1079_: [FreeBSD] net_connections() didn't list locally connected sockets.
+- 1079_, [FreeBSD]: `net_connections()`_ didn't list locally connected sockets.
(patch by Gleb Smirnoff)
-- 1085_: cpu_count() return value is now checked and forced to None if <= 1.
-- 1087_: Process.cpu_percent() guard against cpu_count() returning None and
- assumes 1 instead.
-- 1093_: [SunOS] memory_maps() shows wrong 64 bit addresses.
-- 1094_: [Windows] psutil.pid_exists() may lie. Also, all process APIs relying
- on OpenProcess Windows API now check whether the PID is actually running.
-- 1098_: [Windows] Process.wait() may erroneously return sooner, when the PID
+- 1085_: `cpu_count()`_ return value is now checked and forced to ``None`` if <= 1.
+- 1087_: `Process.cpu_percent()`_ guard against `cpu_count()`_ returning ``None``
+ and assumes 1 instead.
+- 1093_, [SunOS]: `Process.memory_maps()`_ shows wrong 64 bit addresses.
+- 1094_, [Windows]: `pid_exists()`_ may lie. Also, all process APIs relying
+ on ``OpenProcess`` Windows API now check whether the PID is actually running.
+- 1098_, [Windows]: `Process.wait()`_ may erroneously return sooner, when the PID
is still alive.
-- 1099_: [Windows] Process.terminate() may raise AccessDenied even if the
+- 1099_, [Windows]: `Process.terminate()`_ may raise `AccessDenied`_ even if the
process already died.
-- 1101_: [Linux] sensors_temperatures() may raise ENODEV.
+- 1101_, [Linux]: `sensors_temperatures()`_ may raise ``ENODEV``.
**Porting notes**
-- 1039_: returned types consolidation:
- - Windows / Process.cpu_times(): fields #3 and #4 were int instead of float
- - Linux / FreeBSD: connections('unix'): raddr is now set to "" instead of
- None
- - OpenBSD: connections('unix'): laddr and raddr are now set to "" instead of
- None
+- 1039_: returned types consolidation. 1) Windows / `Process.cpu_times()`_:
+ fields #3 and #4 were int instead of float. 2) Linux / FreeBSD / OpenBSD:
+ `Process.connections()`_ ``raddr`` is now set to ``""`` instead of ``None``
+ when retrieving UNIX sockets.
- 1040_: all strings are encoded by using OS fs encoding.
- 1040_: the following Windows APIs on Python 2 now return a string instead of
- unicode:
- - Process.memory_maps().path
- - WindowsService.bin_path()
- - WindowsService.description()
- - WindowsService.display_name()
- - WindowsService.username()
+ unicode: ``Process.memory_maps().path``, ``WindowsService.bin_path()``,
+ ``WindowsService.description()``, ``WindowsService.display_name()``,
+ ``WindowsService.username()``.
5.2.2
=====
@@ -798,13 +807,13 @@ XXXX-XX-XX
**Bug fixes**
- 1000_: fixed some setup.py warnings.
-- 1002_: [SunOS] remove C macro which will not be available on new Solaris
+- 1002_, [SunOS]: remove C macro which will not be available on new Solaris
versions. (patch by Danek Duvall)
-- 1004_: [Linux] Process.io_counters() may raise ValueError.
-- 1006_: [Linux] cpu_freq() may return None on some Linux versions does not
- support the function; now the function is not declared instead.
-- 1009_: [Linux] sensors_temperatures() may raise OSError.
-- 1010_: [Linux] virtual_memory() may raise ValueError on Ubuntu 14.04.
+- 1004_, [Linux]: `Process.io_counters()`_ may raise ``ValueError``.
+- 1006_, [Linux]: `cpu_freq()`_ may return ``None`` on some Linux versions does not
+ support the function. Let's not make the function available instead.
+- 1009_, [Linux]: `sensors_temperatures()`_ may raise ``OSError``.
+- 1010_, [Linux]: `virtual_memory()`_ may raise ``ValueError`` on Ubuntu 14.04.
5.2.1
=====
@@ -813,12 +822,12 @@ XXXX-XX-XX
**Bug fixes**
-- 981_: [Linux] cpu_freq() may return an empty list.
-- 993_: [Windows] Process.memory_maps() on Python 3 may raise
- UnicodeDecodeError.
-- 996_: [Linux] sensors_temperatures() may not show all temperatures.
-- 997_: [FreeBSD] virtual_memory() may fail due to missing sysctl parameter on
- FreeBSD 12.
+- 981_, [Linux]: `cpu_freq()`_ may return an empty list.
+- 993_, [Windows]: `Process.memory_maps()`_ on Python 3 may raise
+ ``UnicodeDecodeError``.
+- 996_, [Linux]: `sensors_temperatures()`_ may not show all temperatures.
+- 997_, [FreeBSD]: `virtual_memory()`_ may fail due to missing ``sysctl``
+ parameter on FreeBSD 12.
5.2.0
=====
@@ -827,26 +836,26 @@ XXXX-XX-XX
**Enhancements**
-- 971_: [Linux] Add psutil.sensors_fans() function. (patch by Nicolas Hennion)
-- 976_: [Windows] Process.io_counters() has 2 new fields: *other_count* and
- *other_bytes*.
-- 976_: [Linux] Process.io_counters() has 2 new fields: *read_chars* and
- *write_chars*.
+- 971_, [Linux]: Add `sensors_fans()`_ function. (patch by Nicolas Hennion)
+- 976_, [Windows]: `Process.io_counters()`_ has 2 new fields: ``other_count`` and
+ ``other_bytes``.
+- 976_, [Linux]: `Process.io_counters()`_ has 2 new fields: ``read_chars`` and
+ ``write_chars``.
**Bug fixes**
-- 872_: [Linux] can now compile on Linux by using MUSL C library.
-- 985_: [Windows] Fix a crash in `Process.open_files` when the worker thread
- for `NtQueryObject` times out.
-- 986_: [Linux] Process.cwd() may raise NoSuchProcess instead of ZombieProcess.
+- 872_, [Linux]: can now compile on Linux by using MUSL C library.
+- 985_, [Windows]: Fix a crash in `Process.open_files()`_ when the worker thread
+ for ``NtQueryObject`` times out.
+- 986_, [Linux]: `Process.cwd()`_ may raise `NoSuchProcess`_ instead of `ZombieProcess`_.
5.1.3
=====
**Bug fixes**
-- 971_: [Linux] sensors_temperatures() didn't work on CentOS 7.
-- 973_: cpu_percent() may raise ZeroDivisionError.
+- 971_, [Linux]: `sensors_temperatures()`_ didn't work on CentOS 7.
+- 973_, **[critical]**: `cpu_percent()`_ may raise ``ZeroDivisionError``.
5.1.2
=====
@@ -855,11 +864,11 @@ XXXX-XX-XX
**Bug fixes**
-- 966_: [Linux] sensors_battery().power_plugged may erroneously return None on
- Python 3.
-- 968_: [Linux] disk_io_counters() raises TypeError on python 3.
-- 970_: [Linux] sensors_battery()'s name and label fields on Python 3 are bytes
- instead of str.
+- 966_, [Linux]: `sensors_battery()`_ ``power_plugged`` may erroneously return
+ ``None`` on Python 3.
+- 968_, [Linux]: `disk_io_counters()`_ raises ``TypeError`` on Python 3.
+- 970_, [Linux]: `sensors_battery()`_ ``name`` and ``label`` fields on Python 3
+ are bytes instead of str.
5.1.1
=====
@@ -868,16 +877,16 @@ XXXX-XX-XX
**Enhancements**
-- 966_: [Linux] sensors_battery().percent is a float and is more precise.
+- 966_, [Linux]: `sensors_battery()`_ ``percent`` is a float and is more precise.
**Bug fixes**
-- 964_: [Windows] Process.username() and psutil.users() may return badly
- decoding character on Python 3.
-- 965_: [Linux] disk_io_counters() may miscalculate sector size and report the
- wrong number of bytes read and written.
-- 966_: [Linux] sensors_battery() may fail with "no such file error".
-- 966_: [Linux] sensors_battery().power_plugged may lie.
+- 964_, [Windows]: `Process.username()`_ and `users()`_ may return badly
+ decoded character on Python 3.
+- 965_, [Linux]: `disk_io_counters()`_ may miscalculate sector size and report
+ the wrong number of bytes read and written.
+- 966_, [Linux]: `sensors_battery()`_ may fail with ``FileNotFoundError``.
+- 966_, [Linux]: `sensors_battery()`_ ``power_plugged`` may lie.
5.1.0
=====
@@ -886,26 +895,26 @@ XXXX-XX-XX
**Enhancements**
-- 357_: added psutil.Process.cpu_num() (what CPU a process is on).
-- 371_: added psutil.sensors_temperatures() (Linux only).
-- 941_: added psutil.cpu_freq() (CPU frequency).
-- 955_: added psutil.sensors_battery() (Linux, Windows, only).
-- 956_: cpu_affinity([]) can now be used as an alias to set affinity against
- all eligible CPUs.
+- 357_: added `Process.cpu_num()`_ (what CPU a process is on).
+- 371_: added `sensors_temperatures()`_ (Linux only).
+- 941_: added `cpu_freq()`_ (CPU frequency).
+- 955_: added `sensors_battery()`_ (Linux, Windows, only).
+- 956_: `Process.cpu_affinity()`_ can now be passed ``[]`` argument as an
+ alias to set affinity against all eligible CPUs.
**Bug fixes**
-- 687_: [Linux] pid_exists() no longer returns True if passed a process thread
- ID.
-- 948_: cannot install psutil with PYTHONOPTIMIZE=2.
-- 950_: [Windows] Process.cpu_percent() was calculated incorrectly and showed
+- 687_, [Linux]: `pid_exists()`_ no longer returns ``True`` if passed a process
+ thread ID.
+- 948_: cannot install psutil with ``PYTHONOPTIMIZE=2``.
+- 950_, [Windows]: `Process.cpu_percent()`_ was calculated incorrectly and showed
higher number than real usage.
-- 951_: [Windows] the uploaded wheels for Python 3.6 64 bit didn't work.
+- 951_, [Windows]: the uploaded wheels for Python 3.6 64 bit didn't work.
- 959_: psutil exception objects could not be pickled.
-- 960_: Popen.wait() did not return the correct negative exit status if process
- is ``kill()``ed by a signal.
-- 961_: [Windows] WindowsService.description() may fail with
- ERROR_MUI_FILE_NOT_FOUND.
+- 960_: `psutil.Popen`_ ``wait()`` did not return the correct negative exit
+ status if process is killed by a signal.
+- 961_, [Windows]: ``WindowsService.description()`` method may fail with
+ ``ERROR_MUI_FILE_NOT_FOUND``.
5.0.1
=====
@@ -915,17 +924,17 @@ XXXX-XX-XX
**Enhancements**
- 939_: tar.gz distribution went from 1.8M to 258K.
-- 811_: [Windows] provide a more meaningful error message if trying to use
+- 811_, [Windows]: provide a more meaningful error message if trying to use
psutil on unsupported Windows XP.
**Bug fixes**
-- 609_: [SunOS] psutil does not compile on Solaris 10.
-- 936_: [Windows] fix compilation error on VS 2013 (patch by Max Bélanger).
-- 940_: [Linux] cpu_percent() and cpu_times_percent() was calculated
- incorrectly as "iowait", "guest" and "guest_nice" times were not properly
- taken into account.
-- 944_: [OpenBSD] psutil.pids() was omitting PID 0.
+- 609_, [SunOS], **[critical]**: psutil does not compile on Solaris 10.
+- 936_, [Windows]: fix compilation error on VS 2013 (patch by Max Bélanger).
+- 940_, [Linux]: `cpu_percent()`_ and `cpu_times_percent()`_ was calculated
+ incorrectly as ``iowait``, ``guest`` and ``guest_nice`` times were not
+ properly taken into account.
+- 944_, [OpenBSD]: `pids()`_ was omitting PID 0.
5.0.0
=====
@@ -934,15 +943,16 @@ XXXX-XX-XX
**Enhncements**
-- 799_: new Process.oneshot() context manager making Process methods around
+- 799_: new `Process.oneshot()`_ context manager making `Process`_ methods around
+2x faster in general and from +2x to +6x faster on Windows.
- 943_: better error message in case of version conflict on import.
**Bug fixes**
-- 932_: [NetBSD] net_connections() and Process.connections() may fail without
- raising an exception.
-- 933_: [Windows] memory leak in cpu_stats() and WindowsService.description().
+- 932_, [NetBSD]: `net_connections()`_ and `Process.connections()`_ may fail
+ without raising an exception.
+- 933_, [Windows]: memory leak in `cpu_stats()`_ and
+ ``WindowsService.description()`` method.
4.4.2
=====
@@ -951,7 +961,7 @@ XXXX-XX-XX
**Bug fixes**
-- 931_: psutil no longer compiles on Solaris.
+- 931_, **[critical]**: psutil no longer compiles on Solaris.
4.4.1
=====
@@ -960,7 +970,8 @@ XXXX-XX-XX
**Bug fixes**
-- 927_: ``Popen.__del__`` may cause maximum recursion depth error.
+- 927_, **[critical]**: `psutil.Popen`_ ``__del__`` may cause maximum recursion
+ depth error.
4.4.0
=====
@@ -969,34 +980,34 @@ XXXX-XX-XX
**Enhancements**
-- 874_: [Windows] net_if_addrs() returns also the netmask.
-- 887_: [Linux] virtual_memory()'s 'available' and 'used' values are more
- precise and match "free" cmdline utility. "available" also takes into
- account LCX containers preventing "available" to overflow "total".
-- 891_: procinfo.py script has been updated and provides a lot more info.
+- 874_, [Windows]: make `net_if_addrs()`_ also return the ``netmask``.
+- 887_, [Linux]: `virtual_memory()`_ ``available`` and ``used`` values are more
+ precise and match ``free`` cmdline utility. ``available`` also takes into
+ account LCX containers preventing ``available`` to overflow ``total``.
+- 891_: `procinfo.py`_ script has been updated and provides a lot more info.
**Bug fixes**
-- 514_: [macOS] possibly fix Process.memory_maps() segfault (critical!).
-- 783_: [macOS] Process.status() may erroneously return "running" for zombie
- processes.
-- 798_: [Windows] Process.open_files() returns and empty list on Windows 10.
-- 825_: [Linux] cpu_affinity; fix possible double close and use of unopened
- socket.
-- 880_: [Windows] Handle race condition inside psutil_net_connections.
-- 885_: ValueError is raised if a negative integer is passed to cpu_percent()
+- 514_, [macOS], **[critical]**: `Process.memory_maps()`_ can segfault.
+- 783_, [macOS]: `Process.status()`_ may erroneously return ``"running"`` for
+ zombie processes.
+- 798_, [Windows]: `Process.open_files()`_ returns and empty list on Windows 10.
+- 825_, [Linux]: `Process.cpu_affinity()`_: fix possible double close and use of
+ unopened socket.
+- 880_, [Windows]: fix race condition inside `net_connections()`_.
+- 885_: ``ValueError`` is raised if a negative integer is passed to `cpu_percent()`_
functions.
-- 892_: [Linux] Process.cpu_affinity([-1]) raise SystemError with no error
- set; now ValueError is raised.
-- 906_: [BSD] disk_partitions(all=False) returned an empty list. Now the
- argument is ignored and all partitions are always returned.
-- 907_: [FreeBSD] Process.exe() may fail with OSError(ENOENT).
-- 908_: [macOS, BSD] different process methods could errounesuly mask the real
- error for high-privileged PIDs and raise NoSuchProcess and AccessDenied
- instead of OSError and RuntimeError.
-- 909_: [macOS] Process open_files() and connections() methods may raise
- OSError with no exception set if process is gone.
-- 916_: [macOS] fix many compilation warnings.
+- 892_, [Linux], **[critical]**: `Process.cpu_affinity()`_ with ``[-1]`` as arg
+ raises ``SystemError`` with no error set; now ``ValueError`` is raised.
+- 906_, [BSD]: `disk_partitions()`_ with ``all=False`` returned an empty list.
+ Now the argument is ignored and all partitions are always returned.
+- 907_, [FreeBSD]: `Process.exe()`_ may fail with ``OSError(ENOENT)``.
+- 908_, [macOS], [BSD]: different process methods could errounesuly mask the real
+ error for high-privileged PIDs and raise `NoSuchProcess`_ and `AccessDenied`_
+ instead of ``OSError`` and ``RuntimeError``.
+- 909_, [macOS]: `Process.open_files()`_ and `Process.connections()`_ methods
+ may raise ``OSError`` with no exception set if process is gone.
+- 916_, [macOS]: fix many compilation warnings.
4.3.1
=====
@@ -1005,22 +1016,23 @@ XXXX-XX-XX
**Enhancements**
-- 881_: "make install" now works also when using a virtual env.
+- 881_: ``make install`` now works also when using a virtual env.
**Bug fixes**
-- 854_: Process.as_dict() raises ValueError if passed an erroneous attrs name.
-- 857_: [SunOS] Process cpu_times(), cpu_percent(), threads() amd memory_maps()
- may raise RuntimeError if attempting to query a 64bit process with a 32bit
- python. "Null" values are returned as a fallback.
-- 858_: Process.as_dict() should not return memory_info_ex() because it's
- deprecated.
-- 863_: [Windows] memory_map truncates addresses above 32 bits
-- 866_: [Windows] win_service_iter() and services in general are not able to
+- 854_: `Process.as_dict()`_ raises ``ValueError`` if passed an erroneous attrs name.
+- 857_, [SunOS]: `Process.cpu_times()`_, `Process.cpu_percent()`_,
+ `Process.threads()`_ and `Process.memory_maps()`_ may raise ``RuntimeError`` if
+ attempting to query a 64bit process with a 32bit Python. "Null" values are
+ returned as a fallback.
+- 858_: `Process.as_dict()`_ should not call `Process.memory_info_ex()`_
+ because it's deprecated.
+- 863_, [Windows]: `Process.memory_maps()`_ truncates addresses above 32 bits.
+- 866_, [Windows]: `win_service_iter()`_ and services in general are not able to
handle unicode service names / descriptions.
-- 869_: [Windows] Process.wait() may raise TimeoutExpired with wrong timeout
+- 869_, [Windows]: `Process.wait()`_ may raise `TimeoutExpired`_ with wrong timeout
unit (ms instead of sec).
-- 870_: [Windows] Handle leak inside psutil_get_process_data.
+- 870_, [Windows]: handle leak inside ``psutil_get_process_data``.
4.3.0
=====
@@ -1029,20 +1041,20 @@ XXXX-XX-XX
**Enhancements**
-- 819_: [Linux] different speedup improvements:
- Process.ppid() is 20% faster
- Process.status() is 28% faster
- Process.name() is 25% faster
- Process.num_threads is 20% faster on Python 3
+- 819_, [Linux]: different speedup improvements:
+ `Process.ppid()`_ +20% faster.
+ `Process.status()`_ +28% faster.
+ `Process.name()`_ +25% faster.
+ `Process.num_threads()`_ +20% faster on Python 3.
**Bug fixes**
-- 810_: [Windows] Windows wheels are incompatible with pip 7.1.2.
-- 812_: [NetBSD] fix compilation on NetBSD-5.x.
-- 823_: [NetBSD] virtual_memory() raises TypeError on Python 3.
-- 829_: [UNIX] psutil.disk_usage() percent field takes root reserved space
+- 810_, [Windows]: Windows wheels are incompatible with pip 7.1.2.
+- 812_, [NetBSD], **[critical]**: fix compilation on NetBSD-5.x.
+- 823_, [NetBSD]: `virtual_memory()`_ raises ``TypeError`` on Python 3.
+- 829_, [POSIX]: `disk_usage()`_ ``percent`` field takes root reserved space
into account.
-- 816_: [Windows] fixed net_io_counter() values wrapping after 4.3GB in
+- 816_, [Windows]: fixed `net_io_counters()`_ values wrapping after 4.3GB in
Windows Vista (NT 6.0) and above using 64bit values from newer win APIs.
4.2.0
@@ -1052,20 +1064,20 @@ XXXX-XX-XX
**Enhancements**
-- 795_: [Windows] new APIs to deal with Windows services: win_service_iter()
- and win_service_get().
-- 800_: [Linux] psutil.virtual_memory() returns a new "shared" memory field.
-- 819_: [Linux] speedup /proc parsing:
- - Process.ppid() is 20% faster
- - Process.status() is 28% faster
- - Process.name() is 25% faster
- - Process.num_threads is 20% faster on Python 3
+- 795_, [Windows]: new APIs to deal with Windows services: `win_service_iter()`_
+ and `win_service_get()`_.
+- 800_, [Linux]: `virtual_memory()`_ returns a new ``shared`` memory field.
+- 819_, [Linux]: speedup ``/proc`` parsing:
+ `Process.ppid()`_ +20% faster.
+ `Process.status()`_ +28% faster.
+ `Process.name()`_ +25% faster.
+ `Process.num_threads()`_ +20% faster on Python 3.
**Bug fixes**
-- 797_: [Linux] net_if_stats() may raise OSError for certain NIC cards.
-- 813_: Process.as_dict() should ignore extraneous attribute names which gets
- attached to the Process instance.
+- 797_, [Linux]: `net_if_stats()`_ may raise ``OSError`` for certain NIC cards.
+- 813_: `Process.as_dict()`_ should ignore extraneous attribute names which gets
+ attached to the `Process`_ instance.
4.1.0
=====
@@ -1074,25 +1086,26 @@ XXXX-XX-XX
**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 macOS 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.
+- 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 macOS and Windows).
+- 789_, [Windows]: `cpu_times()`_ return two new fields: ``interrupt`` and
+ ``dpc``. Same for `cpu_times_percent()`_.
+- 792_: new `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
+- 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.
+- 776_, [Linux]: `Process.cpu_affinity()`_ may erroneously raise `NoSuchProcess`_.
(patch by wxwright)
-- 780_: [macOS] 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_: [macOS] psutil won't compile on macOS 10.4.
+- 780_, [macOS]: psutil does not compile with some GCC versions.
+- 786_: `net_if_addrs()`_ may report incomplete MAC addresses.
+- 788_, [NetBSD]: `virtual_memory()`_ ``buffers`` and ``shared`` values were
+ set to 0.
+- 790_, [macOS], **[critical]**: psutil won't compile on macOS 10.4.
4.0.0
=====
@@ -1101,41 +1114,43 @@ XXXX-XX-XX
**Enhancements**
-- 523_: [Linux, FreeBSD] disk_io_counters() return a new "busy_time" field.
-- 660_: [Windows] make.bat is smarter in finding alternative VS install
+- 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, macOS, Windows] Process USS and PSS (Linux) "real" memory stats.
- (patch by Eric Rahm)
-- 755_: Process.memory_percent() "memtype" parameter.
+- 732_: `Process.environ()`_. (patch by Frank Benkstein)
+- 753_, [Linux], [macOS], [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.macOS, etc.)
-- 756_: [Linux] disk_io_counters() return 2 new fields: read_merged_count and
- write_merged_count.
-- 762_: new scripts/procsmem.py script.
+- 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 `procsmem.py`_ script.
**Bug fixes**
-- 685_: [Linux] virtual_memory() provides wrong results on systems with a lot
+- 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
+- 704_, [SunOS]: psutil does not compile on Solaris sparc.
+- 734_: on Python 3 invalid UTF-8 data is not correctly handled for
+ `Process.name()`_, `Process.cwd()`_, `Process.exe()`_, `Process.cmdline()`_
+ and `Process.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, `Process.cmdline()`_ and `Process.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]: `Process.cmdline()`_ can be wrong in case of zombie process.
+- 759_, [Linux]: `Process.memory_maps()`_ may return paths ending with ``" (deleted)"``.
+- 761_, [Windows]: `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.
+- 770_, [NetBSD]: `disk_io_counters()`_ metrics didn't update.
3.4.2
=====
@@ -1144,13 +1159,14 @@ XXXX-XX-XX
**Enhancements**
-- 728_: [Solaris] exposed psutil.PROCFS_PATH constant to change the default
- location of /proc filesystem.
+- 728_, [SunOS]: exposed `PROCFS_PATH`_ constant to change the default
+ location of ``/proc`` filesystem.
**Bug fixes**
-- 724_: [FreeBSD] psutil.virtual_memory().total is incorrect.
-- 730_: [FreeBSD] psutil.virtual_memory() crashes.
+- 724_, [FreeBSD]: `virtual_memory()`_ ``total`` is incorrect.
+- 730_, [FreeBSD], **[critical]**: `virtual_memory()`_ crashes with
+ "OSError: [Errno 12] Cannot allocate memory".
3.4.1
=====
@@ -1159,21 +1175,22 @@ XXXX-XX-XX
**Enhancements**
-- 557_: [NetBSD] added NetBSD support. (contributed by Ryo Onodera and
+- 557_, [NetBSD]: added NetBSD support. (contributed by Ryo Onodera and
Thomas Klausner)
-- 708_: [Linux] psutil.net_connections() and Process.connections() on Python 2
+- 708_, [Linux]: `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.
+ Also `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.
+- 714_, [OpenBSD]: `virtual_memory()`_ ``cached`` value was always set to 0.
+- 715_, **[critical]**: 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.
3.3.0
=====
@@ -1182,13 +1199,13 @@ XXXX-XX-XX
**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)
+- 558_, [Linux]: exposed `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.
+- 692_, [POSIX]: `Process.name()`_ is no longer cached as it may change.
3.2.2
=====
@@ -1197,15 +1214,15 @@ XXXX-XX-XX
**Bug fixes**
-- 517_: [SunOS] net_io_counters failed to detect network interfaces
+- 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
+- 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
+- 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
+- 678_, [Linux], **[critical]**: 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
@@ -1215,7 +1232,7 @@ XXXX-XX-XX
**Bug fixes**
-- 677_: [Linux] can't install psutil due to bug in setup.py.
+- 677_, [Linux], **[critical]**: can't install psutil due to bug in setup.py.
3.2.0
=====
@@ -1224,37 +1241,32 @@ XXXX-XX-XX
**Enhancements**
-- 644_: [Windows] added support for CTRL_C_EVENT and CTRL_BREAK_EVENT signals
- to use with Process.send_signal().
+- 644_, [Windows]: added support for ``CTRL_C_EVENT`` and ``CTRL_BREAK_EVENT``
+ signals to use with `Process.send_signal()`_.
- 648_: CI test integration for macOS. (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
+- 663_, [POSIX]: `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()
+ `net_if_addrs()`_, `net_if_stats()`_, `net_io_counters()`_,
+ `Process.cmdline()`_, `Process.name()`_, `Process.username()`_, `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
+- 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
+- 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.
+- 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
+- 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.
+- 675_, [Linux]: `net_connections()`_: ``UnicodeDecodeError`` may occur when
+ listing UNIX sockets.
3.1.1
=====
@@ -1263,9 +1275,10 @@ XXXX-XX-XX
**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.
+- 603_, [Linux]: `Process.ionice()`_ set value range is incorrect.
+ (patch by spacewander)
+- 645_, [Linux]: `cpu_times_percent()`_ may produce negative results.
+- 656_: ``from psutil import *`` does not work.
3.1.0
=====
@@ -1274,8 +1287,8 @@ XXXX-XX-XX
**Enhancements**
-- 534_: [Linux] disk_partitions() added support for ZFS filesystems.
-- 646_: continuous tests integration for Windows with
+- 534_, [Linux]: `disk_partitions()`_ added support for ZFS filesystems.
+- 646_, [Windows]: continuous tests integration for Windows with
https://ci.appveyor.com/project/giampaolo/psutil.
- 647_: new dev guide:
https://github.com/giampaolo/psutil/blob/master/docs/DEVGUIDE.rst
@@ -1283,20 +1296,20 @@ XXXX-XX-XX
**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
+- 340_, [Windows], **[critical]**: `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)
+- 627_, [Windows]: `Process.name()`_ no longer raises `AccessDenied`_ for pids
+ owned by another user.
+- 636_, [Windows]: `Process.memory_info()`_ raise `AccessDenied`_.
+- 637_, [POSIX]: raise exception if trying to send signal to PID 0 as it will
+ affect ``os.getpid()`` 's process group and not 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.
+- 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
=====
@@ -1305,10 +1318,10 @@ XXXX-XX-XX
**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.
+- 632_, [Linux]: better error message if cannot parse process UNIX connections.
+- 634_, [Linux]: `Process.cmdline()`_ does not include empty string arguments.
+- 635_, [POSIX], **[critical]**: crash on module import if ``enum`` package is
+ installed on Python < 3.4.
3.0.0
=====
@@ -1317,45 +1330,45 @@ XXXX-XX-XX
**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.
+- 250_: new `net_if_stats()`_ returning NIC statistics (``isup``, ``duplex``,
+ ``speed``, ``mtu``).
+- 376_: new `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
+ returned by `Process.ionice()`_ and `Process.nice()`_ 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, ...),
+- 581_: add ``.gitignore``. (patch by Gabi Davar)
+- 582_: connection constants returned by `net_connections()`_ and
+ `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
+- 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.
+- 629_: enhanced support for ``pytest`` and ``nose`` test runners.
+- 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 sockets instead
- of 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.
+- 428_, [POSIX], **[critical]**: correct handling of zombie processes on POSIX.
+ Introduced new `ZombieProcess`_ exception class.
+- 512_, [BSD], **[critical]**: fix segfault in `net_connections()`_.
+- 555_, [Linux]: `users()`_ correctly handles ``":0"`` as an alias for
+ ``"localhost"``.
+- 579_, [Windows]: fixed `Process.open_files()`_ for PID > 64K.
+- 579_, [Windows]: fixed many compiler warnings.
+- 585_, [FreeBSD]: `net_connections()`_ may raise ``KeyError``.
+- 586_, [FreeBSD], **[critical]**: `Process.cpu_affinity()`_ segfaults on set
+ in case an invalid CPU number is provided.
+- 593_, [FreeBSD], **[critical]**: `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()`_ with ``logical=False`` return the number of
+ sockets instead of cores.
+- 618_, [SunOS]: swap tests fail on Solaris when run as normal user.
+- 628_, [Linux]: `Process.name()`_ truncates string in case it contains spaces
+ or parentheses.
2.2.1
=====
@@ -1364,8 +1377,8 @@ XXXX-XX-XX
**Bug fixes**
-- 496_: [Linux] fix "ValueError: ambiguos inode with multiple PIDs references"
- (patch by Bruno Binet)
+- 572_, [Linux]: fix "ValueError: ambiguos inode with multiple PIDs references"
+ for `Process.connections()`_. (patch by Bruno Binet)
2.2.0
=====
@@ -1375,34 +1388,35 @@ XXXX-XX-XX
**Enhancements**
- 521_: drop support for Python 2.4 and 2.5.
-- 553_: new examples/pstree.py script.
+- 553_: new `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.
+- 568_: new `pidof.py`_ script.
+- 569_, [FreeBSD]: add support for `Process.cpu_affinity`_ on FreeBSD.
**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.
+- 496_, [SunOS], **[critical]**: can't import psutil.
+- 547_, [POSIX]: `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.
+- 565_, [Windows]: use proper encoding for `Process.username()`_ and `users()`_.
+ (patch by Sylvain Mouquet)
+- 567_, [Linux]: in the alternative implementation of `Process.cpu_affinity`_
+ ``PyList_Append`` and ``Py_BuildValue`` return values are not checked.
+- 569_, [FreeBSD]: fix memory leak in `cpu_count()`_ with ``logical=False``.
+- 571_, [Linux]: `Process.open_files()`_ might swallow `AccessDenied`_
+ exceptions and return an incomplete list of open files.
2.1.3
=====
*2014-09-26*
-- 536_: [Linux]: fix "undefined symbol: CPU_ALLOC" compilation error.
+- 536_, [Linux], **[critical]**: fix "undefined symbol: CPU_ALLOC" compilation
+ error.
2.1.2
=====
@@ -1413,26 +1427,27 @@ XXXX-XX-XX
- 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.
+- 492_: use ``tox`` to run tests on multiple Python versions. (patch by msabramo)
+- 505_, [Windows]: distribution as wheel packages.
+- 511_: add `ps.py`_ script.
**Bug fixes**
-- 340_: [Windows] Process.get_open_files() no longer hangs. (patch by
+- 340_, [Windows]: `Process.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
+- 501_, [Windows]: `disk_io_counters()`_ may return negative values.
+- 503_, [Linux]: in rare conditions `Process.exe()`_, `Process.open_files()`_ and
+ `Process.connections()`_ can raise ``OSError(ESRCH)`` instead of `NoSuchProcess`_.
+- 504_, [Linux]: can't build RPM packages via setup.py
+- 506_, [Linux], **[critical]**: 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
+- 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
+- 530_, [Linux]: `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.
+- 533_, [Linux]: `Process.memory_maps()`_ may raise ``TypeError`` on old Linux
+ distros.
2.1.1
=====
@@ -1441,10 +1456,10 @@ XXXX-XX-XX
**Bug fixes**
-- 446_: [Windows] fix encoding error when using net_io_counters() on Python 3.
+- 446_, [Windows]: fix encoding error when using `net_io_counters()`_ on Python 3.
(patch by Szigeti Gabor Niif)
-- 460_: [Windows] net_io_counters() wraps after 4G.
-- 491_: [Linux] psutil.net_connections() exceptions. (patch by Alexander Grothe)
+- 460_, [Windows]: `net_io_counters()`_ wraps after 4G.
+- 491_, [Linux]: `net_connections()`_ exceptions. (patch by Alexander Grothe)
2.1.0
=====
@@ -1453,13 +1468,13 @@ XXXX-XX-XX
**Enhancements**
-- 387_: system-wide open connections a-la netstat.
+- 387_: system-wide open connections a-la ``netstat`` (add `net_connections()`_).
**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.
+- 421_, [SunOS], **[critical]**: psutil does not compile on SunOS 5.10.
+ (patch by Naveed Roudsari)
+- 489_, [Linux]: `disk_partitions()`_ return an empty list.
2.0.0
=====
@@ -1468,75 +1483,75 @@ XXXX-XX-XX
**Enhancements**
-- 424_: [Windows] installer for Python 3.X 64 bit.
-- 427_: number of logical CPUs and physical cores (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
+- 424_, [Windows]: installer for Python 3.X 64 bit.
+- 427_: number of logical CPUs and physical cores (`cpu_count()`_).
+- 447_: `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 Makefile 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.
+- 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.
+- 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
+- 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
+- 340_, [Windows]: `Process.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.
+- 443_, [Linux]: fix a potential overflow issue for `Process.cpu_affinity()`_
+ (set) on systems with more than 64 CPUs.
+- 448_, [Windows]: `Process.children()`_ and `Process.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
+- 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
+- 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.
+- 473_: `psutil.Popen`_ ``wait()`` method does not set returncode attribute.
+- 474_, [Windows]: `Process.cpu_percent()`_ is no longer capped at 100%.
+- 476_, [Linux]: encoding error for `Process.name()`_ and `Process.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()":
+``DeprecationWarning``.
+
+- ``psutil.*`` module level constants have being replaced by functions:
+
+ +-----------------------+----------------------------------+
+ | Old name | Replacement |
+ +=======================+==================================+
+ | psutil.NUM_CPUS | psutil.cpu_count() |
+ +-----------------------+----------------------------------+
+ | psutil.BOOT_TIME | psutil.boot_time() |
+ +-----------------------+----------------------------------+
+ | psutil.TOTAL_PHYMEM | 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 `Process`_ ``get_*`` methods lost the ``get_`` prefix.
+ E.g. ``get_ext_memory_info()`` was renamed to ``memory_info_ex()``.
+ Assuming ``p = psutil.Process()``:
+--------------------------+----------------------+
| Old name | Replacement |
@@ -1580,8 +1595,8 @@ DeprecationWarning.
| p.getcwd() | p.cwd() |
+--------------------------+----------------------+
-- All psutil.Process ``set_*`` methods lost the ``set_`` prefix.
- Assuming "p = psutil.Process()":
+- All `Process`_ ``set_*`` methods lost the ``set_`` prefix.
+ Assuming ``p = psutil.Process()``:
+----------------------+---------------------------------+
| Old name | Replacement |
@@ -1595,9 +1610,9 @@ DeprecationWarning.
| p.set_rlimit() | p.rlimit(resource, limits=None) |
+----------------------+---------------------------------+
-- Except for 'pid' all psutil.Process class properties have been turned into
+- Except for ``pid``, all `Process`_ class properties have been turned into
methods. This is the only case which there are no aliases.
- Assuming "p = psutil.Process()":
+ Assuming ``p = psutil.Process()``:
+---------------+-----------------+
| Old name | Replacement |
@@ -1623,11 +1638,11 @@ DeprecationWarning.
| p.create_time | p.create_time() |
+---------------+-----------------+
-- 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
+- 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.
+- `Process`_ instances' ``retcode`` attribute returned by `wait_procs()`_ has
+ been renamed to ``returncode`` for consistency with ``subprocess.Popen``.
1.2.1
=====
@@ -1636,10 +1651,12 @@ DeprecationWarning.
**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.
+- 348_, [Windows], **[critical]**: fixed "ImportError: DLL load failed" occurring
+ on module import on Windows XP.
+- 425_, [SunOS], **[critical]**: crash on import due to failure at determining
+ ``BOOT_TIME``.
+- 443_, [Linux]: `Process.cpu_affinity()`_ can't set affinity on systems with
+ more than 64 cores.
1.2.0
=====
@@ -1648,15 +1665,15 @@ DeprecationWarning.
**Enhancements**
-- 439_: assume os.getpid() if no argument is passed to psutil.Process
+- 439_: assume ``os.getpid()`` if no argument is passed to `Process`_ class
constructor.
-- 440_: new psutil.wait_procs() utility function which waits for multiple
+- 440_: new `wait_procs()`_ utility function which waits for multiple
processes to terminate.
**Bug fixes**
-- 348_: [Windows XP/Vista] fix "ImportError: DLL load failed" occurring on
- module import.
+- 348_, [Windows]: fix "ImportError: DLL load failed" occurring on module
+ import on Windows XP / Vista.
1.1.3
=====
@@ -1665,8 +1682,8 @@ DeprecationWarning.
**Bug fixes**
-- 442_: [Linux] psutil won't compile on certain version of Linux because of
- missing prlimit(2) syscall.
+- 442_, [Linux], **[critical]**: psutil won't compile on certain version of
+ Linux because of missing ``prlimit(2)`` syscall.
1.1.2
=====
@@ -1675,8 +1692,8 @@ DeprecationWarning.
**Bug fixes**
-- 442_: [Linux] psutil won't compile on Debian 6.0 because of missing
- prlimit(2) syscall.
+- 442_, [Linux], **[critical]**: psutil won't compile on Debian 6.0 because of
+ missing ``prlimit(2)`` syscall.
1.1.1
=====
@@ -1685,8 +1702,8 @@ DeprecationWarning.
**Bug fixes**
-- 442_: [Linux] psutil won't compile on kernels < 2.6.36 due to missing
- prlimit(2) syscall.
+- 442_, [Linux], **[critical]**: psutil won't compile on kernels < 2.6.36 due
+ to missing ``prlimit(2)`` syscall.
1.1.0
=====
@@ -1695,28 +1712,28 @@ DeprecationWarning.
**Enhancements**
-- 410_: host tar.gz and windows binary files are 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.
+- 410_: host tar.gz and Windows binary files are on PyPI.
+- 412_, [Linux]: get/set process resource limits (`Process.rlimit()`_).
+- 415_, [Windows]: `Process.children()`_ is an order of magnitude faster.
+- 426_, [Windows]: `Process.name()`_ is an order of magnitude faster.
+- 431_, [POSIX]: `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.
+- 391_, [Windows]: `cpu_times_percent()`_ returns negative percentages.
+- 408_: ``STATUS_*`` and ``CONN_*`` constants don't properly serialize on JSON.
+- 411_, [Windows]: `disk_usage.py`_ may pop-up a GUI error.
+- 413_, [Windows]: `Process.memory_info()`_ leaks memory.
+- 414_, [Windows]: `Process.exe()`_ on Windows XP may raise ``ERROR_INVALID_PARAMETER``.
+- 416_: `disk_usage()`_ doesn't work well with unicode path names.
+- 430_, [Linux]: `Process.io_counters()`_ report wrong number of r/w syscalls.
+- 435_, [Linux]: `net_io_counters()`_ might report erreneous NIC names.
+- 436_, [Linux]: `net_io_counters()`_ reports a wrong ``dropin`` value.
**API changes**
-- 408_: turn STATUS_* and CONN_* constants into plain Python strings.
+- 408_: turn ``STATUS_*`` and ``CONN_*`` constants into plain Python strings.
1.0.1
=====
@@ -1725,7 +1742,7 @@ DeprecationWarning.
**Bug fixes**
-- 405_: network_io_counters(pernic=True) no longer works as intended in 1.0.0.
+- 405_: `net_io_counters()`_ ``pernic=True`` no longer works as intended in 1.0.0.
1.0.0
=====
@@ -1734,27 +1751,28 @@ DeprecationWarning.
**Enhancements**
-- 18_: Solaris support (yay!) (thanks Justin Venus)
-- 367_: Process.get_connections() 'status' strings are now constants.
+- 18_, [SunOS]: add Solaris support (yay!) (thanks Justin Venus)
+- 367_: `Process.connections()`_ ``status`` strings are now constants.
- 380_: test suite exits with non-zero on failure. (patch by floppymaster)
- 391_: introduce unittest2 facilities and provide workarounds if unittest2
- is not installed (python < 2.7).
+ is not installed (Python < 2.7).
**Bug fixes**
-- 374_: [Windows] negative memory usage reported if process uses a lot of
+- 374_, [Windows]: negative memory usage reported if process uses a lot of
memory.
-- 379_: [Linux] Process.get_memory_maps() may raise ValueError.
-- 394_: [macOS] Mapped memory regions report incorrect file name.
-- 404_: [Linux] sched_*affinity() are implicitly declared. (patch by Arfrever)
+- 379_, [Linux]: `Process.memory_maps()`_ may raise ``ValueError``.
+- 394_, [macOS]: mapped memory regions of `Process.memory_maps()`_ report
+ incorrect file name.
+- 404_, [Linux]: ``sched_*affinity()`` are implicitly declared. (patch by Arfrever)
**API changes**
-- Process.get_connections() 'status' field is no longer a string but a
- constant object (psutil.CONN_*).
-- Process.get_connections() 'local_address' and 'remote_address' fields
- renamed to 'laddr' and 'raddr'.
-- psutil.network_io_counters() renamed to psutil.net_io_counters().
+- `Process.connections()`_ ``status`` field is no longer a string but a
+ constant object (``psutil.CONN_*``).
+- `Process.connections()`_ ``local_address`` and ``remote_address`` fields
+ renamed to ``laddr`` and ``raddr``.
+- psutil.network_io_counters() renamed to `net_io_counters()`_.
0.7.1
=====
@@ -1763,11 +1781,11 @@ DeprecationWarning.
**Bug fixes**
-- 325_: [BSD] psutil.virtual_memory() can raise SystemError.
+- 325_, [BSD], **[critical]**: `virtual_memory()`_ can raise ``SystemError``.
(patch by Jan Beich)
-- 370_: [BSD] Process.get_connections() requires root. (patch by John Baldwin)
-- 372_: [BSD] different process methods raise NoSuchProcess instead of
- AccessDenied.
+- 370_, [BSD]: `Process.connections()`_ requires root. (patch by John Baldwin)
+- 372_, [BSD]: different process methods raise `NoSuchProcess`_ instead of
+ `AccessDenied`_.
0.7.0
=====
@@ -1778,59 +1796,63 @@ DeprecationWarning.
- 233_: code migrated to Mercurial (yay!)
- 246_: psutil.error module is deprecated and scheduled for removal.
-- 328_: [Windows] process IO nice/priority support.
-- 359_: psutil.get_boot_time()
-- 361_: [Linux] psutil.cpu_times() now includes new 'steal', 'guest' and
- 'guest_nice' fields available on recent Linux kernels.
- Also, psutil.cpu_percent() is more accurate.
-- 362_: cpu_times_percent() (per-CPU-time utilization as a percentage)
+- 328_, [Windows]: `Process.ionice()`_ support.
+- 359_: add `boot_time()`_ as a substitute of ``psutil.BOOT_TIME`` since the
+ latter cannot reflect system clock updates.
+- 361_, [Linux]: `cpu_times()`_ now includes new ``steal``, ``guest`` and
+ ``guest_nice`` fields available on recent Linux kernels. Also, `cpu_percent()`_
+ is more accurate.
+- 362_: add `cpu_times_percent()`_ (per-CPU-time utilization as a percentage).
**Bug fixes**
-- 234_: [Windows] disk_io_counters() fails to list certain disks.
-- 264_: [Windows] use of psutil.disk_partitions() may cause a message box to
+- 234_, [Windows]: `disk_io_counters()`_ fails to list certain disks.
+- 264_, [Windows]: use of `disk_partitions()`_ may cause a message box to
appear.
-- 313_: [Linux] psutil.virtual_memory() and psutil.swap_memory() can crash on
- certain exotic Linux flavors having an incomplete /proc interface.
- If that's the case we now set the unretrievable stats to 0 and raise a
- RuntimeWarning.
-- 315_: [macOS] fix some compilation warnings.
-- 317_: [Windows] cannot set process CPU affinity above 31 cores.
-- 319_: [Linux] process get_memory_maps() raises KeyError 'Anonymous' on Debian
+- 313_, [Linux], **[critical]**: `virtual_memory()`_ and `swap_memory()`_ can
+ crash on certain exotic Linux flavors having an incomplete ``/proc`` interface.
+ If that's the case we now set the unretrievable stats to ``0`` and raise
+ ``RuntimeWarning`` instead.
+- 315_, [macOS]: fix some compilation warnings.
+- 317_, [Windows]: cannot set process CPU affinity above 31 cores.
+- 319_, [Linux]: `Process.memory_maps()`_ raises ``KeyError`` 'Anonymous' on Debian
squeeze.
-- 321_: [UNIX] Process.ppid property is no longer cached as the kernel may set
- the ppid to 1 in case of a zombie process.
-- 323_: [macOS] disk_io_counters()'s read_time and write_time parameters were
- reporting microseconds not milliseconds. (patch by Gregory Szorc)
-- 331_: Process cmdline is no longer cached after first acces as it may change.
-- 333_: [macOS] Leak of Mach ports on macOS (patch by rsesek@google.com)
-- 337_: [Linux] process methods not working because of a poor /proc
- implementation will raise NotImplementedError rather than RuntimeError
- and Process.as_dict() will not blow up. (patch by Curtin1060)
-- 338_: [Linux] disk_io_counters() fails to find some disks.
-- 339_: [FreeBSD] get_pid_list() can allocate all the memory on system.
-- 341_: [Linux] psutil might crash on import due to error in retrieving system
- terminals map.
-- 344_: [FreeBSD] swap_memory() might return incorrect results due to
- kvm_open(3) not being called. (patch by Jean Sebastien)
-- 338_: [Linux] disk_io_counters() fails to find some disks.
-- 351_: [Windows] if psutil is compiled with mingw32 (provided installers for
- py2.4 and py2.5 are) disk_io_counters() will fail. (Patch by m.malycha)
-- 353_: [macOS] get_users() returns an empty list on macOS 10.8.
-- 356_: Process.parent now checks whether parent PID has been reused in which
- case returns None.
-- 365_: Process.set_nice() should check PID has not been reused by another
+- 321_, [POSIX]: `Process.ppid()`_ property is no longer cached as the kernel may set
+ the PPID to 1 in case of a zombie process.
+- 323_, [macOS]: `disk_io_counters()`_ ``read_time`` and ``write_time``
+ parameters were reporting microseconds not milliseconds. (patch by Gregory Szorc)
+- 331_: `Process.cmdline()`_ is no longer cached after first acces as it may
+ change.
+- 333_, [macOS]: leak of Mach ports (patch by rsesek@google.com)
+- 337_, [Linux], **[critical]**: `Process`_ methods not working because of a
+ poor ``/proc`` implementation will raise ``NotImplementedError`` rather than
+ ``RuntimeError`` and `Process.as_dict()`_ will not blow up.
+ (patch by Curtin1060)
+- 338_, [Linux]: `disk_io_counters()`_ fails to find some disks.
+- 339_, [FreeBSD]: ``get_pid_list()`` can allocate all the memory on system.
+- 341_, [Linux], **[critical]**: psutil might crash on import due to error in
+ retrieving system terminals map.
+- 344_, [FreeBSD]: `swap_memory()`_ might return incorrect results due to
+ ``kvm_open(3)`` not being called. (patch by Jean Sebastien)
+- 338_, [Linux]: `disk_io_counters()`_ fails to find some disks.
+- 351_, [Windows]: if psutil is compiled with MinGW32 (provided installers for
+ py2.4 and py2.5 are) `disk_io_counters()`_ will fail. (Patch by m.malycha)
+- 353_, [macOS]: `users()`_ returns an empty list on macOS 10.8.
+- 356_: `Process.parent()`_ now checks whether parent PID has been reused in which
+ case returns ``None``.
+- 365_: `Process.nice()`_ (set) should check PID has not been reused by another
process.
-- 366_: [FreeBSD] get_memory_maps(), get_num_fds(), get_open_files() and
- getcwd() Process methods raise RuntimeError instead of AccessDenied.
+- 366_, [FreeBSD], **[critical]**: `Process.memory_maps()`_, `Process.num_fds()`_,
+ `Process.open_files()`_ and `Process.cwd()`_ methods raise ``RuntimeError``
+ instead of `AccessDenied`_.
**API changes**
-- Process.cmdline property is no longer cached after first access.
-- Process.ppid property is no longer cached after first access.
-- [Linux] Process methods not working because of a poor /proc implementation
- will raise NotImplementedError instead of RuntimeError.
-- psutil.error module is deprecated and scheduled for removal.
+- `Process.cmdline()`_ property is no longer cached after first access.
+- `Process.ppid()`_ property is no longer cached after first access.
+- [Linux] `Process`_ methods not working because of a poor ``/proc``
+ implementation will raise ``NotImplementedError`` instead of ``RuntimeError``.
+- ``psutil.error`` module is deprecated and scheduled for removal.
0.6.1
=====
@@ -1839,18 +1861,18 @@ DeprecationWarning.
**Enhancements**
-- 316_: process cmdline property now makes a better job at guessing the process
- executable from the cmdline.
+- 316_: `Process.cmdline()`_ property now makes a better job at guessing the
+ process executable from the cmdline.
**Bug fixes**
-- 316_: process exe was resolved in case it was a symlink.
-- 318_: python 2.4 compatibility was broken.
+- 316_: `Process.exe()`_ was resolved in case it was a symlink.
+- 318_, **[critical]**: Python 2.4 compatibility was broken.
**API changes**
-- process exe can now return an empty string instead of raising AccessDenied.
-- process exe is no longer resolved in case it's a symlink.
+- `Process.exe()`_ can now return an empty string instead of raising `AccessDenied`_.
+- `Process.exe()`_ is no longer resolved in case it's a symlink.
0.6.0
=====
@@ -1859,87 +1881,62 @@ DeprecationWarning.
**Enhancements**
-- 216_: [POSIX] get_connections() UNIX sockets support.
-- 220_: [FreeBSD] get_connections() has been rewritten in C and no longer
- requires lsof.
-- 222_: [macOS] add support for process cwd.
-- 261_: process extended memory info.
-- 295_: [macOS] process executable path is now determined by asking the OS
- instead of being guessed from process cmdline.
-- 297_: [macOS] the Process methods below were always raising AccessDenied for
- any process except the current one. Now this is no longer true. Also
- they are 2.5x faster.
- - name
- - get_memory_info()
- - get_memory_percent()
- - get_cpu_times()
- - get_cpu_percent()
- - get_num_threads()
-- 300_: examples/pmap.py script.
-- 301_: process_iter() now yields processes sorted by their PIDs.
-- 302_: process number of voluntary and involuntary context switches.
-- 303_: [Windows] the Process methods below were always raising AccessDenied
+- 216_, [POSIX]: `Process.connections()`_ UNIX sockets support.
+- 220_, [FreeBSD]: ``get_connections()`` has been rewritten in C and no longer
+ requires ``lsof``.
+- 222_, [macOS]: add support for `Process.cwd()`_.
+- 261_: per-process extended memory info (`Process.memory_info_ex()`_).
+- 295_, [macOS]: `Process.exe()`_ path is now determined by asking the OS
+ instead of being guessed from `Process.cmdline()`_.
+- 297_, [macOS]: the `Process`_ methods below were always raising `AccessDenied`_
+ for any process except the current one. Now this is no longer true. Also
+ they are 2.5x faster. `Process.name()`_, `Process.memory_info()`_,
+ `Process.memory_percent()`_, `Process.cpu_times()`_, `Process.cpu_percent()`_,
+ `Process.num_threads()`_.
+- 300_: add `pmap.py`_ script.
+- 301_: `process_iter()`_ now yields processes sorted by their PIDs.
+- 302_: per-process number of voluntary and involuntary context switches
+ (`Process.num_ctx_switches()`_).
+- 303_, [Windows]: the `Process`_ methods below were always raising `AccessDenied`_
for any process not owned by current user. Now this is no longer true:
- - create_time
- - get_cpu_times()
- - get_cpu_percent()
- - get_memory_info()
- - get_memory_percent()
- - get_num_handles()
- - get_io_counters()
-- 305_: add examples/netstat.py script.
+ `Process.create_time()`_, `Process.cpu_times()`_, `Process.cpu_percent()`_,
+ `Process.memory_info()`_, `Process.memory_percent()`_, `Process.num_handles()`_,
+ `Process.io_counters()`_.
+- 305_: add `netstat.py`_ script.
- 311_: system memory functions has been refactorized and rewritten and now
provide a more detailed and consistent representation of the system
- memory. New psutil.virtual_memory() function provides the following
- memory amounts:
- - total
- - available
- - percent
- - used
- - active [POSIX]
- - inactive [POSIX]
- - buffers (BSD, Linux)
- - cached (BSD, macOS)
- - wired (macOS, BSD)
- - shared [FreeBSD]
- New psutil.swap_memory() provides:
- - total
- - used
- - free
- - percent
- - sin (no. of bytes the system has swapped in from disk (cumulative))
- - sout (no. of bytes the system has swapped out from disk (cumulative))
- All old memory-related functions are deprecated.
- Also two new example scripts were added: free.py and meminfo.py.
-- 312_: psutil.network_io_counters() namedtuple includes 4 new fields:
- errin, errout dropin and dropout, reflecting the number of packets
- dropped and with errors.
+ memory. Added new `virtual_memory()`_ and `swap_memory()`_ functions.
+ All old memory-related functions are deprecated. Also two new example scripts
+ were added: `free.py`_ and `meminfo.py`_.
+- 312_: ``net_io_counters()`` namedtuple includes 4 new fields:
+ ``errin``, ``errout``, ``dropin`` and ``dropout``, reflecting the number of
+ packets dropped and with errors.
**Bug fixes**
-- 298_: [macOS and BSD] memory leak in get_num_fds().
-- 299_: potential memory leak every time PyList_New(0) is used.
-- 303_: [Windows] potential heap corruption in get_num_threads() and
- get_status() Process methods.
-- 305_: [FreeBSD] psutil can't compile on FreeBSD 9 due to removal of utmp.h.
-- 306_: at C level, errors are not checked when invoking Py* functions which
- create or manipulate Python objects leading to potential memory related
- errors and/or segmentation faults.
-- 307_: [FreeBSD] values returned by psutil.network_io_counters() are wrong.
-- 308_: [BSD / Windows] psutil.virtmem_usage() wasn't actually returning
- information about swap memory usage as it was supposed to do. It does
- now.
-- 309_: get_open_files() might not return files which can not be accessed
- due to limited permissions. AccessDenied is now raised instead.
+- 298_, [macOS], [BSD]: memory leak in `Process.num_fds()`_.
+- 299_: potential memory leak every time ``PyList_New(0)`` is used.
+- 303_, [Windows], **[critical]**: potential heap corruption in
+ `Process.num_threads()`_ and `Process.status()`_ methods.
+- 305_, [FreeBSD], **[critical]**: can't compile on FreeBSD 9 due to removal of
+ ``utmp.h``.
+- 306_, **[critical]**: at C level, errors are not checked when invoking ``Py*``
+ functions which create or manipulate Python objects leading to potential
+ memory related errors and/or segmentation faults.
+- 307_, [FreeBSD]: values returned by `net_io_counters()`_ are wrong.
+- 308_, [BSD], [Windows]: ``psutil.virtmem_usage()`` wasn't actually returning
+ information about swap memory usage as it was supposed to do. It does now.
+- 309_: `Process.open_files()`_ might not return files which can not be accessed
+ due to limited permissions. `AccessDenied`_ is now raised instead.
**API changes**
-- psutil.phymem_usage() is deprecated (use psutil.virtual_memory())
-- psutil.virtmem_usage() is deprecated (use psutil.swap_memory())
-- psutil.phymem_buffers() on Linux is deprecated (use psutil.virtual_memory())
-- psutil.cached_phymem() on Linux is deprecated (use psutil.virtual_memory())
-- [Windows and BSD] psutil.virtmem_usage() now returns information about swap
- memory instead of virtual memory.
+- ``psutil.phymem_usage()`` is deprecated (use `virtual_memory()`_)
+- ``psutil.virtmem_usage()`` is deprecated (use `swap_memory()`_)
+- [Linux]: ``psutil.phymem_buffers()`` is deprecated (use `virtual_memory()`_)
+- [Linux]: ``psutil.cached_phymem()`` is deprecated (use `virtual_memory()`_)
+- [Windows], [BSD]: ``psutil.virtmem_usage()`` now returns information about
+ swap memory instead of virtual memory.
0.5.1
=====
@@ -1948,13 +1945,14 @@ DeprecationWarning.
**Enhancements**
-- 293_: [Windows] process executable path is now determined by asking the OS
- instead of being guessed from process cmdline.
+- 293_, [Windows]: `Process.exe()`_ path is now determined by asking the OS
+ instead of being guessed from `Process.cmdline()`_.
**Bug fixes**
-- 292_: [Linux] race condition in process files/threads/connections.
-- 294_: [Windows] Process CPU affinity is only able to set CPU #0.
+- 292_, [Linux]: race condition in process `Process.open_files()`_,
+ `Process.connections()`_, `Process.threads()`_.
+- 294_, [Windows]: `Process.cpu_affinity()`_ is only able to set CPU #0.
0.5.0
=====
@@ -1963,67 +1961,69 @@ DeprecationWarning.
**Enhancements**
-- 195_: [Windows] number of handles opened by process.
-- 209_: psutil.disk_partitions() now provides also mount options.
-- 229_: list users currently connected on the system (psutil.get_users()).
-- 238_: [Linux, Windows] process CPU affinity (get and set).
-- 242_: Process.get_children(recursive=True): return all process
+- 195_, [Windows]: number of handles opened by process (`Process.num_handles()`_).
+- 209_: `disk_partitions()`_ now provides also mount options.
+- 229_: list users currently connected on the system (`users()`_).
+- 238_, [Linux], [Windows]: process CPU affinity (get and set,
+ `Process.cpu_affinity()`_).
+- 242_: add ``recursive=True`` to `Process.children()`_: return all process
descendants.
-- 245_: [POSIX] Process.wait() incrementally consumes less CPU cycles.
-- 257_: [Windows] removed Windows 2000 support.
-- 258_: [Linux] Process.get_memory_info() is now 0.5x faster.
+- 245_, [POSIX]: `Process.wait()`_ incrementally consumes less CPU cycles.
+- 257_, [Windows]: removed Windows 2000 support.
+- 258_, [Linux]: `Process.memory_info()`_ is now 0.5x faster.
- 260_: process's mapped memory regions. (Windows patch by wj32.64, macOS patch
by Jeremy Whitlock)
-- 262_: [Windows] psutil.disk_partitions() was slow due to inspecting the
- floppy disk drive also when "all" argument was False.
-- 273_: psutil.get_process_list() is deprecated.
-- 274_: psutil no longer requires 2to3 at installation time in order to work
+- 262_, [Windows]: `disk_partitions()`_ was slow due to inspecting the
+ floppy disk drive also when parameter is ``all=False``.
+- 273_: ``psutil.get_process_list()`` is deprecated.
+- 274_: psutil no longer requires ``2to3`` at installation time in order to work
with Python 3.
-- 278_: new Process.as_dict() method.
-- 281_: ppid, name, exe, cmdline and create_time properties of Process class
+- 278_: new `Process.as_dict()`_ method.
+- 281_: `Process.ppid()`_, `Process.name()`_, `Process.exe()`_,
+ `Process.cmdline()`_ and `Process.create_time()`_ properties of `Process`_ class
are now cached after being accessed.
-- 282_: psutil.STATUS_* constants can now be compared by using their string
+- 282_: ``psutil.STATUS_*`` constants can now be compared by using their string
representation.
-- 283_: speedup Process.is_running() by caching its return value in case the
+- 283_: speedup `Process.is_running()`_ by caching its return value in case the
process is terminated.
-- 284_: [POSIX] per-process number of opened file descriptors.
-- 287_: psutil.process_iter() now caches Process instances between calls.
-- 290_: Process.nice property is deprecated in favor of new get_nice() and
- set_nice() methods.
+- 284_, [POSIX]: per-process number of opened file descriptors (`Process.num_fds`_).
+- 287_: `process_iter()`_ now caches `Process`_ instances between calls.
+- 290_: `Process.nice()`_ property is deprecated in favor of new ``get_nice()``
+ and ``set_nice()`` methods.
**Bug fixes**
-- 193_: psutil.Popen constructor can throw an exception if the spawned process
+- 193_: `psutil.Popen`_ constructor can throw an exception if the spawned process
terminates quickly.
-- 240_: [macOS] incorrect use of free() for Process.get_connections().
-- 244_: [POSIX] Process.wait() can hog CPU resources if called against a
+- 240_, [macOS]: incorrect use of ``free()`` for `Process.connections()`_.
+- 244_, [POSIX]: `Process.wait()`_ can hog CPU resources if called against a
process which is not our children.
-- 248_: [Linux] psutil.network_io_counters() might return erroneous NIC names.
-- 252_: [Windows] process getcwd() erroneously raise NoSuchProcess for
- processes owned by another user. It now raises AccessDenied instead.
-- 266_: [Windows] psutil.get_pid_list() only shows 1024 processes.
+- 248_, [Linux]: `net_io_counters()`_ might return erroneous NIC names.
+- 252_, [Windows]: `Process.cwd()`_ erroneously raise `NoSuchProcess`_ for
+ processes owned by another user. It now raises `AccessDenied`_ instead.
+- 266_, [Windows]: ``psutil.get_pid_list()`` only shows 1024 processes.
(patch by Amoser)
-- 267_: [macOS] Process.get_connections() - an erroneous remote address was
- returned. (Patch by Amoser)
-- 272_: [Linux] Porcess.get_open_files() - potential race condition can lead to
- unexpected NoSuchProcess exception. Also, we can get incorrect reports
+- 267_, [macOS]: `Process.connections()`_ returns wrong remote address.
+ (Patch by Amoser)
+- 272_, [Linux]: `Process.open_files()`_ potential race condition can lead to
+ unexpected `NoSuchProcess`_ exception. Also, we can get incorrect reports
of not absolutized path names.
-- 275_: [Linux] Process.get_io_counters() erroneously raise NoSuchProcess on
- old Linux versions. Where not available it now raises
- NotImplementedError.
-- 286_: Process.is_running() doesn't actually check whether PID has been
+- 275_, [Linux]: ``Process.io_counters()`` erroneously raise `NoSuchProcess`_ on
+ old Linux versions. Where not available it now raises ``NotImplementedError``.
+- 286_: `Process.is_running()`_ doesn't actually check whether PID has been
reused.
-- 314_: Process.get_children() can sometimes return non-children.
+- 314_: `Process.children()`_ can sometimes return non-children.
**API changes**
-- Process.nice property is deprecated in favor of new get_nice() and set_nice()
- methods.
-- psutil.get_process_list() is deprecated.
-- ppid, name, exe, cmdline and create_time properties of Process class are now
- cached after being accessed, meaning NoSuchProcess will no longer be raised
- in case the process is gone in the meantime.
-- psutil.STATUS_* constants can now be compared by using their string
+- ``Process.nice`` property is deprecated in favor of new ``get_nice()`` and
+ ``set_nice()`` methods.
+- ``psutil.get_process_list()`` is deprecated.
+- `Process.ppid()`_, `Process.name()`_, `Process.exe()`_, `Process.cmdline()`_
+ and `Process.create_time()`_ properties of `Process`_ class are now cached after
+ being accessed, meaning `NoSuchProcess`_ will no longer be raised in case the
+ process is gone in the meantime.
+- ``psutil.STATUS_*`` constants can now be compared by using their string
representation.
0.4.1
@@ -2033,12 +2033,12 @@ DeprecationWarning.
**Bug fixes**
-- 228_: some example scripts were not working with python 3.
-- 230_: [Windows / macOS] memory leak in Process.get_connections().
-- 232_: [Linux] psutil.phymem_usage() can report erroneous values which are
- different than "free" command.
-- 236_: [Windows] memory/handle leak in Process's get_memory_info(),
- suspend() and resume() methods.
+- 228_: some example scripts were not working with Python 3.
+- 230_, [Windows], [macOS]: fix memory leak in `Process.connections()`_.
+- 232_, [Linux]: ``psutil.phymem_usage()`` can report erroneous values which are
+ different than ``free`` command.
+- 236_, [Windows]: fix memory/handle leak in `Process.memory_info()`_,
+ `Process.suspend()`_ and `Process.resume()`_ methods.
0.4.0
=====
@@ -2047,38 +2047,40 @@ DeprecationWarning.
**Enhancements**
-- 150_: network I/O counters. (macOS and Windows patch by Jeremy Whitlock)
-- 154_: [FreeBSD] add support for process getcwd()
-- 157_: [Windows] provide installer for Python 3.2 64-bit.
-- 198_: Process.wait(timeout=0) can now be used to make wait() return
- immediately.
-- 206_: disk I/O counters. (macOS and Windows patch by Jeremy Whitlock)
-- 213_: examples/iotop.py script.
-- 217_: Process.get_connections() now has a "kind" argument to filter
+- 150_: network I/O counters (`net_io_counters()`_). (macOS and Windows patch
+ by Jeremy Whitlock)
+- 154_, [FreeBSD]: add support for `Process.cwd()`_.
+- 157_, [Windows]: provide installer for Python 3.2 64-bit.
+- 198_: `Process.wait()`_ with ``timeout=0`` can now be used to make the
+ function return immediately.
+- 206_: disk I/O counters (`disk_io_counters()`_). (macOS and Windows patch by
+ Jeremy Whitlock)
+- 213_: add `iotop.py`_ script.
+- 217_: `Process.connections()`_ now has a ``kind`` argument to filter
for connections with different criteria.
-- 221_: [FreeBSD] Process.get_open_files has been rewritten in C and no longer
- relies on lsof.
-- 223_: examples/top.py script.
-- 227_: examples/nettop.py script.
+- 221_, [FreeBSD]: `Process.open_files()`_ has been rewritten in C and no longer
+ relies on ``lsof``.
+- 223_: add `top.py`_ script.
+- 227_: add `nettop.py`_ script.
**Bug fixes**
-- 135_: [macOS] psutil cannot create Process object.
-- 144_: [Linux] no longer support 0 special PID.
-- 188_: [Linux] psutil import error on Linux ARM architectures.
-- 194_: [POSIX] psutil.Process.get_cpu_percent() now reports a percentage over
+- 135_, [macOS]: psutil cannot create `Process`_ object.
+- 144_, [Linux]: no longer support 0 special PID.
+- 188_, [Linux]: psutil import error on Linux ARM architectures.
+- 194_, [POSIX]: `Process.cpu_percent()`_ now reports a percentage over
100 on multicore processors.
-- 197_: [Linux] Process.get_connections() is broken on platforms not
+- 197_, [Linux]: `Process.connections()`_ is broken on platforms not
supporting IPv6.
-- 200_: [Linux] psutil.NUM_CPUS not working on armel and sparc architectures
- and causing crash on module import.
-- 201_: [Linux] Process.get_connections() is broken on big-endian
+- 200_, [Linux], **[critical]**: ``psutil.NUM_CPUS`` not working on armel and
+ sparc architectures and causing crash on module import.
+- 201_, [Linux]: `Process.connections()`_ is broken on big-endian
architectures.
-- 211_: Process instance can unexpectedly raise NoSuchProcess if tested for
- equality with another object.
-- 218_: [Linux] crash at import time on Debian 64-bit because of a missing
- line in /proc/meminfo.
-- 226_: [FreeBSD] crash at import time on FreeBSD 7 and minor.
+- 211_: `Process`_ instance can unexpectedly raise `NoSuchProcess`_ if tested
+ for equality with another object.
+- 218_, [Linux], **[critical]**: crash at import time on Debian 64-bit because
+ of a missing line in ``/proc/meminfo``.
+- 226_, [FreeBSD], **[critical]**: crash at import time on FreeBSD 7 and minor.
0.3.0
=====
@@ -2087,27 +2089,29 @@ DeprecationWarning.
**Enhancements**
-- 125_: system per-cpu percentage utilization and times.
-- 163_: per-process associated terminal (TTY).
-- 171_: added get_phymem() and get_virtmem() functions returning system
- memory information (total, used, free) and memory percent usage.
- total_* avail_* and used_* memory functions are deprecated.
-- 172_: disk usage statistics.
-- 174_: mounted disk partitions.
+- 125_: system per-cpu percentage utilization and times (`Process.cpu_times()`_,
+ `Process.cpu_percent()`_).
+- 163_: per-process associated terminal / TTY (`Process.terminal()`_).
+- 171_: added ``get_phymem()`` and ``get_virtmem()`` functions returning system
+ memory information (``total``, ``used``, ``free``) and memory percent usage.
+ ``total_*``, ``avail_*`` and ``used_*`` memory functions are deprecated.
+- 172_: disk usage statistics (`disk_usage()`_).
+- 174_: mounted disk partitions (`disk_partitions()`_).
- 179_: setuptools is now used in setup.py
**Bug fixes**
-- 159_: SetSeDebug() does not close handles or unset impersonation on return.
-- 164_: [Windows] wait function raises a TimeoutException when a process
- returns -1 .
-- 165_: process.status raises an unhandled exception.
-- 166_: get_memory_info() leaks handles hogging system resources.
-- 168_: psutil.cpu_percent() returns erroneous results when used in
+- 159_, [Windows]: ``SetSeDebug()`` does not close handles or unset
+ impersonation on return.
+- 164_, [Windows]: wait function raises a ``TimeoutException`` when a process
+ returns ``-1``.
+- 165_: `Process.status()`_ raises an unhandled exception.
+- 166_: `Process.memory_info()`_ leaks handles hogging system resources.
+- 168_: `cpu_percent()`_ returns erroneous results when used in
non-blocking mode. (patch by Philip Roberts)
-- 178_: macOS - Process.get_threads() leaks memory
-- 180_: [Windows] Process's get_num_threads() and get_threads() methods can
- raise NoSuchProcess exception while process still exists.
+- 178_, [macOS]: `Process.threads()`_ leaks memory.
+- 180_, [Windows]: `Process.num_threads()`_ and `Process.threads()`_ methods
+ can raise `NoSuchProcess`_ exception while process still exists.
0.2.1
=====
@@ -2116,40 +2120,41 @@ DeprecationWarning.
**Enhancements**
-- 64_: per-process I/O counters.
-- 116_: per-process wait() (wait for process to terminate and return its exit
- code).
-- 134_: per-process get_threads() returning information (id, user and kernel
- times) about threads opened by process.
-- 136_: process executable path on FreeBSD is now determined by asking the
+- 64_: per-process I/O counters (`Process.io_counters()`_).
+- 116_: per-process `Process.wait()`_ (wait for process to terminate and return
+ its exit code).
+- 134_: per-process threads (`Process.threads()`_).
+- 136_: `Process.exe()`_ path on FreeBSD is now determined by asking the
kernel instead of guessing it from cmdline[0].
-- 137_: per-process real, effective and saved user and group ids.
-- 140_: system boot time.
-- 142_: per-process get and set niceness (priority).
-- 143_: per-process status.
-- 147_: per-process I/O nice (priority) - Linux only.
-- 148_: psutil.Popen class which tidies up subprocess.Popen and psutil.Process
- in a unique interface.
-- 152_: [macOS] get_process_open_files() implementation has been rewritten
- in C and no longer relies on lsof resulting in a 3x speedup.
-- 153_: [macOS] get_process_connection() implementation has been rewritten
- in C and no longer relies on lsof resulting in a 3x speedup.
+- 137_: per-process real, effective and saved user and group ids
+ (`Process.gids()`_).
+- 140_: system boot time (`boot_time()`_).
+- 142_: per-process get and set niceness (priority) (`Process.nice()`_).
+- 143_: per-process status (`Process.status()`_).
+- 147_ [Linux]: per-process I/O niceness / priority (`Process.ionice()`_).
+- 148_: `psutil.Popen`_ class which tidies up ``subprocess.Popen`` and `Process`_
+ class in a single interface.
+- 152_, [macOS]: `Process.open_files()`_ implementation has been rewritten
+ in C and no longer relies on ``lsof`` resulting in a 3x speedup.
+- 153_, [macOS]: `Process.connections()`_ implementation has been rewritten
+ in C and no longer relies on ``lsof`` resulting in a 3x speedup.
**Bug fixes**
-- 83_: process cmdline is empty on macOS 64-bit.
-- 130_: a race condition can cause IOError exception be raised on
- Linux if process disappears between open() and subsequent read() calls.
-- 145_: WindowsError was raised instead of psutil.AccessDenied when using
- process resume() or suspend() on Windows.
-- 146_: 'exe' property on Linux can raise TypeError if path contains NULL
- bytes.
-- 151_: exe and getcwd() for PID 0 on Linux return inconsistent data.
+- 83_, [macOS]: `Process.cmdline()`_ is empty on macOS 64-bit.
+- 130_, [Linux]: a race condition can cause ``IOError`` exception be raised on
+ if process disappears between ``open()`` and the subsequent ``read()`` call.
+- 145_, [Windows], **[critical]**: ``WindowsError`` was raised instead of
+ `AccessDenied`_ when using `Process.resume()`_ or `Process.suspend()`_.
+- 146_, [Linux]: `Process.exe()`_ property can raise ``TypeError`` if path
+ contains NULL bytes.
+- 151_, [Linux]: `Process.exe()`_ and `Process.cwd()`_ for PID 0 return
+ inconsistent data.
**API changes**
-- Process "uid" and "gid" properties are deprecated in favor of "uids" and
- "gids" properties.
+- `Process`_ ``uid`` and ``gid`` properties are deprecated in favor of ``uids``
+ and ``gids`` properties.
0.2.0
=====
@@ -2158,59 +2163,62 @@ DeprecationWarning.
**Enhancements**
-- 79_: per-process open files.
+- 79_: per-process open files (`Process.open_files()`_).
- 88_: total system physical cached memory.
- 88_: total system physical memory buffers used by the kernel.
-- 91_: per-process send_signal() and terminate() methods.
-- 95_: NoSuchProcess and AccessDenied exception classes now provide "pid",
- "name" and "msg" attributes.
-- 97_: per-process children.
-- 98_: Process.get_cpu_times() and Process.get_memory_info now return
+- 91_: add `Process.send_signal()`_ and `Process.terminate()`_ methods.
+- 95_: `NoSuchProcess`_ and `AccessDenied`_ exception classes now provide
+ ``pid``, ``name`` and ``msg`` attributes.
+- 97_: per-process children (`Process.children()`_).
+- 98_: `Process.cpu_times()`_ and `Process.memory_info()`_ now return
a namedtuple instead of a tuple.
-- 103_: per-process opened TCP and UDP connections.
-- 107_: add support for Windows 64 bit. (patch by cjgohlke)
-- 111_: per-process executable name.
-- 113_: exception messages now include process name and pid.
-- 114_: process username Windows implementation has been rewritten in pure
- C and no longer uses WMI resulting in a big speedup. Also, pywin32 is no
- longer required as a third-party dependancy. (patch by wj32)
-- 117_: added support for Windows 2000.
-- 123_: psutil.cpu_percent() and psutil.Process.cpu_percent() accept a
- new 'interval' parameter.
-- 129_: per-process number of threads.
+- 103_: per-process opened TCP and UDP connections (`Process.connections()`_).
+- 107_, [Windows]: add support for Windows 64 bit. (patch by cjgohlke)
+- 111_: per-process executable name (`Process.exe()`_).
+- 113_: exception messages now include `Process.name()`_ and `Process.pid`_.
+- 114_, [Windows]: `Process.username()`_ has been rewritten in pure C and no
+ longer uses WMI resulting in a big speedup. Also, pywin32 is no longer
+ required as a third-party dependancy. (patch by wj32)
+- 117_, [Windows]: added support for Windows 2000.
+- 123_: `cpu_percent()`_ and `Process.cpu_percent()`_ accept a
+ new ``interval`` parameter.
+- 129_: per-process threads (`Process.threads()`_).
**Bug fixes**
- 80_: fixed warnings when installing psutil with easy_install.
-- 81_: psutil fails to compile with Visual Studio.
-- 94_: suspend() raises OSError instead of AccessDenied.
-- 86_: psutil didn't compile against FreeBSD 6.x.
-- 102_: orphaned process handles obtained by using OpenProcess in C were
- left behind every time Process class was instantiated.
-- 111_: path and name Process properties report truncated or erroneous
- values on UNIX.
-- 120_: cpu_percent() always returning 100% on macOS.
-- 112_: uid and gid properties don't change if process changes effective
+- 81_, [Windows]: psutil fails to compile with Visual Studio.
+- 94_: `Process.suspend()`_ raises ``OSError`` instead of `AccessDenied`_.
+- 86_, [FreeBSD]: psutil didn't compile against FreeBSD 6.x.
+- 102_, [Windows]: orphaned process handles obtained by using ``OpenProcess``
+ in C were left behind every time `Process`_ class was instantiated.
+- 111_, [POSIX]: ``path`` and ``name`` `Process`_ properties report truncated
+ or erroneous values on POSIX.
+- 120_, [macOS]: `cpu_percent()`_ always returning 100%.
+- 112_: ``uid`` and ``gid`` properties don't change if process changes effective
user/group id at some point.
-- 126_: ppid, uid, gid, name, exe, cmdline and create_time properties are
- no longer cached and correctly raise NoSuchProcess exception if the process
- disappears.
+- 126_: `Process.ppid()`_, `Process.uids()`_, `Process.gids()`_, `Process.name()`_,
+ `Process.exe()`_, `Process.cmdline()`_ and `Process.create_time()`_
+ properties are no longer cached and correctly raise `NoSuchProcess`_ exception
+ if the process disappears.
**API changes**
-- psutil.Process.path property is deprecated and works as an alias for "exe"
- property.
-- psutil.Process.kill(): signal argument was removed - to send a signal to the
- process use send_signal(signal) method instead.
-- psutil.Process.get_memory_info() returns a nametuple instead of a tuple.
-- psutil.cpu_times() returns a nametuple instead of a tuple.
-- New psutil.Process methods: get_open_files(), get_connections(),
- send_signal() and terminate().
-- ppid, uid, gid, name, exe, cmdline and create_time properties are no longer
- cached and raise NoSuchProcess exception if process disappears.
-- psutil.cpu_percent() no longer returns immediately (see issue 123).
-- psutil.Process.get_cpu_percent() and psutil.cpu_percent() no longer returns
- immediately by default (see issue 123).
+- ``psutil.Process.path`` property is deprecated and works as an alias for
+ ``psutil.Process.exe`` property.
+- `Process.kill()`_: signal argument was removed - to send a signal to the
+ process use `Process.send_signal()`_ method instead.
+- `Process.memory_info()`_ returns a nametuple instead of a tuple.
+- `cpu_times()`_ returns a nametuple instead of a tuple.
+- New `Process`_ methods: `Process.open_files()`_, `Process.connections()`_,
+ `Process.send_signal()`_ and `Process.terminate()`_.
+- `Process.ppid()`_, `Process.uids()`_, `Process.gids()`_, `Process.name()`_,
+ `Process.exe()`_, `Process.cmdline()`_ and `Process.create_time()`_
+ properties are no longer cached and raise `NoSuchProcess`_ exception if process
+ disappears.
+- `cpu_percent()`_ no longer returns immediately (see issue 123).
+- `Process.cpu_percent()`_ and `cpu_percent()`_ no longer returns immediately
+ by default (see issue 123_).
0.1.3
=====
@@ -2219,28 +2227,29 @@ DeprecationWarning.
**Enhancements**
-- 14_: per-process username
-- 51_: per-process current working directory (Windows and Linux only)
-- 59_: Process.is_running() is now 10 times faster
-- 61_: added supoprt for FreeBSD 64 bit
-- 71_: implemented suspend/resume process
-- 75_: python 3 support
+- 14_: `Process.username()`_.
+- 51_, [Linux], [Windows]: per-process current working directory (`Process.cwd()`_).
+- 59_: `Process.is_running()`_ is now 10 times faster.
+- 61_, [FreeBSD]: added supoprt for FreeBSD 64 bit.
+- 71_: per-process suspend and resume (`Process.suspend()`_ and `Process.resume()`_).
+- 75_: Python 3 support.
**Bug fixes**
-- 36_: process cpu_times() and memory_info() functions succeeded also for dead
- processes while a NoSuchProcess exception is supposed to be raised.
-- 48_: incorrect size for mib array defined in getcmdargs for BSD
-- 49_: possible memory leak due to missing free() on error condition on
-- 50_: fixed getcmdargs() memory fragmentation on BSD
-- 55_: test_pid_4 was failing on Windows Vista
+- 36_: `Process.cpu_times()`_ and `Process.memory_info()`_ functions succeeded.
+ also for dead processes while a `NoSuchProcess`_ exception is supposed to be raised.
+- 48_, [FreeBSD]: incorrect size for MIB array defined in ``getcmdargs``.
+- 49_, [FreeBSD]: possible memory leak due to missing ``free()`` on error
+ condition in ``getcmdpath()``.
+- 50_, [BSD]: fixed ``getcmdargs()`` memory fragmentation.
+- 55_, [Windows]: ``test_pid_4`` was failing on Windows Vista.
- 57_: some unit tests were failing on systems where no swap memory is
- available
-- 58_: is_running() is now called before kill() to make sure we are going
- to kill the correct process.
-- 73_: virtual memory size reported on macOS includes shared library size
-- 77_: NoSuchProcess wasn't raised on Process.create_time if kill() was
- used first.
+ available.
+- 58_: `Process.is_running()`_ is now called before `Process.kill()`_ to make
+ sure we are going to kill the correct process.
+- 73_, [macOS]: virtual memory size reported on includes shared library size.
+- 77_: `NoSuchProcess`_ wasn't raised on `Process.create_time()`_ if `Process.kill()`_
+ was used first.
0.1.2
=====
@@ -2249,21 +2258,21 @@ DeprecationWarning.
**Enhancements**
-- 32_: Per-process CPU user/kernel times
-- 33_: Process create time
-- 34_: Per-process CPU utilization percentage
-- 38_: Per-process memory usage (bytes)
-- 41_: Per-process memory utilization (percent)
-- 39_: System uptime
-- 43_: Total system virtual memory
-- 46_: Total system physical memory
-- 44_: Total system used/free virtual and physical memory
+- 32_: Per-process CPU user/kernel times (`Process.cpu_times()`_).
+- 33_: Per-process create time (`Process.create_time()`_).
+- 34_: Per-process CPU utilization percentage (`Process.cpu_percent()`_).
+- 38_: Per-process memory usage (bytes) (`Process.memory_info()`_).
+- 41_: Per-process memory percent (`Process.memory_percent()`_).
+- 39_: System uptime (`boot_time()`_).
+- 43_: Total system virtual memory.
+- 46_: Total system physical memory.
+- 44_: Total system used/free virtual and physical memory.
**Bug fixes**
-- 36_: [Windows] NoSuchProcess not raised when accessing timing methods.
-- 40_: test_get_cpu_times() failing on FreeBSD and macOS.
-- 42_: [Windows] get_memory_percent() raises AccessDenied.
+- 36_, [Windows]: `NoSuchProcess`_ not raised when accessing timing methods.
+- 40_, [FreeBSD], [macOS]: fix ``test_get_cpu_times`` failures.
+- 42_, [Windows]: `Process.memory_percent()`_ raises `AccessDenied`_.
0.1.1
=====
@@ -2272,33 +2281,141 @@ DeprecationWarning.
**Enhancements**
-- 4_: FreeBSD support for all functions of psutil
-- 9_: Process.uid and Process.gid now retrieve process UID and GID.
-- 11_: Support for parent/ppid - Process.parent property returns a
- Process object representing the parent process, and Process.ppid returns
- the parent PID.
-- 12_ & 15:
- NoSuchProcess exception now raised when creating an object
+- 4_, [FreeBSD]: support for all functions of psutil.
+- 9_, [macOS], [Windows]: add ``Process.uid`` and ``Process.gid``, returning
+ process UID and GID.
+- 11_: per-process parent object: `Process.parent()`_ property returns a
+ `Process`_ object representing the parent process, and `Process.ppid()`_
+ returns the parent PID.
+- 12_, 15_:
+ `NoSuchProcess`_ exception now raised when creating an object
for a nonexistent process, or when retrieving information about a process
that has gone away.
-- 21_: AccessDenied exception created for raising access denied errors
- from OSError or WindowsError on individual platforms.
-- 26_: psutil.process_iter() function to iterate over processes as
- Process objects with a generator.
-- Process objects can now also be compared with == operator for equality
+- 21_, [Windows]: `AccessDenied`_ exception created for raising access denied
+ errors from ``OSError`` or ``WindowsError`` on individual platforms.
+- 26_: `process_iter()`_ function to iterate over processes as
+ `Process`_ objects with a generator.
+- `Process`_ objects can now also be compared with == operator for equality
(PID, name, command line are compared).
**Bug fixes**
-- 16_: [Windows] Special case for "System Idle Process" (PID 0) which
+- 16_, [Windows]: Special case for "System Idle Process" (PID 0) which
otherwise would return an "invalid parameter" exception.
-- 17_: get_process_list() ignores NoSuchProcess and AccessDenied
+- 17_: get_process_list() ignores `NoSuchProcess`_ and `AccessDenied`_
exceptions during building of the list.
-- 22_: [Windows] Process(0).kill() was failing with an unset exception.
-- 23_: Special case for pid_exists(0)
-- 24_: [Windows] Process(0).kill() now raises AccessDenied exception instead
- of WindowsError.
-- 30_: psutil.get_pid_list() was returning two ins
+- 22_, [Windows]: `Process.kill()`_ for PID 0 was failing with an unset exception.
+- 23_, [Linux], [macOS]: create special case for `pid_exists()`_ with PID 0.
+- 24_, [Windows], **[critical]**: `Process.kill()`_ for PID 0 now raises
+ `AccessDenied`_ exception instead of ``WindowsError``.
+- 30_: psutil.get_pid_list() was returning two 0 PIDs.
+
+
+.. _`PROCFS_PATH`: https://psutil.readthedocs.io/en/latest/#psutil.PROCFS_PATH
+
+.. _`boot_time()`: https://psutil.readthedocs.io/en/latest/#psutil.boot_time
+.. _`cpu_count()`: https://psutil.readthedocs.io/en/latest/#psutil.cpu_count
+.. _`cpu_freq()`: https://psutil.readthedocs.io/en/latest/#psutil.cpu_freq
+.. _`cpu_percent()`: https://psutil.readthedocs.io/en/latest/#psutil.cpu_percent
+.. _`cpu_stats()`: https://psutil.readthedocs.io/en/latest/#psutil.cpu_stats
+.. _`cpu_times()`: https://psutil.readthedocs.io/en/latest/#psutil.cpu_times
+.. _`cpu_times_percent()`: https://psutil.readthedocs.io/en/latest/#psutil.cpu_times_percent
+.. _`disk_io_counters()`: https://psutil.readthedocs.io/en/latest/#psutil.disk_io_counters
+.. _`disk_partitions()`: https://psutil.readthedocs.io/en/latest/#psutil.disk_partitions
+.. _`disk_usage()`: https://psutil.readthedocs.io/en/latest/#psutil.disk_usage
+.. _`getloadavg()`: https://psutil.readthedocs.io/en/latest/#psutil.getloadavg
+.. _`net_connections()`: https://psutil.readthedocs.io/en/latest/#psutil.net_connections
+.. _`net_if_addrs()`: https://psutil.readthedocs.io/en/latest/#psutil.net_if_addrs
+.. _`net_if_stats()`: https://psutil.readthedocs.io/en/latest/#psutil.net_if_stats
+.. _`net_io_counters()`: https://psutil.readthedocs.io/en/latest/#psutil.net_io_counters
+.. _`pid_exists()`: https://psutil.readthedocs.io/en/latest/#psutil.pid_exists
+.. _`pids()`: https://psutil.readthedocs.io/en/latest/#psutil.pids
+.. _`process_iter()`: https://psutil.readthedocs.io/en/latest/#psutil.process_iter
+.. _`sensors_battery()`: https://psutil.readthedocs.io/en/latest/#psutil.sensors_battery
+.. _`sensors_fans()`: https://psutil.readthedocs.io/en/latest/#psutil.sensors_fans
+.. _`sensors_temperatures()`: https://psutil.readthedocs.io/en/latest/#psutil.sensors_temperatures
+.. _`swap_memory()`: https://psutil.readthedocs.io/en/latest/#psutil.swap_memory
+.. _`users()`: https://psutil.readthedocs.io/en/latest/#psutil.users
+.. _`virtual_memory()`: https://psutil.readthedocs.io/en/latest/#psutil.virtual_memory
+.. _`wait_procs()`: https://psutil.readthedocs.io/en/latest/#psutil.wait_procs
+.. _`win_service_get()`: https://psutil.readthedocs.io/en/latest/#psutil.win_service_get
+.. _`win_service_iter()`: https://psutil.readthedocs.io/en/latest/#psutil.win_service_iter
+
+
+.. _`Process`: https://psutil.readthedocs.io/en/latest/#psutil.Process
+.. _`psutil.Popen`: https://psutil.readthedocs.io/en/latest/#psutil.Popen
+.. _`psutil.Process`: https://psutil.readthedocs.io/en/latest/#psutil.Process
+
+
+.. _`AccessDenied`: https://psutil.readthedocs.io/en/latest/#psutil.AccessDenied
+.. _`NoSuchProcess`: https://psutil.readthedocs.io/en/latest/#psutil.NoSuchProcess
+.. _`TimeoutExpired`: https://psutil.readthedocs.io/en/latest/#psutil.TimeoutExpired
+.. _`ZombieProcess`: https://psutil.readthedocs.io/en/latest/#psutil.ZombieProcess
+
+
+.. _`Process.as_dict()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.as_dict
+.. _`Process.children()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.children
+.. _`Process.cmdline()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.connections
+.. _`Process.connections()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.connections
+.. _`Process.cpu_affinity()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.cpu_affinity
+.. _`Process.cpu_num()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.cpu_num
+.. _`Process.cpu_percent()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.cpu_percent
+.. _`Process.cpu_times()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.cpu_times
+.. _`Process.create_time()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.create_time
+.. _`Process.cwd()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.cwd
+.. _`Process.environ()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.environ
+.. _`Process.exe()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.exe
+.. _`Process.gids()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.gids
+.. _`Process.io_counters()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.io_counters
+.. _`Process.ionice()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.ionice
+.. _`Process.is_running()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.is_running
+.. _`Process.kill()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.kill
+.. _`Process.memory_full_info()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.memory_full_info
+.. _`Process.memory_info()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.memory_info
+.. _`Process.memory_info_ex()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.memory_info_ex
+.. _`Process.memory_maps()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.memory_maps
+.. _`Process.memory_percent()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.memory_percent
+.. _`Process.name()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.name
+.. _`Process.nice()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.nice
+.. _`Process.num_ctx_switches()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.num_ctx_switches
+.. _`Process.num_fds()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.num_fds
+.. _`Process.num_handles()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.num_handles
+.. _`Process.num_threads()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.num_threads
+.. _`Process.oneshot()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.oneshot
+.. _`Process.open_files()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.open_files
+.. _`Process.parent()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.parent
+.. _`Process.parents()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.parents
+.. _`Process.pid`: https://psutil.readthedocs.io/en/latest/#psutil.Process.pid
+.. _`Process.ppid()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.ppid
+.. _`Process.resume()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.resume
+.. _`Process.rlimit()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.rlimit
+.. _`Process.send_signal()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.send_signal
+.. _`Process.status()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.status
+.. _`Process.suspend()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.suspend
+.. _`Process.terminal()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.terminal
+.. _`Process.terminate()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.terminate
+.. _`Process.threads()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.threads
+.. _`Process.uids()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.uids
+.. _`Process.username()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.username
+.. _`Process.wait()`: https://psutil.readthedocs.io/en/latest/#psutil.Process.wait
+
+
+.. _`cpu_distribution.py`: https://github.com/giampaolo/psutil/blob/master/scripts/cpu_distribution.py
+.. _`disk_usage.py`: https://github.com/giampaolo/psutil/blob/master/scripts/disk_usage.py
+.. _`free.py`: https://github.com/giampaolo/psutil/blob/master/scripts/free.py
+.. _`ifconfig.py`: https://github.com/giampaolo/psutil/blob/master/scripts/ifconfig.py
+.. _`iotop.py`: https://github.com/giampaolo/psutil/blob/master/scripts/iotop.py
+.. _`meminfo.py`: https://github.com/giampaolo/psutil/blob/master/scripts/meminfo.py
+.. _`netstat.py`: https://github.com/giampaolo/psutil/blob/master/scripts/netstat.py
+.. _`nettop.py`: https://github.com/giampaolo/psutil/blob/master/scripts/nettop.py
+.. _`pidof.py`: https://github.com/giampaolo/psutil/blob/master/scripts/pidof.py
+.. _`pmap.py`: https://github.com/giampaolo/psutil/blob/master/scripts/pmap.py
+.. _`procinfo.py`: https://github.com/giampaolo/psutil/blob/master/scripts/procinfo.py
+.. _`procsmem.py`: https://github.com/giampaolo/psutil/blob/master/scripts/procsmem.py
+.. _`ps.py`: https://github.com/giampaolo/psutil/blob/master/scripts/ps.py
+.. _`pstree.py`: https://github.com/giampaolo/psutil/blob/master/scripts/pstree.py
+.. _`top.py`: https://github.com/giampaolo/psutil/blob/master/scripts/top.py
+
.. _1: https://github.com/giampaolo/psutil/issues/1
.. _2: https://github.com/giampaolo/psutil/issues/2
@@ -4300,3 +4417,1003 @@ DeprecationWarning.
.. _1998: https://github.com/giampaolo/psutil/issues/1998
.. _1999: https://github.com/giampaolo/psutil/issues/1999
.. _2000: https://github.com/giampaolo/psutil/issues/2000
+.. _2001: https://github.com/giampaolo/psutil/issues/2001
+.. _2002: https://github.com/giampaolo/psutil/issues/2002
+.. _2003: https://github.com/giampaolo/psutil/issues/2003
+.. _2004: https://github.com/giampaolo/psutil/issues/2004
+.. _2005: https://github.com/giampaolo/psutil/issues/2005
+.. _2006: https://github.com/giampaolo/psutil/issues/2006
+.. _2007: https://github.com/giampaolo/psutil/issues/2007
+.. _2008: https://github.com/giampaolo/psutil/issues/2008
+.. _2009: https://github.com/giampaolo/psutil/issues/2009
+.. _2010: https://github.com/giampaolo/psutil/issues/2010
+.. _2011: https://github.com/giampaolo/psutil/issues/2011
+.. _2012: https://github.com/giampaolo/psutil/issues/2012
+.. _2013: https://github.com/giampaolo/psutil/issues/2013
+.. _2014: https://github.com/giampaolo/psutil/issues/2014
+.. _2015: https://github.com/giampaolo/psutil/issues/2015
+.. _2016: https://github.com/giampaolo/psutil/issues/2016
+.. _2017: https://github.com/giampaolo/psutil/issues/2017
+.. _2018: https://github.com/giampaolo/psutil/issues/2018
+.. _2019: https://github.com/giampaolo/psutil/issues/2019
+.. _2020: https://github.com/giampaolo/psutil/issues/2020
+.. _2021: https://github.com/giampaolo/psutil/issues/2021
+.. _2022: https://github.com/giampaolo/psutil/issues/2022
+.. _2023: https://github.com/giampaolo/psutil/issues/2023
+.. _2024: https://github.com/giampaolo/psutil/issues/2024
+.. _2025: https://github.com/giampaolo/psutil/issues/2025
+.. _2026: https://github.com/giampaolo/psutil/issues/2026
+.. _2027: https://github.com/giampaolo/psutil/issues/2027
+.. _2028: https://github.com/giampaolo/psutil/issues/2028
+.. _2029: https://github.com/giampaolo/psutil/issues/2029
+.. _2030: https://github.com/giampaolo/psutil/issues/2030
+.. _2031: https://github.com/giampaolo/psutil/issues/2031
+.. _2032: https://github.com/giampaolo/psutil/issues/2032
+.. _2033: https://github.com/giampaolo/psutil/issues/2033
+.. _2034: https://github.com/giampaolo/psutil/issues/2034
+.. _2035: https://github.com/giampaolo/psutil/issues/2035
+.. _2036: https://github.com/giampaolo/psutil/issues/2036
+.. _2037: https://github.com/giampaolo/psutil/issues/2037
+.. _2038: https://github.com/giampaolo/psutil/issues/2038
+.. _2039: https://github.com/giampaolo/psutil/issues/2039
+.. _2040: https://github.com/giampaolo/psutil/issues/2040
+.. _2041: https://github.com/giampaolo/psutil/issues/2041
+.. _2042: https://github.com/giampaolo/psutil/issues/2042
+.. _2043: https://github.com/giampaolo/psutil/issues/2043
+.. _2044: https://github.com/giampaolo/psutil/issues/2044
+.. _2045: https://github.com/giampaolo/psutil/issues/2045
+.. _2046: https://github.com/giampaolo/psutil/issues/2046
+.. _2047: https://github.com/giampaolo/psutil/issues/2047
+.. _2048: https://github.com/giampaolo/psutil/issues/2048
+.. _2049: https://github.com/giampaolo/psutil/issues/2049
+.. _2050: https://github.com/giampaolo/psutil/issues/2050
+.. _2051: https://github.com/giampaolo/psutil/issues/2051
+.. _2052: https://github.com/giampaolo/psutil/issues/2052
+.. _2053: https://github.com/giampaolo/psutil/issues/2053
+.. _2054: https://github.com/giampaolo/psutil/issues/2054
+.. _2055: https://github.com/giampaolo/psutil/issues/2055
+.. _2056: https://github.com/giampaolo/psutil/issues/2056
+.. _2057: https://github.com/giampaolo/psutil/issues/2057
+.. _2058: https://github.com/giampaolo/psutil/issues/2058
+.. _2059: https://github.com/giampaolo/psutil/issues/2059
+.. _2060: https://github.com/giampaolo/psutil/issues/2060
+.. _2061: https://github.com/giampaolo/psutil/issues/2061
+.. _2062: https://github.com/giampaolo/psutil/issues/2062
+.. _2063: https://github.com/giampaolo/psutil/issues/2063
+.. _2064: https://github.com/giampaolo/psutil/issues/2064
+.. _2065: https://github.com/giampaolo/psutil/issues/2065
+.. _2066: https://github.com/giampaolo/psutil/issues/2066
+.. _2067: https://github.com/giampaolo/psutil/issues/2067
+.. _2068: https://github.com/giampaolo/psutil/issues/2068
+.. _2069: https://github.com/giampaolo/psutil/issues/2069
+.. _2070: https://github.com/giampaolo/psutil/issues/2070
+.. _2071: https://github.com/giampaolo/psutil/issues/2071
+.. _2072: https://github.com/giampaolo/psutil/issues/2072
+.. _2073: https://github.com/giampaolo/psutil/issues/2073
+.. _2074: https://github.com/giampaolo/psutil/issues/2074
+.. _2075: https://github.com/giampaolo/psutil/issues/2075
+.. _2076: https://github.com/giampaolo/psutil/issues/2076
+.. _2077: https://github.com/giampaolo/psutil/issues/2077
+.. _2078: https://github.com/giampaolo/psutil/issues/2078
+.. _2079: https://github.com/giampaolo/psutil/issues/2079
+.. _2080: https://github.com/giampaolo/psutil/issues/2080
+.. _2081: https://github.com/giampaolo/psutil/issues/2081
+.. _2082: https://github.com/giampaolo/psutil/issues/2082
+.. _2083: https://github.com/giampaolo/psutil/issues/2083
+.. _2084: https://github.com/giampaolo/psutil/issues/2084
+.. _2085: https://github.com/giampaolo/psutil/issues/2085
+.. _2086: https://github.com/giampaolo/psutil/issues/2086
+.. _2087: https://github.com/giampaolo/psutil/issues/2087
+.. _2088: https://github.com/giampaolo/psutil/issues/2088
+.. _2089: https://github.com/giampaolo/psutil/issues/2089
+.. _2090: https://github.com/giampaolo/psutil/issues/2090
+.. _2091: https://github.com/giampaolo/psutil/issues/2091
+.. _2092: https://github.com/giampaolo/psutil/issues/2092
+.. _2093: https://github.com/giampaolo/psutil/issues/2093
+.. _2094: https://github.com/giampaolo/psutil/issues/2094
+.. _2095: https://github.com/giampaolo/psutil/issues/2095
+.. _2096: https://github.com/giampaolo/psutil/issues/2096
+.. _2097: https://github.com/giampaolo/psutil/issues/2097
+.. _2098: https://github.com/giampaolo/psutil/issues/2098
+.. _2099: https://github.com/giampaolo/psutil/issues/2099
+.. _2100: https://github.com/giampaolo/psutil/issues/2100
+.. _2101: https://github.com/giampaolo/psutil/issues/2101
+.. _2102: https://github.com/giampaolo/psutil/issues/2102
+.. _2103: https://github.com/giampaolo/psutil/issues/2103
+.. _2104: https://github.com/giampaolo/psutil/issues/2104
+.. _2105: https://github.com/giampaolo/psutil/issues/2105
+.. _2106: https://github.com/giampaolo/psutil/issues/2106
+.. _2107: https://github.com/giampaolo/psutil/issues/2107
+.. _2108: https://github.com/giampaolo/psutil/issues/2108
+.. _2109: https://github.com/giampaolo/psutil/issues/2109
+.. _2110: https://github.com/giampaolo/psutil/issues/2110
+.. _2111: https://github.com/giampaolo/psutil/issues/2111
+.. _2112: https://github.com/giampaolo/psutil/issues/2112
+.. _2113: https://github.com/giampaolo/psutil/issues/2113
+.. _2114: https://github.com/giampaolo/psutil/issues/2114
+.. _2115: https://github.com/giampaolo/psutil/issues/2115
+.. _2116: https://github.com/giampaolo/psutil/issues/2116
+.. _2117: https://github.com/giampaolo/psutil/issues/2117
+.. _2118: https://github.com/giampaolo/psutil/issues/2118
+.. _2119: https://github.com/giampaolo/psutil/issues/2119
+.. _2120: https://github.com/giampaolo/psutil/issues/2120
+.. _2121: https://github.com/giampaolo/psutil/issues/2121
+.. _2122: https://github.com/giampaolo/psutil/issues/2122
+.. _2123: https://github.com/giampaolo/psutil/issues/2123
+.. _2124: https://github.com/giampaolo/psutil/issues/2124
+.. _2125: https://github.com/giampaolo/psutil/issues/2125
+.. _2126: https://github.com/giampaolo/psutil/issues/2126
+.. _2127: https://github.com/giampaolo/psutil/issues/2127
+.. _2128: https://github.com/giampaolo/psutil/issues/2128
+.. _2129: https://github.com/giampaolo/psutil/issues/2129
+.. _2130: https://github.com/giampaolo/psutil/issues/2130
+.. _2131: https://github.com/giampaolo/psutil/issues/2131
+.. _2132: https://github.com/giampaolo/psutil/issues/2132
+.. _2133: https://github.com/giampaolo/psutil/issues/2133
+.. _2134: https://github.com/giampaolo/psutil/issues/2134
+.. _2135: https://github.com/giampaolo/psutil/issues/2135
+.. _2136: https://github.com/giampaolo/psutil/issues/2136
+.. _2137: https://github.com/giampaolo/psutil/issues/2137
+.. _2138: https://github.com/giampaolo/psutil/issues/2138
+.. _2139: https://github.com/giampaolo/psutil/issues/2139
+.. _2140: https://github.com/giampaolo/psutil/issues/2140
+.. _2141: https://github.com/giampaolo/psutil/issues/2141
+.. _2142: https://github.com/giampaolo/psutil/issues/2142
+.. _2143: https://github.com/giampaolo/psutil/issues/2143
+.. _2144: https://github.com/giampaolo/psutil/issues/2144
+.. _2145: https://github.com/giampaolo/psutil/issues/2145
+.. _2146: https://github.com/giampaolo/psutil/issues/2146
+.. _2147: https://github.com/giampaolo/psutil/issues/2147
+.. _2148: https://github.com/giampaolo/psutil/issues/2148
+.. _2149: https://github.com/giampaolo/psutil/issues/2149
+.. _2150: https://github.com/giampaolo/psutil/issues/2150
+.. _2151: https://github.com/giampaolo/psutil/issues/2151
+.. _2152: https://github.com/giampaolo/psutil/issues/2152
+.. _2153: https://github.com/giampaolo/psutil/issues/2153
+.. _2154: https://github.com/giampaolo/psutil/issues/2154
+.. _2155: https://github.com/giampaolo/psutil/issues/2155
+.. _2156: https://github.com/giampaolo/psutil/issues/2156
+.. _2157: https://github.com/giampaolo/psutil/issues/2157
+.. _2158: https://github.com/giampaolo/psutil/issues/2158
+.. _2159: https://github.com/giampaolo/psutil/issues/2159
+.. _2160: https://github.com/giampaolo/psutil/issues/2160
+.. _2161: https://github.com/giampaolo/psutil/issues/2161
+.. _2162: https://github.com/giampaolo/psutil/issues/2162
+.. _2163: https://github.com/giampaolo/psutil/issues/2163
+.. _2164: https://github.com/giampaolo/psutil/issues/2164
+.. _2165: https://github.com/giampaolo/psutil/issues/2165
+.. _2166: https://github.com/giampaolo/psutil/issues/2166
+.. _2167: https://github.com/giampaolo/psutil/issues/2167
+.. _2168: https://github.com/giampaolo/psutil/issues/2168
+.. _2169: https://github.com/giampaolo/psutil/issues/2169
+.. _2170: https://github.com/giampaolo/psutil/issues/2170
+.. _2171: https://github.com/giampaolo/psutil/issues/2171
+.. _2172: https://github.com/giampaolo/psutil/issues/2172
+.. _2173: https://github.com/giampaolo/psutil/issues/2173
+.. _2174: https://github.com/giampaolo/psutil/issues/2174
+.. _2175: https://github.com/giampaolo/psutil/issues/2175
+.. _2176: https://github.com/giampaolo/psutil/issues/2176
+.. _2177: https://github.com/giampaolo/psutil/issues/2177
+.. _2178: https://github.com/giampaolo/psutil/issues/2178
+.. _2179: https://github.com/giampaolo/psutil/issues/2179
+.. _2180: https://github.com/giampaolo/psutil/issues/2180
+.. _2181: https://github.com/giampaolo/psutil/issues/2181
+.. _2182: https://github.com/giampaolo/psutil/issues/2182
+.. _2183: https://github.com/giampaolo/psutil/issues/2183
+.. _2184: https://github.com/giampaolo/psutil/issues/2184
+.. _2185: https://github.com/giampaolo/psutil/issues/2185
+.. _2186: https://github.com/giampaolo/psutil/issues/2186
+.. _2187: https://github.com/giampaolo/psutil/issues/2187
+.. _2188: https://github.com/giampaolo/psutil/issues/2188
+.. _2189: https://github.com/giampaolo/psutil/issues/2189
+.. _2190: https://github.com/giampaolo/psutil/issues/2190
+.. _2191: https://github.com/giampaolo/psutil/issues/2191
+.. _2192: https://github.com/giampaolo/psutil/issues/2192
+.. _2193: https://github.com/giampaolo/psutil/issues/2193
+.. _2194: https://github.com/giampaolo/psutil/issues/2194
+.. _2195: https://github.com/giampaolo/psutil/issues/2195
+.. _2196: https://github.com/giampaolo/psutil/issues/2196
+.. _2197: https://github.com/giampaolo/psutil/issues/2197
+.. _2198: https://github.com/giampaolo/psutil/issues/2198
+.. _2199: https://github.com/giampaolo/psutil/issues/2199
+.. _2200: https://github.com/giampaolo/psutil/issues/2200
+.. _2201: https://github.com/giampaolo/psutil/issues/2201
+.. _2202: https://github.com/giampaolo/psutil/issues/2202
+.. _2203: https://github.com/giampaolo/psutil/issues/2203
+.. _2204: https://github.com/giampaolo/psutil/issues/2204
+.. _2205: https://github.com/giampaolo/psutil/issues/2205
+.. _2206: https://github.com/giampaolo/psutil/issues/2206
+.. _2207: https://github.com/giampaolo/psutil/issues/2207
+.. _2208: https://github.com/giampaolo/psutil/issues/2208
+.. _2209: https://github.com/giampaolo/psutil/issues/2209
+.. _2210: https://github.com/giampaolo/psutil/issues/2210
+.. _2211: https://github.com/giampaolo/psutil/issues/2211
+.. _2212: https://github.com/giampaolo/psutil/issues/2212
+.. _2213: https://github.com/giampaolo/psutil/issues/2213
+.. _2214: https://github.com/giampaolo/psutil/issues/2214
+.. _2215: https://github.com/giampaolo/psutil/issues/2215
+.. _2216: https://github.com/giampaolo/psutil/issues/2216
+.. _2217: https://github.com/giampaolo/psutil/issues/2217
+.. _2218: https://github.com/giampaolo/psutil/issues/2218
+.. _2219: https://github.com/giampaolo/psutil/issues/2219
+.. _2220: https://github.com/giampaolo/psutil/issues/2220
+.. _2221: https://github.com/giampaolo/psutil/issues/2221
+.. _2222: https://github.com/giampaolo/psutil/issues/2222
+.. _2223: https://github.com/giampaolo/psutil/issues/2223
+.. _2224: https://github.com/giampaolo/psutil/issues/2224
+.. _2225: https://github.com/giampaolo/psutil/issues/2225
+.. _2226: https://github.com/giampaolo/psutil/issues/2226
+.. _2227: https://github.com/giampaolo/psutil/issues/2227
+.. _2228: https://github.com/giampaolo/psutil/issues/2228
+.. _2229: https://github.com/giampaolo/psutil/issues/2229
+.. _2230: https://github.com/giampaolo/psutil/issues/2230
+.. _2231: https://github.com/giampaolo/psutil/issues/2231
+.. _2232: https://github.com/giampaolo/psutil/issues/2232
+.. _2233: https://github.com/giampaolo/psutil/issues/2233
+.. _2234: https://github.com/giampaolo/psutil/issues/2234
+.. _2235: https://github.com/giampaolo/psutil/issues/2235
+.. _2236: https://github.com/giampaolo/psutil/issues/2236
+.. _2237: https://github.com/giampaolo/psutil/issues/2237
+.. _2238: https://github.com/giampaolo/psutil/issues/2238
+.. _2239: https://github.com/giampaolo/psutil/issues/2239
+.. _2240: https://github.com/giampaolo/psutil/issues/2240
+.. _2241: https://github.com/giampaolo/psutil/issues/2241
+.. _2242: https://github.com/giampaolo/psutil/issues/2242
+.. _2243: https://github.com/giampaolo/psutil/issues/2243
+.. _2244: https://github.com/giampaolo/psutil/issues/2244
+.. _2245: https://github.com/giampaolo/psutil/issues/2245
+.. _2246: https://github.com/giampaolo/psutil/issues/2246
+.. _2247: https://github.com/giampaolo/psutil/issues/2247
+.. _2248: https://github.com/giampaolo/psutil/issues/2248
+.. _2249: https://github.com/giampaolo/psutil/issues/2249
+.. _2250: https://github.com/giampaolo/psutil/issues/2250
+.. _2251: https://github.com/giampaolo/psutil/issues/2251
+.. _2252: https://github.com/giampaolo/psutil/issues/2252
+.. _2253: https://github.com/giampaolo/psutil/issues/2253
+.. _2254: https://github.com/giampaolo/psutil/issues/2254
+.. _2255: https://github.com/giampaolo/psutil/issues/2255
+.. _2256: https://github.com/giampaolo/psutil/issues/2256
+.. _2257: https://github.com/giampaolo/psutil/issues/2257
+.. _2258: https://github.com/giampaolo/psutil/issues/2258
+.. _2259: https://github.com/giampaolo/psutil/issues/2259
+.. _2260: https://github.com/giampaolo/psutil/issues/2260
+.. _2261: https://github.com/giampaolo/psutil/issues/2261
+.. _2262: https://github.com/giampaolo/psutil/issues/2262
+.. _2263: https://github.com/giampaolo/psutil/issues/2263
+.. _2264: https://github.com/giampaolo/psutil/issues/2264
+.. _2265: https://github.com/giampaolo/psutil/issues/2265
+.. _2266: https://github.com/giampaolo/psutil/issues/2266
+.. _2267: https://github.com/giampaolo/psutil/issues/2267
+.. _2268: https://github.com/giampaolo/psutil/issues/2268
+.. _2269: https://github.com/giampaolo/psutil/issues/2269
+.. _2270: https://github.com/giampaolo/psutil/issues/2270
+.. _2271: https://github.com/giampaolo/psutil/issues/2271
+.. _2272: https://github.com/giampaolo/psutil/issues/2272
+.. _2273: https://github.com/giampaolo/psutil/issues/2273
+.. _2274: https://github.com/giampaolo/psutil/issues/2274
+.. _2275: https://github.com/giampaolo/psutil/issues/2275
+.. _2276: https://github.com/giampaolo/psutil/issues/2276
+.. _2277: https://github.com/giampaolo/psutil/issues/2277
+.. _2278: https://github.com/giampaolo/psutil/issues/2278
+.. _2279: https://github.com/giampaolo/psutil/issues/2279
+.. _2280: https://github.com/giampaolo/psutil/issues/2280
+.. _2281: https://github.com/giampaolo/psutil/issues/2281
+.. _2282: https://github.com/giampaolo/psutil/issues/2282
+.. _2283: https://github.com/giampaolo/psutil/issues/2283
+.. _2284: https://github.com/giampaolo/psutil/issues/2284
+.. _2285: https://github.com/giampaolo/psutil/issues/2285
+.. _2286: https://github.com/giampaolo/psutil/issues/2286
+.. _2287: https://github.com/giampaolo/psutil/issues/2287
+.. _2288: https://github.com/giampaolo/psutil/issues/2288
+.. _2289: https://github.com/giampaolo/psutil/issues/2289
+.. _2290: https://github.com/giampaolo/psutil/issues/2290
+.. _2291: https://github.com/giampaolo/psutil/issues/2291
+.. _2292: https://github.com/giampaolo/psutil/issues/2292
+.. _2293: https://github.com/giampaolo/psutil/issues/2293
+.. _2294: https://github.com/giampaolo/psutil/issues/2294
+.. _2295: https://github.com/giampaolo/psutil/issues/2295
+.. _2296: https://github.com/giampaolo/psutil/issues/2296
+.. _2297: https://github.com/giampaolo/psutil/issues/2297
+.. _2298: https://github.com/giampaolo/psutil/issues/2298
+.. _2299: https://github.com/giampaolo/psutil/issues/2299
+.. _2300: https://github.com/giampaolo/psutil/issues/2300
+.. _2301: https://github.com/giampaolo/psutil/issues/2301
+.. _2302: https://github.com/giampaolo/psutil/issues/2302
+.. _2303: https://github.com/giampaolo/psutil/issues/2303
+.. _2304: https://github.com/giampaolo/psutil/issues/2304
+.. _2305: https://github.com/giampaolo/psutil/issues/2305
+.. _2306: https://github.com/giampaolo/psutil/issues/2306
+.. _2307: https://github.com/giampaolo/psutil/issues/2307
+.. _2308: https://github.com/giampaolo/psutil/issues/2308
+.. _2309: https://github.com/giampaolo/psutil/issues/2309
+.. _2310: https://github.com/giampaolo/psutil/issues/2310
+.. _2311: https://github.com/giampaolo/psutil/issues/2311
+.. _2312: https://github.com/giampaolo/psutil/issues/2312
+.. _2313: https://github.com/giampaolo/psutil/issues/2313
+.. _2314: https://github.com/giampaolo/psutil/issues/2314
+.. _2315: https://github.com/giampaolo/psutil/issues/2315
+.. _2316: https://github.com/giampaolo/psutil/issues/2316
+.. _2317: https://github.com/giampaolo/psutil/issues/2317
+.. _2318: https://github.com/giampaolo/psutil/issues/2318
+.. _2319: https://github.com/giampaolo/psutil/issues/2319
+.. _2320: https://github.com/giampaolo/psutil/issues/2320
+.. _2321: https://github.com/giampaolo/psutil/issues/2321
+.. _2322: https://github.com/giampaolo/psutil/issues/2322
+.. _2323: https://github.com/giampaolo/psutil/issues/2323
+.. _2324: https://github.com/giampaolo/psutil/issues/2324
+.. _2325: https://github.com/giampaolo/psutil/issues/2325
+.. _2326: https://github.com/giampaolo/psutil/issues/2326
+.. _2327: https://github.com/giampaolo/psutil/issues/2327
+.. _2328: https://github.com/giampaolo/psutil/issues/2328
+.. _2329: https://github.com/giampaolo/psutil/issues/2329
+.. _2330: https://github.com/giampaolo/psutil/issues/2330
+.. _2331: https://github.com/giampaolo/psutil/issues/2331
+.. _2332: https://github.com/giampaolo/psutil/issues/2332
+.. _2333: https://github.com/giampaolo/psutil/issues/2333
+.. _2334: https://github.com/giampaolo/psutil/issues/2334
+.. _2335: https://github.com/giampaolo/psutil/issues/2335
+.. _2336: https://github.com/giampaolo/psutil/issues/2336
+.. _2337: https://github.com/giampaolo/psutil/issues/2337
+.. _2338: https://github.com/giampaolo/psutil/issues/2338
+.. _2339: https://github.com/giampaolo/psutil/issues/2339
+.. _2340: https://github.com/giampaolo/psutil/issues/2340
+.. _2341: https://github.com/giampaolo/psutil/issues/2341
+.. _2342: https://github.com/giampaolo/psutil/issues/2342
+.. _2343: https://github.com/giampaolo/psutil/issues/2343
+.. _2344: https://github.com/giampaolo/psutil/issues/2344
+.. _2345: https://github.com/giampaolo/psutil/issues/2345
+.. _2346: https://github.com/giampaolo/psutil/issues/2346
+.. _2347: https://github.com/giampaolo/psutil/issues/2347
+.. _2348: https://github.com/giampaolo/psutil/issues/2348
+.. _2349: https://github.com/giampaolo/psutil/issues/2349
+.. _2350: https://github.com/giampaolo/psutil/issues/2350
+.. _2351: https://github.com/giampaolo/psutil/issues/2351
+.. _2352: https://github.com/giampaolo/psutil/issues/2352
+.. _2353: https://github.com/giampaolo/psutil/issues/2353
+.. _2354: https://github.com/giampaolo/psutil/issues/2354
+.. _2355: https://github.com/giampaolo/psutil/issues/2355
+.. _2356: https://github.com/giampaolo/psutil/issues/2356
+.. _2357: https://github.com/giampaolo/psutil/issues/2357
+.. _2358: https://github.com/giampaolo/psutil/issues/2358
+.. _2359: https://github.com/giampaolo/psutil/issues/2359
+.. _2360: https://github.com/giampaolo/psutil/issues/2360
+.. _2361: https://github.com/giampaolo/psutil/issues/2361
+.. _2362: https://github.com/giampaolo/psutil/issues/2362
+.. _2363: https://github.com/giampaolo/psutil/issues/2363
+.. _2364: https://github.com/giampaolo/psutil/issues/2364
+.. _2365: https://github.com/giampaolo/psutil/issues/2365
+.. _2366: https://github.com/giampaolo/psutil/issues/2366
+.. _2367: https://github.com/giampaolo/psutil/issues/2367
+.. _2368: https://github.com/giampaolo/psutil/issues/2368
+.. _2369: https://github.com/giampaolo/psutil/issues/2369
+.. _2370: https://github.com/giampaolo/psutil/issues/2370
+.. _2371: https://github.com/giampaolo/psutil/issues/2371
+.. _2372: https://github.com/giampaolo/psutil/issues/2372
+.. _2373: https://github.com/giampaolo/psutil/issues/2373
+.. _2374: https://github.com/giampaolo/psutil/issues/2374
+.. _2375: https://github.com/giampaolo/psutil/issues/2375
+.. _2376: https://github.com/giampaolo/psutil/issues/2376
+.. _2377: https://github.com/giampaolo/psutil/issues/2377
+.. _2378: https://github.com/giampaolo/psutil/issues/2378
+.. _2379: https://github.com/giampaolo/psutil/issues/2379
+.. _2380: https://github.com/giampaolo/psutil/issues/2380
+.. _2381: https://github.com/giampaolo/psutil/issues/2381
+.. _2382: https://github.com/giampaolo/psutil/issues/2382
+.. _2383: https://github.com/giampaolo/psutil/issues/2383
+.. _2384: https://github.com/giampaolo/psutil/issues/2384
+.. _2385: https://github.com/giampaolo/psutil/issues/2385
+.. _2386: https://github.com/giampaolo/psutil/issues/2386
+.. _2387: https://github.com/giampaolo/psutil/issues/2387
+.. _2388: https://github.com/giampaolo/psutil/issues/2388
+.. _2389: https://github.com/giampaolo/psutil/issues/2389
+.. _2390: https://github.com/giampaolo/psutil/issues/2390
+.. _2391: https://github.com/giampaolo/psutil/issues/2391
+.. _2392: https://github.com/giampaolo/psutil/issues/2392
+.. _2393: https://github.com/giampaolo/psutil/issues/2393
+.. _2394: https://github.com/giampaolo/psutil/issues/2394
+.. _2395: https://github.com/giampaolo/psutil/issues/2395
+.. _2396: https://github.com/giampaolo/psutil/issues/2396
+.. _2397: https://github.com/giampaolo/psutil/issues/2397
+.. _2398: https://github.com/giampaolo/psutil/issues/2398
+.. _2399: https://github.com/giampaolo/psutil/issues/2399
+.. _2400: https://github.com/giampaolo/psutil/issues/2400
+.. _2401: https://github.com/giampaolo/psutil/issues/2401
+.. _2402: https://github.com/giampaolo/psutil/issues/2402
+.. _2403: https://github.com/giampaolo/psutil/issues/2403
+.. _2404: https://github.com/giampaolo/psutil/issues/2404
+.. _2405: https://github.com/giampaolo/psutil/issues/2405
+.. _2406: https://github.com/giampaolo/psutil/issues/2406
+.. _2407: https://github.com/giampaolo/psutil/issues/2407
+.. _2408: https://github.com/giampaolo/psutil/issues/2408
+.. _2409: https://github.com/giampaolo/psutil/issues/2409
+.. _2410: https://github.com/giampaolo/psutil/issues/2410
+.. _2411: https://github.com/giampaolo/psutil/issues/2411
+.. _2412: https://github.com/giampaolo/psutil/issues/2412
+.. _2413: https://github.com/giampaolo/psutil/issues/2413
+.. _2414: https://github.com/giampaolo/psutil/issues/2414
+.. _2415: https://github.com/giampaolo/psutil/issues/2415
+.. _2416: https://github.com/giampaolo/psutil/issues/2416
+.. _2417: https://github.com/giampaolo/psutil/issues/2417
+.. _2418: https://github.com/giampaolo/psutil/issues/2418
+.. _2419: https://github.com/giampaolo/psutil/issues/2419
+.. _2420: https://github.com/giampaolo/psutil/issues/2420
+.. _2421: https://github.com/giampaolo/psutil/issues/2421
+.. _2422: https://github.com/giampaolo/psutil/issues/2422
+.. _2423: https://github.com/giampaolo/psutil/issues/2423
+.. _2424: https://github.com/giampaolo/psutil/issues/2424
+.. _2425: https://github.com/giampaolo/psutil/issues/2425
+.. _2426: https://github.com/giampaolo/psutil/issues/2426
+.. _2427: https://github.com/giampaolo/psutil/issues/2427
+.. _2428: https://github.com/giampaolo/psutil/issues/2428
+.. _2429: https://github.com/giampaolo/psutil/issues/2429
+.. _2430: https://github.com/giampaolo/psutil/issues/2430
+.. _2431: https://github.com/giampaolo/psutil/issues/2431
+.. _2432: https://github.com/giampaolo/psutil/issues/2432
+.. _2433: https://github.com/giampaolo/psutil/issues/2433
+.. _2434: https://github.com/giampaolo/psutil/issues/2434
+.. _2435: https://github.com/giampaolo/psutil/issues/2435
+.. _2436: https://github.com/giampaolo/psutil/issues/2436
+.. _2437: https://github.com/giampaolo/psutil/issues/2437
+.. _2438: https://github.com/giampaolo/psutil/issues/2438
+.. _2439: https://github.com/giampaolo/psutil/issues/2439
+.. _2440: https://github.com/giampaolo/psutil/issues/2440
+.. _2441: https://github.com/giampaolo/psutil/issues/2441
+.. _2442: https://github.com/giampaolo/psutil/issues/2442
+.. _2443: https://github.com/giampaolo/psutil/issues/2443
+.. _2444: https://github.com/giampaolo/psutil/issues/2444
+.. _2445: https://github.com/giampaolo/psutil/issues/2445
+.. _2446: https://github.com/giampaolo/psutil/issues/2446
+.. _2447: https://github.com/giampaolo/psutil/issues/2447
+.. _2448: https://github.com/giampaolo/psutil/issues/2448
+.. _2449: https://github.com/giampaolo/psutil/issues/2449
+.. _2450: https://github.com/giampaolo/psutil/issues/2450
+.. _2451: https://github.com/giampaolo/psutil/issues/2451
+.. _2452: https://github.com/giampaolo/psutil/issues/2452
+.. _2453: https://github.com/giampaolo/psutil/issues/2453
+.. _2454: https://github.com/giampaolo/psutil/issues/2454
+.. _2455: https://github.com/giampaolo/psutil/issues/2455
+.. _2456: https://github.com/giampaolo/psutil/issues/2456
+.. _2457: https://github.com/giampaolo/psutil/issues/2457
+.. _2458: https://github.com/giampaolo/psutil/issues/2458
+.. _2459: https://github.com/giampaolo/psutil/issues/2459
+.. _2460: https://github.com/giampaolo/psutil/issues/2460
+.. _2461: https://github.com/giampaolo/psutil/issues/2461
+.. _2462: https://github.com/giampaolo/psutil/issues/2462
+.. _2463: https://github.com/giampaolo/psutil/issues/2463
+.. _2464: https://github.com/giampaolo/psutil/issues/2464
+.. _2465: https://github.com/giampaolo/psutil/issues/2465
+.. _2466: https://github.com/giampaolo/psutil/issues/2466
+.. _2467: https://github.com/giampaolo/psutil/issues/2467
+.. _2468: https://github.com/giampaolo/psutil/issues/2468
+.. _2469: https://github.com/giampaolo/psutil/issues/2469
+.. _2470: https://github.com/giampaolo/psutil/issues/2470
+.. _2471: https://github.com/giampaolo/psutil/issues/2471
+.. _2472: https://github.com/giampaolo/psutil/issues/2472
+.. _2473: https://github.com/giampaolo/psutil/issues/2473
+.. _2474: https://github.com/giampaolo/psutil/issues/2474
+.. _2475: https://github.com/giampaolo/psutil/issues/2475
+.. _2476: https://github.com/giampaolo/psutil/issues/2476
+.. _2477: https://github.com/giampaolo/psutil/issues/2477
+.. _2478: https://github.com/giampaolo/psutil/issues/2478
+.. _2479: https://github.com/giampaolo/psutil/issues/2479
+.. _2480: https://github.com/giampaolo/psutil/issues/2480
+.. _2481: https://github.com/giampaolo/psutil/issues/2481
+.. _2482: https://github.com/giampaolo/psutil/issues/2482
+.. _2483: https://github.com/giampaolo/psutil/issues/2483
+.. _2484: https://github.com/giampaolo/psutil/issues/2484
+.. _2485: https://github.com/giampaolo/psutil/issues/2485
+.. _2486: https://github.com/giampaolo/psutil/issues/2486
+.. _2487: https://github.com/giampaolo/psutil/issues/2487
+.. _2488: https://github.com/giampaolo/psutil/issues/2488
+.. _2489: https://github.com/giampaolo/psutil/issues/2489
+.. _2490: https://github.com/giampaolo/psutil/issues/2490
+.. _2491: https://github.com/giampaolo/psutil/issues/2491
+.. _2492: https://github.com/giampaolo/psutil/issues/2492
+.. _2493: https://github.com/giampaolo/psutil/issues/2493
+.. _2494: https://github.com/giampaolo/psutil/issues/2494
+.. _2495: https://github.com/giampaolo/psutil/issues/2495
+.. _2496: https://github.com/giampaolo/psutil/issues/2496
+.. _2497: https://github.com/giampaolo/psutil/issues/2497
+.. _2498: https://github.com/giampaolo/psutil/issues/2498
+.. _2499: https://github.com/giampaolo/psutil/issues/2499
+.. _2500: https://github.com/giampaolo/psutil/issues/2500
+.. _2501: https://github.com/giampaolo/psutil/issues/2501
+.. _2502: https://github.com/giampaolo/psutil/issues/2502
+.. _2503: https://github.com/giampaolo/psutil/issues/2503
+.. _2504: https://github.com/giampaolo/psutil/issues/2504
+.. _2505: https://github.com/giampaolo/psutil/issues/2505
+.. _2506: https://github.com/giampaolo/psutil/issues/2506
+.. _2507: https://github.com/giampaolo/psutil/issues/2507
+.. _2508: https://github.com/giampaolo/psutil/issues/2508
+.. _2509: https://github.com/giampaolo/psutil/issues/2509
+.. _2510: https://github.com/giampaolo/psutil/issues/2510
+.. _2511: https://github.com/giampaolo/psutil/issues/2511
+.. _2512: https://github.com/giampaolo/psutil/issues/2512
+.. _2513: https://github.com/giampaolo/psutil/issues/2513
+.. _2514: https://github.com/giampaolo/psutil/issues/2514
+.. _2515: https://github.com/giampaolo/psutil/issues/2515
+.. _2516: https://github.com/giampaolo/psutil/issues/2516
+.. _2517: https://github.com/giampaolo/psutil/issues/2517
+.. _2518: https://github.com/giampaolo/psutil/issues/2518
+.. _2519: https://github.com/giampaolo/psutil/issues/2519
+.. _2520: https://github.com/giampaolo/psutil/issues/2520
+.. _2521: https://github.com/giampaolo/psutil/issues/2521
+.. _2522: https://github.com/giampaolo/psutil/issues/2522
+.. _2523: https://github.com/giampaolo/psutil/issues/2523
+.. _2524: https://github.com/giampaolo/psutil/issues/2524
+.. _2525: https://github.com/giampaolo/psutil/issues/2525
+.. _2526: https://github.com/giampaolo/psutil/issues/2526
+.. _2527: https://github.com/giampaolo/psutil/issues/2527
+.. _2528: https://github.com/giampaolo/psutil/issues/2528
+.. _2529: https://github.com/giampaolo/psutil/issues/2529
+.. _2530: https://github.com/giampaolo/psutil/issues/2530
+.. _2531: https://github.com/giampaolo/psutil/issues/2531
+.. _2532: https://github.com/giampaolo/psutil/issues/2532
+.. _2533: https://github.com/giampaolo/psutil/issues/2533
+.. _2534: https://github.com/giampaolo/psutil/issues/2534
+.. _2535: https://github.com/giampaolo/psutil/issues/2535
+.. _2536: https://github.com/giampaolo/psutil/issues/2536
+.. _2537: https://github.com/giampaolo/psutil/issues/2537
+.. _2538: https://github.com/giampaolo/psutil/issues/2538
+.. _2539: https://github.com/giampaolo/psutil/issues/2539
+.. _2540: https://github.com/giampaolo/psutil/issues/2540
+.. _2541: https://github.com/giampaolo/psutil/issues/2541
+.. _2542: https://github.com/giampaolo/psutil/issues/2542
+.. _2543: https://github.com/giampaolo/psutil/issues/2543
+.. _2544: https://github.com/giampaolo/psutil/issues/2544
+.. _2545: https://github.com/giampaolo/psutil/issues/2545
+.. _2546: https://github.com/giampaolo/psutil/issues/2546
+.. _2547: https://github.com/giampaolo/psutil/issues/2547
+.. _2548: https://github.com/giampaolo/psutil/issues/2548
+.. _2549: https://github.com/giampaolo/psutil/issues/2549
+.. _2550: https://github.com/giampaolo/psutil/issues/2550
+.. _2551: https://github.com/giampaolo/psutil/issues/2551
+.. _2552: https://github.com/giampaolo/psutil/issues/2552
+.. _2553: https://github.com/giampaolo/psutil/issues/2553
+.. _2554: https://github.com/giampaolo/psutil/issues/2554
+.. _2555: https://github.com/giampaolo/psutil/issues/2555
+.. _2556: https://github.com/giampaolo/psutil/issues/2556
+.. _2557: https://github.com/giampaolo/psutil/issues/2557
+.. _2558: https://github.com/giampaolo/psutil/issues/2558
+.. _2559: https://github.com/giampaolo/psutil/issues/2559
+.. _2560: https://github.com/giampaolo/psutil/issues/2560
+.. _2561: https://github.com/giampaolo/psutil/issues/2561
+.. _2562: https://github.com/giampaolo/psutil/issues/2562
+.. _2563: https://github.com/giampaolo/psutil/issues/2563
+.. _2564: https://github.com/giampaolo/psutil/issues/2564
+.. _2565: https://github.com/giampaolo/psutil/issues/2565
+.. _2566: https://github.com/giampaolo/psutil/issues/2566
+.. _2567: https://github.com/giampaolo/psutil/issues/2567
+.. _2568: https://github.com/giampaolo/psutil/issues/2568
+.. _2569: https://github.com/giampaolo/psutil/issues/2569
+.. _2570: https://github.com/giampaolo/psutil/issues/2570
+.. _2571: https://github.com/giampaolo/psutil/issues/2571
+.. _2572: https://github.com/giampaolo/psutil/issues/2572
+.. _2573: https://github.com/giampaolo/psutil/issues/2573
+.. _2574: https://github.com/giampaolo/psutil/issues/2574
+.. _2575: https://github.com/giampaolo/psutil/issues/2575
+.. _2576: https://github.com/giampaolo/psutil/issues/2576
+.. _2577: https://github.com/giampaolo/psutil/issues/2577
+.. _2578: https://github.com/giampaolo/psutil/issues/2578
+.. _2579: https://github.com/giampaolo/psutil/issues/2579
+.. _2580: https://github.com/giampaolo/psutil/issues/2580
+.. _2581: https://github.com/giampaolo/psutil/issues/2581
+.. _2582: https://github.com/giampaolo/psutil/issues/2582
+.. _2583: https://github.com/giampaolo/psutil/issues/2583
+.. _2584: https://github.com/giampaolo/psutil/issues/2584
+.. _2585: https://github.com/giampaolo/psutil/issues/2585
+.. _2586: https://github.com/giampaolo/psutil/issues/2586
+.. _2587: https://github.com/giampaolo/psutil/issues/2587
+.. _2588: https://github.com/giampaolo/psutil/issues/2588
+.. _2589: https://github.com/giampaolo/psutil/issues/2589
+.. _2590: https://github.com/giampaolo/psutil/issues/2590
+.. _2591: https://github.com/giampaolo/psutil/issues/2591
+.. _2592: https://github.com/giampaolo/psutil/issues/2592
+.. _2593: https://github.com/giampaolo/psutil/issues/2593
+.. _2594: https://github.com/giampaolo/psutil/issues/2594
+.. _2595: https://github.com/giampaolo/psutil/issues/2595
+.. _2596: https://github.com/giampaolo/psutil/issues/2596
+.. _2597: https://github.com/giampaolo/psutil/issues/2597
+.. _2598: https://github.com/giampaolo/psutil/issues/2598
+.. _2599: https://github.com/giampaolo/psutil/issues/2599
+.. _2600: https://github.com/giampaolo/psutil/issues/2600
+.. _2601: https://github.com/giampaolo/psutil/issues/2601
+.. _2602: https://github.com/giampaolo/psutil/issues/2602
+.. _2603: https://github.com/giampaolo/psutil/issues/2603
+.. _2604: https://github.com/giampaolo/psutil/issues/2604
+.. _2605: https://github.com/giampaolo/psutil/issues/2605
+.. _2606: https://github.com/giampaolo/psutil/issues/2606
+.. _2607: https://github.com/giampaolo/psutil/issues/2607
+.. _2608: https://github.com/giampaolo/psutil/issues/2608
+.. _2609: https://github.com/giampaolo/psutil/issues/2609
+.. _2610: https://github.com/giampaolo/psutil/issues/2610
+.. _2611: https://github.com/giampaolo/psutil/issues/2611
+.. _2612: https://github.com/giampaolo/psutil/issues/2612
+.. _2613: https://github.com/giampaolo/psutil/issues/2613
+.. _2614: https://github.com/giampaolo/psutil/issues/2614
+.. _2615: https://github.com/giampaolo/psutil/issues/2615
+.. _2616: https://github.com/giampaolo/psutil/issues/2616
+.. _2617: https://github.com/giampaolo/psutil/issues/2617
+.. _2618: https://github.com/giampaolo/psutil/issues/2618
+.. _2619: https://github.com/giampaolo/psutil/issues/2619
+.. _2620: https://github.com/giampaolo/psutil/issues/2620
+.. _2621: https://github.com/giampaolo/psutil/issues/2621
+.. _2622: https://github.com/giampaolo/psutil/issues/2622
+.. _2623: https://github.com/giampaolo/psutil/issues/2623
+.. _2624: https://github.com/giampaolo/psutil/issues/2624
+.. _2625: https://github.com/giampaolo/psutil/issues/2625
+.. _2626: https://github.com/giampaolo/psutil/issues/2626
+.. _2627: https://github.com/giampaolo/psutil/issues/2627
+.. _2628: https://github.com/giampaolo/psutil/issues/2628
+.. _2629: https://github.com/giampaolo/psutil/issues/2629
+.. _2630: https://github.com/giampaolo/psutil/issues/2630
+.. _2631: https://github.com/giampaolo/psutil/issues/2631
+.. _2632: https://github.com/giampaolo/psutil/issues/2632
+.. _2633: https://github.com/giampaolo/psutil/issues/2633
+.. _2634: https://github.com/giampaolo/psutil/issues/2634
+.. _2635: https://github.com/giampaolo/psutil/issues/2635
+.. _2636: https://github.com/giampaolo/psutil/issues/2636
+.. _2637: https://github.com/giampaolo/psutil/issues/2637
+.. _2638: https://github.com/giampaolo/psutil/issues/2638
+.. _2639: https://github.com/giampaolo/psutil/issues/2639
+.. _2640: https://github.com/giampaolo/psutil/issues/2640
+.. _2641: https://github.com/giampaolo/psutil/issues/2641
+.. _2642: https://github.com/giampaolo/psutil/issues/2642
+.. _2643: https://github.com/giampaolo/psutil/issues/2643
+.. _2644: https://github.com/giampaolo/psutil/issues/2644
+.. _2645: https://github.com/giampaolo/psutil/issues/2645
+.. _2646: https://github.com/giampaolo/psutil/issues/2646
+.. _2647: https://github.com/giampaolo/psutil/issues/2647
+.. _2648: https://github.com/giampaolo/psutil/issues/2648
+.. _2649: https://github.com/giampaolo/psutil/issues/2649
+.. _2650: https://github.com/giampaolo/psutil/issues/2650
+.. _2651: https://github.com/giampaolo/psutil/issues/2651
+.. _2652: https://github.com/giampaolo/psutil/issues/2652
+.. _2653: https://github.com/giampaolo/psutil/issues/2653
+.. _2654: https://github.com/giampaolo/psutil/issues/2654
+.. _2655: https://github.com/giampaolo/psutil/issues/2655
+.. _2656: https://github.com/giampaolo/psutil/issues/2656
+.. _2657: https://github.com/giampaolo/psutil/issues/2657
+.. _2658: https://github.com/giampaolo/psutil/issues/2658
+.. _2659: https://github.com/giampaolo/psutil/issues/2659
+.. _2660: https://github.com/giampaolo/psutil/issues/2660
+.. _2661: https://github.com/giampaolo/psutil/issues/2661
+.. _2662: https://github.com/giampaolo/psutil/issues/2662
+.. _2663: https://github.com/giampaolo/psutil/issues/2663
+.. _2664: https://github.com/giampaolo/psutil/issues/2664
+.. _2665: https://github.com/giampaolo/psutil/issues/2665
+.. _2666: https://github.com/giampaolo/psutil/issues/2666
+.. _2667: https://github.com/giampaolo/psutil/issues/2667
+.. _2668: https://github.com/giampaolo/psutil/issues/2668
+.. _2669: https://github.com/giampaolo/psutil/issues/2669
+.. _2670: https://github.com/giampaolo/psutil/issues/2670
+.. _2671: https://github.com/giampaolo/psutil/issues/2671
+.. _2672: https://github.com/giampaolo/psutil/issues/2672
+.. _2673: https://github.com/giampaolo/psutil/issues/2673
+.. _2674: https://github.com/giampaolo/psutil/issues/2674
+.. _2675: https://github.com/giampaolo/psutil/issues/2675
+.. _2676: https://github.com/giampaolo/psutil/issues/2676
+.. _2677: https://github.com/giampaolo/psutil/issues/2677
+.. _2678: https://github.com/giampaolo/psutil/issues/2678
+.. _2679: https://github.com/giampaolo/psutil/issues/2679
+.. _2680: https://github.com/giampaolo/psutil/issues/2680
+.. _2681: https://github.com/giampaolo/psutil/issues/2681
+.. _2682: https://github.com/giampaolo/psutil/issues/2682
+.. _2683: https://github.com/giampaolo/psutil/issues/2683
+.. _2684: https://github.com/giampaolo/psutil/issues/2684
+.. _2685: https://github.com/giampaolo/psutil/issues/2685
+.. _2686: https://github.com/giampaolo/psutil/issues/2686
+.. _2687: https://github.com/giampaolo/psutil/issues/2687
+.. _2688: https://github.com/giampaolo/psutil/issues/2688
+.. _2689: https://github.com/giampaolo/psutil/issues/2689
+.. _2690: https://github.com/giampaolo/psutil/issues/2690
+.. _2691: https://github.com/giampaolo/psutil/issues/2691
+.. _2692: https://github.com/giampaolo/psutil/issues/2692
+.. _2693: https://github.com/giampaolo/psutil/issues/2693
+.. _2694: https://github.com/giampaolo/psutil/issues/2694
+.. _2695: https://github.com/giampaolo/psutil/issues/2695
+.. _2696: https://github.com/giampaolo/psutil/issues/2696
+.. _2697: https://github.com/giampaolo/psutil/issues/2697
+.. _2698: https://github.com/giampaolo/psutil/issues/2698
+.. _2699: https://github.com/giampaolo/psutil/issues/2699
+.. _2700: https://github.com/giampaolo/psutil/issues/2700
+.. _2701: https://github.com/giampaolo/psutil/issues/2701
+.. _2702: https://github.com/giampaolo/psutil/issues/2702
+.. _2703: https://github.com/giampaolo/psutil/issues/2703
+.. _2704: https://github.com/giampaolo/psutil/issues/2704
+.. _2705: https://github.com/giampaolo/psutil/issues/2705
+.. _2706: https://github.com/giampaolo/psutil/issues/2706
+.. _2707: https://github.com/giampaolo/psutil/issues/2707
+.. _2708: https://github.com/giampaolo/psutil/issues/2708
+.. _2709: https://github.com/giampaolo/psutil/issues/2709
+.. _2710: https://github.com/giampaolo/psutil/issues/2710
+.. _2711: https://github.com/giampaolo/psutil/issues/2711
+.. _2712: https://github.com/giampaolo/psutil/issues/2712
+.. _2713: https://github.com/giampaolo/psutil/issues/2713
+.. _2714: https://github.com/giampaolo/psutil/issues/2714
+.. _2715: https://github.com/giampaolo/psutil/issues/2715
+.. _2716: https://github.com/giampaolo/psutil/issues/2716
+.. _2717: https://github.com/giampaolo/psutil/issues/2717
+.. _2718: https://github.com/giampaolo/psutil/issues/2718
+.. _2719: https://github.com/giampaolo/psutil/issues/2719
+.. _2720: https://github.com/giampaolo/psutil/issues/2720
+.. _2721: https://github.com/giampaolo/psutil/issues/2721
+.. _2722: https://github.com/giampaolo/psutil/issues/2722
+.. _2723: https://github.com/giampaolo/psutil/issues/2723
+.. _2724: https://github.com/giampaolo/psutil/issues/2724
+.. _2725: https://github.com/giampaolo/psutil/issues/2725
+.. _2726: https://github.com/giampaolo/psutil/issues/2726
+.. _2727: https://github.com/giampaolo/psutil/issues/2727
+.. _2728: https://github.com/giampaolo/psutil/issues/2728
+.. _2729: https://github.com/giampaolo/psutil/issues/2729
+.. _2730: https://github.com/giampaolo/psutil/issues/2730
+.. _2731: https://github.com/giampaolo/psutil/issues/2731
+.. _2732: https://github.com/giampaolo/psutil/issues/2732
+.. _2733: https://github.com/giampaolo/psutil/issues/2733
+.. _2734: https://github.com/giampaolo/psutil/issues/2734
+.. _2735: https://github.com/giampaolo/psutil/issues/2735
+.. _2736: https://github.com/giampaolo/psutil/issues/2736
+.. _2737: https://github.com/giampaolo/psutil/issues/2737
+.. _2738: https://github.com/giampaolo/psutil/issues/2738
+.. _2739: https://github.com/giampaolo/psutil/issues/2739
+.. _2740: https://github.com/giampaolo/psutil/issues/2740
+.. _2741: https://github.com/giampaolo/psutil/issues/2741
+.. _2742: https://github.com/giampaolo/psutil/issues/2742
+.. _2743: https://github.com/giampaolo/psutil/issues/2743
+.. _2744: https://github.com/giampaolo/psutil/issues/2744
+.. _2745: https://github.com/giampaolo/psutil/issues/2745
+.. _2746: https://github.com/giampaolo/psutil/issues/2746
+.. _2747: https://github.com/giampaolo/psutil/issues/2747
+.. _2748: https://github.com/giampaolo/psutil/issues/2748
+.. _2749: https://github.com/giampaolo/psutil/issues/2749
+.. _2750: https://github.com/giampaolo/psutil/issues/2750
+.. _2751: https://github.com/giampaolo/psutil/issues/2751
+.. _2752: https://github.com/giampaolo/psutil/issues/2752
+.. _2753: https://github.com/giampaolo/psutil/issues/2753
+.. _2754: https://github.com/giampaolo/psutil/issues/2754
+.. _2755: https://github.com/giampaolo/psutil/issues/2755
+.. _2756: https://github.com/giampaolo/psutil/issues/2756
+.. _2757: https://github.com/giampaolo/psutil/issues/2757
+.. _2758: https://github.com/giampaolo/psutil/issues/2758
+.. _2759: https://github.com/giampaolo/psutil/issues/2759
+.. _2760: https://github.com/giampaolo/psutil/issues/2760
+.. _2761: https://github.com/giampaolo/psutil/issues/2761
+.. _2762: https://github.com/giampaolo/psutil/issues/2762
+.. _2763: https://github.com/giampaolo/psutil/issues/2763
+.. _2764: https://github.com/giampaolo/psutil/issues/2764
+.. _2765: https://github.com/giampaolo/psutil/issues/2765
+.. _2766: https://github.com/giampaolo/psutil/issues/2766
+.. _2767: https://github.com/giampaolo/psutil/issues/2767
+.. _2768: https://github.com/giampaolo/psutil/issues/2768
+.. _2769: https://github.com/giampaolo/psutil/issues/2769
+.. _2770: https://github.com/giampaolo/psutil/issues/2770
+.. _2771: https://github.com/giampaolo/psutil/issues/2771
+.. _2772: https://github.com/giampaolo/psutil/issues/2772
+.. _2773: https://github.com/giampaolo/psutil/issues/2773
+.. _2774: https://github.com/giampaolo/psutil/issues/2774
+.. _2775: https://github.com/giampaolo/psutil/issues/2775
+.. _2776: https://github.com/giampaolo/psutil/issues/2776
+.. _2777: https://github.com/giampaolo/psutil/issues/2777
+.. _2778: https://github.com/giampaolo/psutil/issues/2778
+.. _2779: https://github.com/giampaolo/psutil/issues/2779
+.. _2780: https://github.com/giampaolo/psutil/issues/2780
+.. _2781: https://github.com/giampaolo/psutil/issues/2781
+.. _2782: https://github.com/giampaolo/psutil/issues/2782
+.. _2783: https://github.com/giampaolo/psutil/issues/2783
+.. _2784: https://github.com/giampaolo/psutil/issues/2784
+.. _2785: https://github.com/giampaolo/psutil/issues/2785
+.. _2786: https://github.com/giampaolo/psutil/issues/2786
+.. _2787: https://github.com/giampaolo/psutil/issues/2787
+.. _2788: https://github.com/giampaolo/psutil/issues/2788
+.. _2789: https://github.com/giampaolo/psutil/issues/2789
+.. _2790: https://github.com/giampaolo/psutil/issues/2790
+.. _2791: https://github.com/giampaolo/psutil/issues/2791
+.. _2792: https://github.com/giampaolo/psutil/issues/2792
+.. _2793: https://github.com/giampaolo/psutil/issues/2793
+.. _2794: https://github.com/giampaolo/psutil/issues/2794
+.. _2795: https://github.com/giampaolo/psutil/issues/2795
+.. _2796: https://github.com/giampaolo/psutil/issues/2796
+.. _2797: https://github.com/giampaolo/psutil/issues/2797
+.. _2798: https://github.com/giampaolo/psutil/issues/2798
+.. _2799: https://github.com/giampaolo/psutil/issues/2799
+.. _2800: https://github.com/giampaolo/psutil/issues/2800
+.. _2801: https://github.com/giampaolo/psutil/issues/2801
+.. _2802: https://github.com/giampaolo/psutil/issues/2802
+.. _2803: https://github.com/giampaolo/psutil/issues/2803
+.. _2804: https://github.com/giampaolo/psutil/issues/2804
+.. _2805: https://github.com/giampaolo/psutil/issues/2805
+.. _2806: https://github.com/giampaolo/psutil/issues/2806
+.. _2807: https://github.com/giampaolo/psutil/issues/2807
+.. _2808: https://github.com/giampaolo/psutil/issues/2808
+.. _2809: https://github.com/giampaolo/psutil/issues/2809
+.. _2810: https://github.com/giampaolo/psutil/issues/2810
+.. _2811: https://github.com/giampaolo/psutil/issues/2811
+.. _2812: https://github.com/giampaolo/psutil/issues/2812
+.. _2813: https://github.com/giampaolo/psutil/issues/2813
+.. _2814: https://github.com/giampaolo/psutil/issues/2814
+.. _2815: https://github.com/giampaolo/psutil/issues/2815
+.. _2816: https://github.com/giampaolo/psutil/issues/2816
+.. _2817: https://github.com/giampaolo/psutil/issues/2817
+.. _2818: https://github.com/giampaolo/psutil/issues/2818
+.. _2819: https://github.com/giampaolo/psutil/issues/2819
+.. _2820: https://github.com/giampaolo/psutil/issues/2820
+.. _2821: https://github.com/giampaolo/psutil/issues/2821
+.. _2822: https://github.com/giampaolo/psutil/issues/2822
+.. _2823: https://github.com/giampaolo/psutil/issues/2823
+.. _2824: https://github.com/giampaolo/psutil/issues/2824
+.. _2825: https://github.com/giampaolo/psutil/issues/2825
+.. _2826: https://github.com/giampaolo/psutil/issues/2826
+.. _2827: https://github.com/giampaolo/psutil/issues/2827
+.. _2828: https://github.com/giampaolo/psutil/issues/2828
+.. _2829: https://github.com/giampaolo/psutil/issues/2829
+.. _2830: https://github.com/giampaolo/psutil/issues/2830
+.. _2831: https://github.com/giampaolo/psutil/issues/2831
+.. _2832: https://github.com/giampaolo/psutil/issues/2832
+.. _2833: https://github.com/giampaolo/psutil/issues/2833
+.. _2834: https://github.com/giampaolo/psutil/issues/2834
+.. _2835: https://github.com/giampaolo/psutil/issues/2835
+.. _2836: https://github.com/giampaolo/psutil/issues/2836
+.. _2837: https://github.com/giampaolo/psutil/issues/2837
+.. _2838: https://github.com/giampaolo/psutil/issues/2838
+.. _2839: https://github.com/giampaolo/psutil/issues/2839
+.. _2840: https://github.com/giampaolo/psutil/issues/2840
+.. _2841: https://github.com/giampaolo/psutil/issues/2841
+.. _2842: https://github.com/giampaolo/psutil/issues/2842
+.. _2843: https://github.com/giampaolo/psutil/issues/2843
+.. _2844: https://github.com/giampaolo/psutil/issues/2844
+.. _2845: https://github.com/giampaolo/psutil/issues/2845
+.. _2846: https://github.com/giampaolo/psutil/issues/2846
+.. _2847: https://github.com/giampaolo/psutil/issues/2847
+.. _2848: https://github.com/giampaolo/psutil/issues/2848
+.. _2849: https://github.com/giampaolo/psutil/issues/2849
+.. _2850: https://github.com/giampaolo/psutil/issues/2850
+.. _2851: https://github.com/giampaolo/psutil/issues/2851
+.. _2852: https://github.com/giampaolo/psutil/issues/2852
+.. _2853: https://github.com/giampaolo/psutil/issues/2853
+.. _2854: https://github.com/giampaolo/psutil/issues/2854
+.. _2855: https://github.com/giampaolo/psutil/issues/2855
+.. _2856: https://github.com/giampaolo/psutil/issues/2856
+.. _2857: https://github.com/giampaolo/psutil/issues/2857
+.. _2858: https://github.com/giampaolo/psutil/issues/2858
+.. _2859: https://github.com/giampaolo/psutil/issues/2859
+.. _2860: https://github.com/giampaolo/psutil/issues/2860
+.. _2861: https://github.com/giampaolo/psutil/issues/2861
+.. _2862: https://github.com/giampaolo/psutil/issues/2862
+.. _2863: https://github.com/giampaolo/psutil/issues/2863
+.. _2864: https://github.com/giampaolo/psutil/issues/2864
+.. _2865: https://github.com/giampaolo/psutil/issues/2865
+.. _2866: https://github.com/giampaolo/psutil/issues/2866
+.. _2867: https://github.com/giampaolo/psutil/issues/2867
+.. _2868: https://github.com/giampaolo/psutil/issues/2868
+.. _2869: https://github.com/giampaolo/psutil/issues/2869
+.. _2870: https://github.com/giampaolo/psutil/issues/2870
+.. _2871: https://github.com/giampaolo/psutil/issues/2871
+.. _2872: https://github.com/giampaolo/psutil/issues/2872
+.. _2873: https://github.com/giampaolo/psutil/issues/2873
+.. _2874: https://github.com/giampaolo/psutil/issues/2874
+.. _2875: https://github.com/giampaolo/psutil/issues/2875
+.. _2876: https://github.com/giampaolo/psutil/issues/2876
+.. _2877: https://github.com/giampaolo/psutil/issues/2877
+.. _2878: https://github.com/giampaolo/psutil/issues/2878
+.. _2879: https://github.com/giampaolo/psutil/issues/2879
+.. _2880: https://github.com/giampaolo/psutil/issues/2880
+.. _2881: https://github.com/giampaolo/psutil/issues/2881
+.. _2882: https://github.com/giampaolo/psutil/issues/2882
+.. _2883: https://github.com/giampaolo/psutil/issues/2883
+.. _2884: https://github.com/giampaolo/psutil/issues/2884
+.. _2885: https://github.com/giampaolo/psutil/issues/2885
+.. _2886: https://github.com/giampaolo/psutil/issues/2886
+.. _2887: https://github.com/giampaolo/psutil/issues/2887
+.. _2888: https://github.com/giampaolo/psutil/issues/2888
+.. _2889: https://github.com/giampaolo/psutil/issues/2889
+.. _2890: https://github.com/giampaolo/psutil/issues/2890
+.. _2891: https://github.com/giampaolo/psutil/issues/2891
+.. _2892: https://github.com/giampaolo/psutil/issues/2892
+.. _2893: https://github.com/giampaolo/psutil/issues/2893
+.. _2894: https://github.com/giampaolo/psutil/issues/2894
+.. _2895: https://github.com/giampaolo/psutil/issues/2895
+.. _2896: https://github.com/giampaolo/psutil/issues/2896
+.. _2897: https://github.com/giampaolo/psutil/issues/2897
+.. _2898: https://github.com/giampaolo/psutil/issues/2898
+.. _2899: https://github.com/giampaolo/psutil/issues/2899
+.. _2900: https://github.com/giampaolo/psutil/issues/2900
+.. _2901: https://github.com/giampaolo/psutil/issues/2901
+.. _2902: https://github.com/giampaolo/psutil/issues/2902
+.. _2903: https://github.com/giampaolo/psutil/issues/2903
+.. _2904: https://github.com/giampaolo/psutil/issues/2904
+.. _2905: https://github.com/giampaolo/psutil/issues/2905
+.. _2906: https://github.com/giampaolo/psutil/issues/2906
+.. _2907: https://github.com/giampaolo/psutil/issues/2907
+.. _2908: https://github.com/giampaolo/psutil/issues/2908
+.. _2909: https://github.com/giampaolo/psutil/issues/2909
+.. _2910: https://github.com/giampaolo/psutil/issues/2910
+.. _2911: https://github.com/giampaolo/psutil/issues/2911
+.. _2912: https://github.com/giampaolo/psutil/issues/2912
+.. _2913: https://github.com/giampaolo/psutil/issues/2913
+.. _2914: https://github.com/giampaolo/psutil/issues/2914
+.. _2915: https://github.com/giampaolo/psutil/issues/2915
+.. _2916: https://github.com/giampaolo/psutil/issues/2916
+.. _2917: https://github.com/giampaolo/psutil/issues/2917
+.. _2918: https://github.com/giampaolo/psutil/issues/2918
+.. _2919: https://github.com/giampaolo/psutil/issues/2919
+.. _2920: https://github.com/giampaolo/psutil/issues/2920
+.. _2921: https://github.com/giampaolo/psutil/issues/2921
+.. _2922: https://github.com/giampaolo/psutil/issues/2922
+.. _2923: https://github.com/giampaolo/psutil/issues/2923
+.. _2924: https://github.com/giampaolo/psutil/issues/2924
+.. _2925: https://github.com/giampaolo/psutil/issues/2925
+.. _2926: https://github.com/giampaolo/psutil/issues/2926
+.. _2927: https://github.com/giampaolo/psutil/issues/2927
+.. _2928: https://github.com/giampaolo/psutil/issues/2928
+.. _2929: https://github.com/giampaolo/psutil/issues/2929
+.. _2930: https://github.com/giampaolo/psutil/issues/2930
+.. _2931: https://github.com/giampaolo/psutil/issues/2931
+.. _2932: https://github.com/giampaolo/psutil/issues/2932
+.. _2933: https://github.com/giampaolo/psutil/issues/2933
+.. _2934: https://github.com/giampaolo/psutil/issues/2934
+.. _2935: https://github.com/giampaolo/psutil/issues/2935
+.. _2936: https://github.com/giampaolo/psutil/issues/2936
+.. _2937: https://github.com/giampaolo/psutil/issues/2937
+.. _2938: https://github.com/giampaolo/psutil/issues/2938
+.. _2939: https://github.com/giampaolo/psutil/issues/2939
+.. _2940: https://github.com/giampaolo/psutil/issues/2940
+.. _2941: https://github.com/giampaolo/psutil/issues/2941
+.. _2942: https://github.com/giampaolo/psutil/issues/2942
+.. _2943: https://github.com/giampaolo/psutil/issues/2943
+.. _2944: https://github.com/giampaolo/psutil/issues/2944
+.. _2945: https://github.com/giampaolo/psutil/issues/2945
+.. _2946: https://github.com/giampaolo/psutil/issues/2946
+.. _2947: https://github.com/giampaolo/psutil/issues/2947
+.. _2948: https://github.com/giampaolo/psutil/issues/2948
+.. _2949: https://github.com/giampaolo/psutil/issues/2949
+.. _2950: https://github.com/giampaolo/psutil/issues/2950
+.. _2951: https://github.com/giampaolo/psutil/issues/2951
+.. _2952: https://github.com/giampaolo/psutil/issues/2952
+.. _2953: https://github.com/giampaolo/psutil/issues/2953
+.. _2954: https://github.com/giampaolo/psutil/issues/2954
+.. _2955: https://github.com/giampaolo/psutil/issues/2955
+.. _2956: https://github.com/giampaolo/psutil/issues/2956
+.. _2957: https://github.com/giampaolo/psutil/issues/2957
+.. _2958: https://github.com/giampaolo/psutil/issues/2958
+.. _2959: https://github.com/giampaolo/psutil/issues/2959
+.. _2960: https://github.com/giampaolo/psutil/issues/2960
+.. _2961: https://github.com/giampaolo/psutil/issues/2961
+.. _2962: https://github.com/giampaolo/psutil/issues/2962
+.. _2963: https://github.com/giampaolo/psutil/issues/2963
+.. _2964: https://github.com/giampaolo/psutil/issues/2964
+.. _2965: https://github.com/giampaolo/psutil/issues/2965
+.. _2966: https://github.com/giampaolo/psutil/issues/2966
+.. _2967: https://github.com/giampaolo/psutil/issues/2967
+.. _2968: https://github.com/giampaolo/psutil/issues/2968
+.. _2969: https://github.com/giampaolo/psutil/issues/2969
+.. _2970: https://github.com/giampaolo/psutil/issues/2970
+.. _2971: https://github.com/giampaolo/psutil/issues/2971
+.. _2972: https://github.com/giampaolo/psutil/issues/2972
+.. _2973: https://github.com/giampaolo/psutil/issues/2973
+.. _2974: https://github.com/giampaolo/psutil/issues/2974
+.. _2975: https://github.com/giampaolo/psutil/issues/2975
+.. _2976: https://github.com/giampaolo/psutil/issues/2976
+.. _2977: https://github.com/giampaolo/psutil/issues/2977
+.. _2978: https://github.com/giampaolo/psutil/issues/2978
+.. _2979: https://github.com/giampaolo/psutil/issues/2979
+.. _2980: https://github.com/giampaolo/psutil/issues/2980
+.. _2981: https://github.com/giampaolo/psutil/issues/2981
+.. _2982: https://github.com/giampaolo/psutil/issues/2982
+.. _2983: https://github.com/giampaolo/psutil/issues/2983
+.. _2984: https://github.com/giampaolo/psutil/issues/2984
+.. _2985: https://github.com/giampaolo/psutil/issues/2985
+.. _2986: https://github.com/giampaolo/psutil/issues/2986
+.. _2987: https://github.com/giampaolo/psutil/issues/2987
+.. _2988: https://github.com/giampaolo/psutil/issues/2988
+.. _2989: https://github.com/giampaolo/psutil/issues/2989
+.. _2990: https://github.com/giampaolo/psutil/issues/2990
+.. _2991: https://github.com/giampaolo/psutil/issues/2991
+.. _2992: https://github.com/giampaolo/psutil/issues/2992
+.. _2993: https://github.com/giampaolo/psutil/issues/2993
+.. _2994: https://github.com/giampaolo/psutil/issues/2994
+.. _2995: https://github.com/giampaolo/psutil/issues/2995
+.. _2996: https://github.com/giampaolo/psutil/issues/2996
+.. _2997: https://github.com/giampaolo/psutil/issues/2997
+.. _2998: https://github.com/giampaolo/psutil/issues/2998
+.. _2999: https://github.com/giampaolo/psutil/issues/2999
+.. _3000: https://github.com/giampaolo/psutil/issues/3000
diff --git a/psutil/arch/osx/process_info.c b/psutil/arch/osx/process_info.c
index 6ab42750..3a446a62 100644
--- a/psutil/arch/osx/process_info.c
+++ b/psutil/arch/osx/process_info.c
@@ -279,8 +279,11 @@ psutil_get_environ(pid_t pid) {
arg_ptr = procargs + sizeof(nargs);
arg_ptr = memchr(arg_ptr, '\0', arg_end - arg_ptr);
- if (arg_ptr == NULL || arg_ptr == arg_end)
+ if (arg_ptr == NULL || arg_ptr == arg_end) {
+ psutil_debug(
+ "(arg_ptr == NULL || arg_ptr == arg_end); set environ to empty");
goto empty;
+ }
// skip ahead to the first argument
for (; arg_ptr < arg_end; arg_ptr++) {
diff --git a/psutil/tests/test_process.py b/psutil/tests/test_process.py
index 08f16647..c9059e33 100755
--- a/psutil/tests/test_process.py
+++ b/psutil/tests/test_process.py
@@ -1413,11 +1413,13 @@ class TestProcess(PsutilTestCase):
code = textwrap.dedent("""
#include <unistd.h>
#include <fcntl.h>
+
char * const argv[] = {"cat", 0};
char * const envp[] = {"A=1", "X", "C=3", 0};
+
int main(void) {
- /* Close stderr on exec so parent can wait for the execve to
- * finish. */
+ // Close stderr on exec so parent can wait for the
+ // execve to finish.
if (fcntl(2, F_SETFD, FD_CLOEXEC) != 0)
return 0;
return execve("/bin/cat", argv, envp);