与正在运行的python守护进程进行通信

我写了一个作为守护进程运行的小型Python应用程序。 它利用线程和队列。

我正在寻找一些通用的方法来改变这个应用程序,这样我就可以在运行时与它通信。 大多数情况下,我希望能够监控其健康状况。

简而言之,我希望能够做到这样的事情:

python application.py start # launches the daemon 

后来,我希望能够一起来做这样的事情:

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

要清楚的是,我没有任何实现Django启发语法的问题。 我不知道该怎么做,就是发送信号到守护进程(start),或者如何编写守护进程来处理和响应这些信号。

就像我上面所说的,我在寻找一般的方法。 我现在唯一能看到的就是告诉守护进程不断logging可能需要的所有文件,但是我希望有一个不太麻烦的方法去处理。

更新:哇,很多伟大的答案。 非常感谢。 我想我会看Pyro和web.py/Werkzeug方法,因为Twisted在这一点上比我想咬一口。 我认为,下一个概念上的挑战是如何去与我的工作线程交谈,而不是把它们挂起来。

再次感谢。

如何运行一个http服务器?

这似乎很疯狂,但运行一个简单的Web服务器来pipe理你的服务器只需要几行使用web.py

你也可以考虑创build一个unixpipe道。

还有另一种方法:使用Pyro (Python远程对象)。

Pyro基本上允许你发布Python对象实例作为可以远程调用的服务。 我已经用Pyro来描述你的确切目的,我发现它工作得很好。

默认情况下,Pyro服务器守护进程接受来自任何地方的连接。 要限制这种情况,可以使用连接validation器(请参阅文档),或者将host='127.0.0.1'Daemon构造函数以仅侦听本地连接。

来自Pyro文档的示例代码:

服务器

导入Pyro.core

类JokeGen(Pyro.core.ObjBase):
         def __init __(self):
                 Pyro.core.ObjBase .__的init __(个体经营)
         def笑话(self,name):
                返回“对不起”+名+“,我不知道有什么笑话。”

 Pyro.core.initServer()
守护进程= Pyro.core.Daemon()
 URI = daemon.connect(JokeGen(), “jokegen”)

打印“守护进程在端口上运行”,daemon.port
打印“对象的uri是:”,uri

 daemon.requestLoop()

客户

导入Pyro.core

 #你必须改变下面的URI来匹配你自己的主机/端口。
 jokes = Pyro.core.getProxyForURI(“PYROLOC:// localhost:7766 / jokegen”)

打印jokes.joke(“Irmen”)

另一个类似的项目是RPyC 。 我没有试过RPyC。

使用werkzeug并使守护进程包含一个基于HTTP的WSGI服务器。

你的守护进程有一个小的WSGI应用程序的集合来响应状态信息。

您的客户端只需使用urllib2将POST或GET请求发送到localhost:somePort。 您的客户端和服务器必须同意端口号(和URL)。

这是非常简单的实施和非常可扩展的。 添加新的命令是一个简单的练习。

请注意,守护进程不必用HTML进行响应(但这通常很简单)。 我们的守护进程使用JSON编码的状态对象来响应WSGI请求。

我会用一个命名pipe道扭曲或打开一个套接字。 看看回声服务器和客户端的例子 。 您将需要修改回显服务器来检查客户端传递的一些string,然后回应任何请求的信息。

由于Python的线程问题,您将无法响应信息请求,同时继续执行任何守护进程。 asynchronous技术或分叉另一个进程是你唯一的select。

 # your server from twisted.web import xmlrpc, server from twisted.internet import reactor class MyServer(xmlrpc.XMLRPC): def xmlrpc_monitor(self, params): return server_related_info if __name__ == '__main__': r = MyServer() reactor.listenTCP(8080, Server.Site(r)) reactor.run() 

客户端可以使用xmlrpclib编写,请在这里查看示例代码。

假设你在* nix下,你可以发送信号到一个正在运行的程序,从shell中(和许多其他环境中的模拟)中kill 。 从python中处理它们检查信号模块。

您可以将它与Pyro( http://pythonhosted.org/Pyro4/ )Python远程对象相关联。 它可以让你远程访问python对象。 它很容易实现,开销很低,不像Twisted那样具有侵入性。