1

i'm trying to create a daemon service in python with log to file opption using logging. If i add the pidfile parameter to daemon.DaemonContext constructor, logger is not log any messages to logger.log file. But if i remove that parameter, everything is working. runs without any errors. Can anyone know why pidfile parameter in daemon.DaemonContext disable log messages? and how can i solve that?

Any help will be appreciated. Thanks

import signal
import daemon
import lockfile
import logging
import logging.handlers

def run():

    logger = logging.getLogger("DaemonLog")
    logger.setLevel(logging.INFO)
    handler = logging.FileHandler('logger.log')
    handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
    logger.addHandler(handler)

    daemon_context = daemon.DaemonContext(
        working_directory='/opt/myDaemon',
        umask=0o002,
        pidfile=lockfile.FileLock('/var/run/myDaemon.pid'),
        files_preserve=[handler.stream]
    )
    daemon_context.signal_map = {
        signal.SIGTERM: terminate_collector,
        signal.SIGHUP: terminate_collector,
        signal.SIGABRT: terminate_collector
    }

    with daemon_context as context:
        while True:
            logger.info("log")
            func()
            time.sleep(PARAM_SLEEP)

if __name__ == "__main__":
    run()
Rimon Fedyuk
  • 471
  • 1
  • 4
  • 8

1 Answers1

1

I succeed to solve the problem. The problem was that no pidfile was created with the command:

pidfile=lockfile.FileLock('/var/run/myDaemon.pid')

The solution is to use daemon.pidfile module instead of the lockfile module:

pidfile=daemon.pidfile.PIDLockFile('/var/run/myDaemon.pid')

Full code solution:

import signal
import daemon
import daemon.pidfile
import lockfile
import logging
import logging.handlers

def run():

    logger = logging.getLogger("DaemonLog")
    logger.setLevel(logging.INFO)
    handler = logging.FileHandler('logger.log')
    handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
    logger.addHandler(handler)

    daemon_context = daemon.DaemonContext(
        working_directory='/opt/myDaemon',
        umask=0o002,
        pidfile=daemon.pidfile.PIDLockFile('/var/run/myDaemon.pid'),
        files_preserve=[handler.stream]
    )
    daemon_context.signal_map = {
        signal.SIGTERM: terminate_collector,
        signal.SIGHUP: terminate_collector,
        signal.SIGABRT: terminate_collector
    }

    with daemon_context as context:
        while True:
            logger.info("log")
            func()
            time.sleep(PARAM_SLEEP)

if __name__ == "__main__":
    run()
Rimon Fedyuk
  • 471
  • 1
  • 4
  • 8