{ "info": { "author": "Chris Hunt", "author_email": "chrahunt@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: POSIX :: Linux", "Programming Language :: C" ], "description": "# process-tracker\n\nProcess tracker enables tracking creation of child processes.\n\nUsage:\n\n```python\nimport process_tracker; process_tracker.install()\n\nimport os\n\npid1 = os.fork()\npid2 = os.fork()\npid3 = os.fork()\n\nif pid1 and pid2 and pid3:\n print(process_tracker.children())\n```\n\nPrints a list of tuples with `(pid, create_time)` for each process.\n\n`create_time` can be used to confirm that the current process (if any) with\nthe given pid is the same as the original. For example:\n\n```python\nimport process_tracker\nimport psutil\n\n\ndef get_create_time(ctime):\n boot_time = psutil.boot_time()\n clock_ticks = os.sysconf(\"SC_CLK_TCK\")\n return boot_time + (ctime / clock_ticks)\n\n\nprocesses = []\nfor pid, create_time in process_tracker.children():\n try:\n p = psutil.Process(pid=pid)\n except psutil.NoSuchProcess:\n continue\n if p.create_time() == get_create_time(create_time):\n processes.append(p)\n\n# processes now has the list of active child processes\n# psutil itself does a check before sensitive operations that the\n# active process create time is the same as when the Process object\n# was initialized.\nfor p in processes:\n p.terminate()\n```\n\n# Limitations\n\n1. Only tracks children spawned from dynamically-linked executables.\n1. Relies on `LD_PRELOAD` so will not work for setuid/setgid executables.\n\n# Development\n\n## Basic\n\n1. `python -m venv .venv`\n1. `.venv/bin/python -m pip install tox`\n1. Make changes\n1. `.venv/bin/python -m tox`\n\n## Debugging C build\n\nAvoids overhead of making sdist\n\n1. As above\n1. `make c-build`\n\n## Debugging issues from sub-process\n\ngdb debugging of sub-processes.\n\n1. As above\n1. `make debug`\n\n## Debugging tests without rebuild\n\n1. As above\n1. `.venv/bin/python -m pip install . .[dev]`\n\nThen\n\n* `pip install . && pytest` when rebuild is needed\n* `pytest` when only tests changed\n\n\n## Release\n\n```\ndocker run \\\n -e REAL_UID=$(id -u) \\\n -e REAL_GID=$(id -g) \\\n -v \"$PWD/scripts/build.sh:/build.sh\" \\\n -v \"$PWD:/src\" \\\n dockcross/manylinux1-x64 \\\n sh -c 'cd /src && env \"PATH=/opt/python/cp37-cp37m/bin:$PATH\" /build.sh'\n```\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/chrahunt/process-tracker", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "process-tracker", "package_url": "https://pypi.org/project/process-tracker/", "platform": "", "project_url": "https://pypi.org/project/process-tracker/", "project_urls": { "Homepage": "https://github.com/chrahunt/process-tracker" }, "release_url": "https://pypi.org/project/process-tracker/0.1.2/", "requires_dist": [ "cmake ; extra == 'dev'", "Cython ; extra == 'dev'", "ninja ; extra == 'dev'", "pytest ; extra == 'dev'", "pytest-forked ; extra == 'dev'", "scikit-build ; extra == 'dev'", "setuptools ; extra == 'dev'", "tox ; extra == 'dev'" ], "requires_python": "", "summary": "Track child processes.", "version": "0.1.2" }, "last_serial": 5319776, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "f84eb494e2bc2149f4cf6f016b12acf6", "sha256": "e3b5981292bc427fa186ccd7fa5e299e46fc41064054485ac8ae694b35346079" }, "downloads": -1, "filename": "process-tracker-0.1.0.tar.gz", "has_sig": false, "md5_digest": "f84eb494e2bc2149f4cf6f016b12acf6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18424, "upload_time": "2019-05-25T18:07:56", "url": "https://files.pythonhosted.org/packages/81/91/ae32420060304ea95e921e3e389bb9f70b279a40f25316f975f4f956ecbd/process-tracker-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "ca96285f03e8994e1525b442ed1137ae", "sha256": "8f7122953765473fefefc5f0b22def9355c30fbccafee37083db6af064c90da9" }, "downloads": -1, "filename": "process_tracker-0.1.1-cp37-cp37m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "ca96285f03e8994e1525b442ed1137ae", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": null, "size": 82001, "upload_time": "2019-05-26T17:03:49", "url": "https://files.pythonhosted.org/packages/00/9e/2a8c43ed5b7577df2c148ed57b32e57886d3310f362d116ad6519ae131d2/process_tracker-0.1.1-cp37-cp37m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "ca0ec9bafb5649a1f749b386d7aeffb3", "sha256": "679bb44b4edd1043381057d0806e8780ae25440a07d638d62ead2bc0cd38f258" }, "downloads": -1, "filename": "process-tracker-0.1.1.tar.gz", "has_sig": false, "md5_digest": "ca0ec9bafb5649a1f749b386d7aeffb3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30035, "upload_time": "2019-05-26T17:03:50", "url": "https://files.pythonhosted.org/packages/a3/9d/59ac99cbb6f1d9702a7215684545b01e081e657ebc16fbba5df40edf28aa/process-tracker-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "597cba19f2d17e01ab837ff3a4620b53", "sha256": "8ca1035ca9e17fa8dbcf5f79ac6ff7ac0fb9411860f4cfd9f91533735726cd89" }, "downloads": -1, "filename": "process_tracker-0.1.2-cp37-cp37m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "597cba19f2d17e01ab837ff3a4620b53", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": null, "size": 82074, "upload_time": "2019-05-26T20:35:30", "url": "https://files.pythonhosted.org/packages/1b/b7/9a54c608b023587dc26a805fcc75bf06f4a07239dd7c8f477dad9308dc89/process_tracker-0.1.2-cp37-cp37m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "95d030de689660ae914ef39fca1c0adf", "sha256": "c5307ea90fc36d53fa6c2034f4a1f1ed54a5e58e2ab0f203aad94b545f2fe1e3" }, "downloads": -1, "filename": "process-tracker-0.1.2.tar.gz", "has_sig": false, "md5_digest": "95d030de689660ae914ef39fca1c0adf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30420, "upload_time": "2019-05-26T20:35:32", "url": "https://files.pythonhosted.org/packages/08/ce/a9643120a5de4796b3a935e618b831f1d186eab31fde8f734f7ebb37df16/process-tracker-0.1.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "597cba19f2d17e01ab837ff3a4620b53", "sha256": "8ca1035ca9e17fa8dbcf5f79ac6ff7ac0fb9411860f4cfd9f91533735726cd89" }, "downloads": -1, "filename": "process_tracker-0.1.2-cp37-cp37m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "597cba19f2d17e01ab837ff3a4620b53", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": null, "size": 82074, "upload_time": "2019-05-26T20:35:30", "url": "https://files.pythonhosted.org/packages/1b/b7/9a54c608b023587dc26a805fcc75bf06f4a07239dd7c8f477dad9308dc89/process_tracker-0.1.2-cp37-cp37m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "95d030de689660ae914ef39fca1c0adf", "sha256": "c5307ea90fc36d53fa6c2034f4a1f1ed54a5e58e2ab0f203aad94b545f2fe1e3" }, "downloads": -1, "filename": "process-tracker-0.1.2.tar.gz", "has_sig": false, "md5_digest": "95d030de689660ae914ef39fca1c0adf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30420, "upload_time": "2019-05-26T20:35:32", "url": "https://files.pythonhosted.org/packages/08/ce/a9643120a5de4796b3a935e618b831f1d186eab31fde8f734f7ebb37df16/process-tracker-0.1.2.tar.gz" } ] }