与正在运行的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那样具有侵入性。