The purpose of this document is to list all of the notable changes to this project. The format was inspired by Keep a Changelog. This project adheres to semantic versioning.

Release 1.0 (2020-04-26)

  • Merged pull request #2 which enables Python 3.7+ compatibility by changing the executor integration to stop using the old async option and start using the new asynchronous option (given that async became a keyword in Python 3.7).
  • Updated Python compatibility:
    • Python 3.6, 3.7 and 3.8 are now tested and supported.
    • Python 2.6 and 3.4 are no longer supported.
  • Defined __all__ for existing Python modules.
  • Fixed humanfriendly deprecation warnings and bumped dependencies that went through the same process.
  • Fixed all Sphinx broken references and configured Sphinx to report broken references as errors instead of warnings (to prevent broken references from piling up in the future).
  • Various Travis CI fixes that didn’t affect published code.

Release 0.17 (2018-06-27)

Added with-gui-environment program (a generalization of notify-send-headless).

Release 0.16 (2018-06-21)

Expose the value of /proc/[pid]/cwd on Process objects as the new Process.cwd property.

Release 0.15 (2018-06-21)

  • Changes related to the proc.gpg module and the with-gpg-agent program:
    • Use existing $GPG_AGENT_INFO values when available and validated.
    • Let the operator know when starting a new GPG agent daemon (through logging).
    • Check if gpg-agent` is installed before trying to run gpg-agent --daemon.
    • Added support for GPG agent sockets in /run/user/$UID (GnuPG >= 2.1.13).
      • This incompatibility came to light when I upgraded my laptop from Ubuntu 16.04 to 18.04.
    • Fixed hanging Travis CI builds caused by gpg-agent --daemon not detaching properly when the standard error stream is redirected.
      • This incompatibility was exposed by Travis CI switching from Ubuntu 12.04 to 14.04.
    • Fixed race condition in find_gpg_agent_info() raising AttributeError.
  • Changes related to the documentation:
    • Added this change log to the documentation (with a link in the readme).
    • Integrated the property_manager.sphinx module (to generate boilerplate documentation).
    • Fixed intersphinx mapping in documentation configuration.
    • Changed HTML theme from default to nature (a wide layout).
    • Include documentation in source distributions (
  • And then some miscellaneous changes:
    • Fixed Apache WSGI configuration on Travis CI.
      • This test suite incompatibility was exposed by Travis CI switching from Ubuntu 12.04 to 14.04.
    • Restored Python 2.6 compatibility in the test suite (concerning pytest version).
    • Added license=MIT key to script.
    • Bumped the copyright to 2018.

Release 0.14 (2017-06-24)

Swallow exceptions in the notify_desktop() function.

This change is technically backwards incompatible but I consider it the more sane behavior; I had just simply never seen notify-send fail until the failure which prompted this release 😇.

Release 0.13 (2017-06-24)

  • Provide proper compatibility with GnuPG >= 2.1 which uses the fixed location ~/.gnupg/S.gpg-agent for the agent socket.
  • Bug fix for systemd incompatibility in test suite.
  • Moved test helpers to the humanfriendly.testing module.

Release 0.12 (2017-02-14)

Improved robustness of Apache master process selection.

Release 0.11 (2017-01-24)

Added with-gpg-agent program: A smart wrapper for the gpg-agent --daemon functionality that makes sure the environment variable $GPG_AGENT_INFO is always set correctly.

Release 0.10.1 (2016-11-13)

Fixed broken reStructuredText syntax in README (which breaks the rich text rendering on the Python Package Index).

Release 0.10 (2016-11-12)

  • Several improvements to cron-graceful:
    • Improved cron daemon termination.
    • Improved user friendliness of output.
    • Avoid useless log output noise.
  • Start publishing wheel distributions.
  • Explicitly signal skipped tests (when possible).
  • Refactored internal project infrastructure such as the makefile, setup script and Travis CI build configuration.

Release 0.9.1 (2016-06-13)

Silenced another race condition (ESRCH instead of ENOENT).

This is one of those things that you only observe after running a package like proc from a periodic task (cron job) that runs every minute on a dozen servers for a couple of weeks 🙂. The error condition was -correctly- being swallowed already, but it was more noisy than it needed to be.

Release 0.9 (2016-06-01)

Refactored the separation of concerns between the executor and proc packages.

Please refer to the commit message of the other side of this refactoring (executor#b484912bb33) for details about the how and why of this fairly involved refactoring 🙂.

Release 0.8.5 (2016-05-27)

  • Demote race condition log messages from WARNING to DEBUG level.

    Reasoning: Race condition log messages are so frequent that they become noise, drowning out other more important log messages, so I decided to make them less noisy 🙂.

  • Fixed a confusing typo in the API docs, left over from a sentence that was (half) reformulated.

  • Noted a future improvement in the documentation: Generalized notify-send-headless functionality.

Release 0.8.4 (2016-04-22)

  • Improved notify-send-headless documentation.
  • Improved test coverage by mocking external dependencies.

Release 0.8.3 (2016-04-21)

  • Increase cron-graceful[-additions] test coverage.
  • Avoid duplicate builds on Travis CI.
  • Test suite bug fix.

Release 0.8.2 (2016-04-21)

Increase test coverage (somewhat of a cop-out 🙂).

Release 0.8.1 (2016-04-21)

Now including an upstream bug fix to make the previous release work :-(.

Release 0.8 (2016-04-21)

  • Try to make notify-send-headless foolproof.
  • Document supported Python implementations in
  • Enabled Python 3.5 tests on Travis CI, documented Python 3.5 support.

Release 0.7 (2016-01-29)

Expose the real user/group names of processes.

Release 0.6 (2016-01-28)

  • Expose /proc/[pid]/status (UID/GID information considered useful 🙂).
  • Changed Process.from_pid() to use Process.from_path().
  • Re-ordered fields of Process class alphabetically.
  • Switched to flake8 for code style checks, fixed code style warnings pointed out by flake8.
  • Updated tox.ini to include py35 and options for flake8 and pytest.
  • Improved test coverage.
  • Refactored the makefile.

Release 0.5.1 (2015-11-19)

Bug fix: Restored Python 2.6 compatibility (regarding the __exit__() calling convention).

Release 0.5 (2015-11-19)

  • Extracted /proc/uptime parsing to a separate function.
  • Generalized error handling (of permission errors and race conditions).
  • Expose /proc/[pid]/environ (also: notify-send-headless 🙂).

Release 0.4.1 (2015-11-10)

Two minor bug fixes:

  • Added a Process.command_line to Process.cmdline alias (to improve the compatibility with the process management code that’s shared between the executor and proc packages).
  • Improved the documentation after refactorings in the 0.4 release broke some references.

Release 0.4 (2015-11-10)

Release 0.3 (2015-09-25)

Make the cron-graceful command “repeatable” (as in, running it twice will not report a CronDaemonNotRunning exception to the terminal but will just mention that cron is not running and then exit gracefully).

Release 0.2.3 (2015-09-25)

  • Bug fix: Make sure interactive spinners restore cursor visibility.
  • Refactored script, improved trove classifiers.
  • Removed redundant :py: prefixes from reStructuredText fragments.
  • Bug fix for make coverage target in Makefile.

Release 0.2.2 (2015-06-26)

Bug fix: Avoid KeyError exception during tree construction.

Release 0.2.1 (2015-04-16)

  • Fixed incompatibility with cached-property 1.1.0 (removed __slots__ usage).
  • Fixed last remaining Python 2.6 incompatibility (in test suite).

Release 0.2 (2015-03-30)

  • Added an example proc.apache module that monitors Apache worker memory usage.
  • Made the test suite more robust and increased test coverage.

Release 0.1.1 (2015-03-30)

Release 0.1 (2015-03-29)

This was the initial commit and release. The “History” section of the readme provides a bit more context:

I’ve been writing shell and Python scripts that parse /proc for years now (it seems so temptingly easy when you get started 😉). Sometimes I resorted to copy/pasting snippets of Python code between personal and work projects because the code was basically done, just not available in an easy to share form.

Once I started fixing bugs in diverging copies of that code I decided it was time to combine all of the features I’d grown to appreciate into a single well tested and well documented Python package with an easy to use API and share it with the world.

This means that, although I made my first commit on the proc package in March 2015, much of its code has existed for years in various forms.