Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Communicating with a running python daemon

Tags:

python

daemon

I wrote a small Python application that runs as a daemon. It utilizes threading and queues.

I'm looking for general approaches to altering this application so that I can communicate with it while it's running. Mostly I'd like to be able to monitor its health.

In a nutshell, I'd like to be able to do something like this:

python application.py start  # launches the daemon 

Later, I'd like to be able to come along and do something like:

python application.py check_queue_size  # return info from the daemonized process 

To be clear, I don't have any problem implementing the Django-inspired syntax. What I don't have any idea how to do is to send signals to the daemonized process (start), or how to write the daemon to handle and respond to such signals.

Like I said above, I'm looking for general approaches. The only one I can see right now is telling the daemon constantly log everything that might be needed to a file, but I hope there's a less messy way to go about it.

UPDATE: Wow, a lot of great answers. Thanks so much. I think I'll look at both Pyro and the web.py/Werkzeug approaches, since Twisted is a little more than I want to bite off at this point. The next conceptual challenge, I suppose, is how to go about talking to my worker threads without hanging them up.

Thanks again.

like image 287
hanksims Avatar asked Mar 18 '09 04:03

hanksims


People also ask

How do you interact with Daemon?

use tcp socket if you want to use telnet to communicate with your daemon. If that's the case, just bind the TCP socket to localhost. Otherwise, you'll need to write your own (simple) tool to communicate with your daemon.

How do I run a daemon process in python?

Daemon processes in Python To execute the process in the background, we need to set the daemonic flag to true. The daemon process will continue to run as long as the main process is executing and it will terminate after finishing its execution or when the main program would be killed.


1 Answers

Yet another approach: use Pyro (Python remoting objects).

Pyro basically allows you to publish Python object instances as services that can be called remotely. I have used Pyro for the exact purpose you describe, and I found it to work very well.

By default, a Pyro server daemon accepts connections from everywhere. To limit this, either use a connection validator (see documentation), or supply host='127.0.0.1' to the Daemon constructor to only listen for local connections.

Example code taken from the Pyro documentation:

Server

 import Pyro.core  class JokeGen(Pyro.core.ObjBase):         def __init__(self):                 Pyro.core.ObjBase.__init__(self)         def joke(self, name):                 return "Sorry "+name+", I don't know any jokes."  Pyro.core.initServer() daemon=Pyro.core.Daemon() uri=daemon.connect(JokeGen(),"jokegen")  print "The daemon runs on port:",daemon.port print "The object's uri is:",uri  daemon.requestLoop() 

Client

 import Pyro.core  # you have to change the URI below to match your own host/port. jokes = Pyro.core.getProxyForURI("PYROLOC://localhost:7766/jokegen")  print jokes.joke("Irmen") 

Another similar project is RPyC. I have not tried RPyC.

like image 198
codeape Avatar answered Sep 22 '22 14:09

codeape