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.
- 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
Install package using uv or pip:
uv add daemonizer-py # pip install daemonizer-pyCreate 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:
- Create a subclass of
UNIXDaemon - 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
handlerfunc:
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}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-hooksThis project is licensed under the MIT License - see the LICENSE file for details.