Skip to main content

Library to define and manage daemonized Python-based programs in programmatic (SDK) or CLI-ready ways

Project description

daemonizer

PyPI - Version Linting Docs Publish Ruff Dependabot Updates PyPI - Python Version PyPI - Downloads

Light-weight and easy-to-use Python package that simplifies the process of daemonizing Python applications, allowing them to run in the background as standalone logics.

Features

  • Simple API to daemonize any Python function or class
  • Automatic handling of process management (PID files, logging, etc.)
  • Support for start, stop, restart, and status operations
  • Signal handling (SIGTERM, SIGINT, etc.)
  • Compatible with UNIX-like systems
  • Python 3.7+ support

Getting started

Install package using uv or pip:

uv add daemonizer-py # pip install daemonizer-py

Create a Python script daemon.py where you can define your daemon logic following below framework:

from datetime import datetime
from time import sleep

from daemonizer.core.daemons.logic import forever_loop
from daemonizer.core.daemons.unix import UNIXDaemon

class SampleDaemon(UNIXDaemon):
    """ Sample daemon """

    @forever_loop(catch_exceptions=False, after_delay=0.01)
    def run(self) -> None:
        with open("/tmp/hello_daemon.log", "a") as f:
            f.write(f"Hello, World {datetime.now()}\n")
            f.write(f"{self.kwargs().get('ssa', None)}\n")
        sleep(1)

Defining a daemon is very simple:

  1. Create a subclass of UNIXDaemon
  2. Just overload the run(...) method with your logic to be executed in the daemon

[!NOTE] No need to worry about while True: loop. If you decorate the run(...) method with the @forever_loop(...) decorator, the logic defined inside will be executed infinitely.

Optional arguments are available for the @forever_loop(...) decorator. (See docs)

Once defined, you can start a daemon using two methods:

  • Using handler func:
if __name__ == "__main__":
    handler(SampleDaemon(name="daemon_1"))
uv run daemon.py [start|stop|restart|status]
  • Using context manager handler with DaemonHandler():
from daemonizer.core.handlers.ctx_manager import DaemonHandler
# Daemons handler
with DaemonHandler() as h:
    h.start(SampleDaemon1(name="daemon_1"))
    h.start(SampleDaemon2(name="daemon_2"))

[!WARNING] Daemon should have a unique name at global level (no duplicate).

  • Using CLI:
daemonizer start daemon.py # START op will be performed on all daemons defined in this file
daemonizer start daemon.py SampleDaemon1 # START op will be performed **ONLY** on `SampleDaemon1` defined in this file
  • Using API or web-app (WIP)

The package provides a simple command-line interface to interact with the daemonized process. The following commands are available:

$ python3 main.py {start,stop,restart,status}

Contribute

Clone the repo, improve the code base and submit a pull request

git clone https://github.com/lcsrodriguez/daemonizer.git
cd daemonizer/
uv sync
pre-commit install-hooks

License

This project is licensed under the MIT License - see the LICENSE file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

daemonizer_py-1.5.3.tar.gz (60.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

daemonizer_py-1.5.3-py3-none-any.whl (30.5 kB view details)

Uploaded Python 3

File details

Details for the file daemonizer_py-1.5.3.tar.gz.

File metadata

  • Download URL: daemonizer_py-1.5.3.tar.gz
  • Upload date:
  • Size: 60.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for daemonizer_py-1.5.3.tar.gz
Algorithm Hash digest
SHA256 6fd22b2448c15fe3a1d123f202c33bacb2091d929109150ced4cb1d0686fd6dc
MD5 0aff0da6a617226034d7ae081963f0b1
BLAKE2b-256 2664e1194c9d21f50b6a7040907132e7d79ca3c4c1c17c2a6f227531b2ec38c1

See more details on using hashes here.

File details

Details for the file daemonizer_py-1.5.3-py3-none-any.whl.

File metadata

  • Download URL: daemonizer_py-1.5.3-py3-none-any.whl
  • Upload date:
  • Size: 30.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for daemonizer_py-1.5.3-py3-none-any.whl
Algorithm Hash digest
SHA256 6388c1e1996a49535ed34d74e733a4c6c656b2a5fd7b2d77dde10eb6aba88727
MD5 c5863b7e20d2397b431f9d6c623e3a44
BLAKE2b-256 f749b6ca23be3eb47a2d27b6e2bfb5d5205e34db241f8661addf6a637fb39d9a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page