ZC Buildout配方,用于组织启动脚本。
项目描述
代码仓库: http://svn.plone.org/svn/collective/buildout/plone.recipe.cluster/
变更历史
trunk (2008-08-11)
xxx [Ingeniweb]
0.1.0 (未发布)
Linux守护进程的初始实现。 [tarek]
使用ZopeSkel创建配方。 [tarek]
详细文档
支持选项
该配方支持以下选项
- debug
默认选项是0。当设置为1时,允许在非阻塞守护进程中运行测试。
- start
多行选项。每行是守护进程在启动时调用的命令行。命令必须立即返回,因为守护进程在启动下一个命令之前会等待它。
但是,可以使用带有background:前缀的命令行将其推送到后台。
- stop
多行选项。每行是守护进程在停止时调用的命令行。命令必须立即返回,因为守护进程在启动下一个命令之前会等待它。
可以通过提供带 PID 的 pid:value 命令行来请求守护进程终止指定的进程。其中 value 是 PID 号码,或者是一个包含 PID 的文本文件。
还提供了 background: 前缀。
- 重启
多行选项。每一行都是一个命令行,当守护进程使用 restart 选项时将被调用。这些命令必须立即返回,因为守护进程在启动下一个命令之前会等待它。
可以通过提供带 PID 的 pid:value 命令行来请求守护进程终止指定的进程。其中 value 是 PID 号码,或者是一个包含 PID 的文本文件。
还提供了 background: 前缀。
- pid-file
定义了守护进程 PID 文件的路径。
示例用法
cluster 配方允许您为 buildout 创建复合命令。有三个命令
start
stop
重启
每个命令都是一个包含要运行命令列表的变量。然后配方启动:- 基于 Linux 的系统下的守护进程 - Windows 下的 NT 服务
例如,一个典型的用法是启动 zeo、zope 和 pound
[buildout] ... [cluster] recipe = plone.recipe.cluster poundctl = ${buildout:bin-directory}/pound -f ${buildout:directory}/parts/pound/etc/pound.cfg -c ${buildout:directory}/pound.pid start = ${buildout:bin-directory}/zeoserver start ${buildout:bin-directory}/instance start ${cluster:poundctl} stop = ${buildout:bin-directory}/zeoserver stop ${buildout:bin-directory}/instance stop pid:${buildout:directory}/pound.pid restart = ${buildout:bin-directory}/zeoserver restart ${buildout:bin-directory}/instance restart ${cluster:poundctl}
让我们试试这个
>>> write('buildout.cfg', ... """ ... [buildout] ... parts = cluster ... index = http://pypi.python.org/simple ... [cluster] ... recipe = plone.recipe.cluster ... debug = 1 ... start = ... background:${buildout:bin-directory}/script1 ... ${buildout:bin-directory}/script2 start ... ... stop = ... ${buildout:bin-directory}/script2 stop ... ... restart = ... background:${buildout:bin-directory}/script1 ... ${buildout:bin-directory}/script2 restart ... ... """)
运行 buildout 给我们
>>> print system(buildout) Getting distribution for 'zc.recipe.egg'. Got zc.recipe.egg 1.0.0. Installing cluster. Generated script '/.../bin/cluster'. <BLANKLINE>
现在让我们看看创建的脚本
>>> script = join(sample_buildout, 'bin', 'cluster') >>> print open(script).read() #!...python <BLANKLINE> import sys sys.path[0:0] = [ ... ] <BLANKLINE> import plone.recipe.cluster.ctl <BLANKLINE> if __name__ == '__main__': plone.recipe.cluster.ctl.main(...) <BLANKLINE>
让我们创建假的脚本
>>> script2 = join(sample_buildout, 'bin', 'script2') >>> f = open(script2, 'w') >>> f.write('echo script 2') >>> f.close() >>> import os >>> os.chmod(script2, 0770) >>> script1 = join(sample_buildout, 'bin', 'script1') >>> f = open(script1, 'w') >>> import sys >>> f.write("""\ ... #!%s ... import time ... while 1: ... time.sleep(0.1) ... """ % sys.executable) >>> f.close() >>> os.chmod(script1, 0770)
让我们尝试执行它
>>> print system(script) usage: /sample-buildout/bin/cluster start|stop|restart|status <BLANKLINE>
让我们请求状态
>>> print system('%s status' % script) Not running.
啊,让我们启动它!
>>> print system('%s start' % script) Cluster is starting... Running in background ...script1 Background pid is ... Background subpid is ... Running ...script2 start script 2 Child PIDs: ..., ... Started with pid ... Cluster is alive... <BLANKLINE>
让我们请求状态
>>> print system('%s status' % script) Running.
我们不应该能够启动两次
>>> print system('%s start' % script) <BLANKLINE> Start aborded since pid file '...' exists. <BLANKLINE>
让我们停止它
>>> print system('%s stop' % script) <BLANKLINE> Cluster is going down... <BLANKLINE>
让我们重启它
>>> print system('%s restart' % script) Could not stop, pid file 'cluster.pid' missing. <BLANKLINE>
哦,它已经停止了!
贡献者
Tarek Ziade,作者
下载
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。