UNIX系统下的进程状态控制系统
项目描述
Supervisor是一个客户端/服务器系统,允许用户在类UNIX操作系统上控制多个进程。
支持的平台
Supervisor已在Linux(Ubuntu)、Mac OS X(10.4、10.5、10.6)、Solaris(10 for Intel)和FreeBSD 6.1上测试过,并且已知在这些系统上运行。它可能在大多数UNIX系统上运行良好。
Supervisor在Windows的任何版本下都无法运行。
Supervisor旨在在Python 3版本3.4或更高版本以及Python 2版本2.7上工作。
文档
您可以在HTML格式中在线查看当前Supervisor文档。这是您应该前往以获取详细的安装和配置文档的地方。
报告错误和查看源存储库
请在GitHub问题跟踪器中报告错误。
您可以通过https://github.com/Supervisor/supervisor查看supervisor的源存储库。
贡献
我们将在GitHub上的拉取请求中审查社区贡献。
4.2.5 (2022-12-23)
修复了一个bug,当XML-RPC方法supervisor.startProcess()在无法解析命令时,会返回500内部服务器错误而不是XML-RPC故障响应。修复方案由Julien Le Cléach提供。
修复了Python 2.7中的一个bug,当使用Web界面时可能会发生UnicodeDecodeError。修复方案由Vinay Sajip提供。
移除了Python 3.8中已弃用的urllib.parse函数splithost、splitport和splittype的使用。
移除了Python 3.10中已弃用的asynchat和asyncore的使用。
现在,XML-RPC方法supervisor.getAllConfigInfo()的返回值包括了程序的directory、uid和serverurl。修复方案由Yellmean提供。
如果一个子进程以意外的退出码退出(在[program:x]部分中未列出的退出码),则现在将在WARN级别而不是INFO级别记录退出。修复方案由Precy Lee提供。
现在,如果提供参数,supervisorctl shutdown将显示错误消息。
现在使用更快的os.closerange()来关闭文件描述符,而不是在循环中调用os.close()。修复方案由tyong920提供。
4.2.4 (2021-12-30)
修复了一个bug,其中命令行参数--identifier被忽略。这个bug至少从2009年发布的3.0a7版本以来就存在了,并且可能更早。修复方案由Julien Le Cléach提供。
4.2.3 (2021-12-27)
修复了一个竞争条件,其中订阅事件的rpcinterface扩展在事件回调中立即访问Subprocess实例的state属性时,不会看到正确的过程状态。修复方案由Chao Wang提供。
将setuptools软件包添加到setup.py中依赖项列表中,因为它是一个运行时依赖项。修复方案由Louis Sautier提供。
如果缺少日志文件,Web界面现在将返回404未找到响应,而之前会返回410已删除。这种更改是因为410意味着条件可能是永久性的。通常,缺少日志文件是临时的,例如,从未启动的过程将不会有日志文件,但一旦启动就会有一个。
4.2.2 (2021-02-26)
修复了一个bug,其中如果子进程在尝试杀死它之前立即退出,则supervisord可能会崩溃。
修复了一个bug,其中[program:x]部分的stdout_syslog和stderr_syslog选项除非为同一程序配置了文件记录,否则无法使用。现在可以独立使用文件和syslog选项。修复方案由Scott Stroupe提供。
修复了一个bug,其中在[supervisord]部分中,当提供特殊文件名syslog时,logfile选项不会记录到syslog,如所有其他日志文件名选项所支持。修复方案由Franck Cuny提供。
修复了一个bug,其中在[supervisord]部分或[program:x]部分中定义的环境变量在%(ENV_x)s展开中无法使用。修复方案由MythRen提供。
现在,supervisorctl signal命令允许在进程处于STOPPING状态时发送信号。修复方案由Mike Gould提供。
supervisorctl 和 supervisord 现在在给定 -? 时除了现有的 -h/--help 外,还会打印帮助信息。
4.2.1 (2020-08-20)
修复了在 Python 3 上由于网络错误导致 supervisord 冒出错误 <class 'TypeError'>:can't concat str to bytes 的错误。补丁由 Vinay Sajip 提供。
修复了一个错误,在具有 glibc 2.3.1 的系统上,由于 SOMAXCONN 的默认值已更改,测试会失败。
4.2.0 (2020-04-30)
当 supervisord 在前台运行时,一个新的 --silent 选项会抑制主日志被输出到 stdout,就像通常那样。补丁由 Trevor Foster 提供。
现在解析 command= 支持一个新的扩展 %(numprocs)d,它扩展到同一部分中的 numprocs= 的值。补丁由 Santjago Corkez 提供。
Web UI 按钮不再使用背景图像。补丁由 Dmytro Karpovych 提供。
Web UI 现在有链接查看进程的 tail -f stderr,除了现有的 tail -f stdout 链接。基于 OuroborosCoding 的补丁。
HTTP 服务器现在将在 logtail 响应中发送一个 X-Accel-Buffering: no 标头以修复 Nginx 代理缓冲。补丁由 Weizhao Li 提供。
当 supervisord 收割一个未知的 PID 时,现在将记录 waitpid 状态的描述。补丁由 Andrey Zelenchuk 提供。
修复了在 4.0.3 中引入的 bug,其中 supervisorctl tail -f foo | grep bar 会因错误 NoneType object has no attribute 'lower' 而失败。这仅在 Python 2.7 上发生,并且仅在管道中发生。补丁由 Slawa Pidgorny 提供。
4.1.0 (2019-10-19)
修复了仅在 Python 3 上存在的 bug,即向 syslog 记录日志不会工作,并将异常 TypeError: a bytes-like object is required, not 'str' 记录到主 supervisord 日志文件。补丁由 Vinay Sajip 和 Josh Staley 提供。
修复了由于移除 cgi.escape() 而引起的 Python 3.8 兼容性问题。补丁由 Mattia Procopio 提供。
meld3 包不再是一个依赖项。现在 supervisor 包本身包含了一个 meld3 版本。
4.0.4 (2019-07-15)
修复了一个错误,其中 supervisorctl tail <name> stdout 实际上是 tail stderr。注意,没有明确 stdout 的 tail <name> 正确 tail stdout。该错误自 3.0a3(2007 年发布)以来存在。补丁由 Arseny Hofman 提供。
改进了在 4.0.3 中添加的警告信息,现在它会对 tail 和 tail -f 都发出。补丁由 Vinay Sajip 提供。
CVE-2019-12105。仅添加文档,没有代码更改。这个 CVE 表明 inet_http_server 默认不使用身份验证(详情)。请注意,inet_http_server 默认未启用,并且也没有在 echo_supervisord_conf 输出的示例配置中启用。自 2006 年引入该功能以来,inet_http_server 选项的行为已正确记录,并且没有更改。向文档中添加了一个新的 警告信息。
4.0.3 (2019-05-22)
修复了Python 2中运行supervisorctl tail -f <name>时失败的错误,错误信息为Cannot connect, error: <type 'exceptions.UnicodeEncodeError'>,该错误可能在Supervisor 3.x中可以正常工作。该问题是在Supervisor 4.0.0版本中引入的,因为为了添加Python 3支持,需要新的bytes/strings转换。为了使supervisorctl能够正确显示包含Unicode字符的日志,环境指定的终端编码必须支持它。如果不支持,Python 2或3上仍然可能会出现UnicodeEncodeError。如果检测到有问题的终端编码,现在将打印一个新的警告信息。由Vinay Sajip提供的补丁。
4.0.2 (2019-04-17)
修复了配置文件中内联注释解析不正确的问题,导致注释被视为值的一部分。这仅在Python 2上发生,并且仅在环境中安装了额外的configparser模块的情况下发生。该错误是在Supervisor 4.0.0版本中引入的,因为兼容Python 2/3的代码期望Python 2环境仅有一个ConfigParser模块。
4.0.1 (2019-04-10)
修复了Python 3中的一个问题,如果在[supervisord]部分将logfile设置为非可寻址的特殊文件(如/dev/stdout),则会发生OSError: [Errno 29] Illegal seek错误,即使设置了logfile_maxbytes = 0来禁用旋转。该问题仅影响主日志,不影响子日志。由Martin Falatic提供的补丁。
4.0.0 (2019-04-05)
已添加对Python 3的支持。在Python 3上,Supervisor需要Python 3.4或更高版本。感谢Vinay Sajip、Scott Maxwell、Palm Kevin、Tres Seaver、Marc Abramowitz、Son Nguyen、Shane Hathaway、Evan Andrews和Ethan Hann的贡献,他们都对Python 3移植工作做出了重大贡献。还要感谢所有提交问题报告和补丁的贡献者。
已停止支持Python 2.4、2.5和2.6。在Python 2上,Supervisor现在需要Python 2.7。
《supervisor》包不再是命名空间包。
配置文件扩展%(here)s的行为已更改。在先前版本中,一个错误导致%(here)s始终扩展到根配置文件的目录。现在,当在通过[include]包含的文件中使用%(here)s时,它将扩展到该文件的目录。感谢Alex Eftimie和Zoltan Toth-Czifra提供的补丁。
配置文件设置exitcodes=的默认值,预期的程序退出代码,已更改。在先前版本中,它是0,2。这导致Golang程序中存在问题的退出代码为2。现在exitcodes的默认值是0。
已删除多行上可以组合多个supervisorctl命令并使用分号分隔的未记录功能。
当出现错误条件时,supervisorctl现在将退出代码设置为非零值。先前版本在大多数错误条件下都没有设置退出代码,因此它几乎总是0。由Luke Weber提供的补丁。
已向配置文件添加了新的stdout_syslog和stderr_syslog选项。这些是布尔选项,指示进程输出是否将被发送到syslog。Supervisor现在可以同时将日志记录到文件和syslog。指定日志文件名为syslog仍然受支持,但已弃用。由Jason R. Coombs提供的补丁。
3.4.0 (2019-04-05)
现在可以在组([group:x])中使用FastCGI程序([fcgi-program:x]部分)。修复由Florian Apolloner提供。
在< span class="docutils literal">[fcgi-program:x] 部分中添加了新的socket_backlog选项,用于设置listen(2)套接字队列。修复由Nenad Merdanovic提供。
修复了< span class="docutils literal">SupervisorTransport(与Unix域套接字一起使用的XML-RPC传输)在调用< span class="docutils literal">close()时未关闭连接的bug。修复由Jérome Perrin提供。
修复了< span class="docutils literal">supervisorctl start <name>如果在系统时钟回滚的情况下会长时间挂起的bug。修复由Joe LeVeque提供。
3.3.5 (2018-12-22)
修复了< span class="docutils literal">supervisord在接收到< span class="docutils literal">SIGHUP时会取消正在进行的关闭操作的竞争条件。现在,如果关闭操作已在进行中,< span class="docutils literal">supervisord将忽略< span class="docutils literal">SIGHUP。修复由Livanh提供。
修复了在environment=中搜索相对命令时忽略对PATH的更改的bug。基于dongweiming提供的补丁。
childutils.ProcessCommunicationsProtocol现在在写入stdout后执行显式的flush()。
如果配置文件中的名称包含不允许的字符,现在将发出更详细的错误消息。修复由Rick van Hattem提供。
3.3.4 (2018-02-15)
修复了重新读取配置时无法检测到eventlisteners更改的bug。修复由Michael Ihde提供。
修复了如果可执行文件名称更改,< span class="docutils literal">supervisorctl可能会错误地显示警告< span class="docutils literal">Supervisord以root用户运行,正在搜索其配置文件的bug。
修复了如果配置文件中的[< span class="docutils literal">supervisord]部分指定了user=但setuid()切换到该用户失败,< span class="docutils literal">supervisord将继续启动的bug。现在,如果无法降低权限,它将立即退出。
修复了Web界面中的bug,其中重定向URL中没有在主机和查询字符串之间包含斜杠,这在使用Nginx代理时会导致问题。修复由Luke Weber提供。
当< span class="docutils literal">supervisord在启动过程中成功降低权限时,现在将在< span class="docutils literal">INFO级别记录,而不是< span class="docutils literal">CRIT。
HTTP服务器现在返回一个指定UTF-8编码的Content-Type头。这可能会解决某些浏览器中的显示问题。修复由Katenkka提供。
3.3.3 (2017-07-24)
修复了CVE-2017-11610。发现了一个漏洞,即经过身份验证的客户可以发送恶意XML-RPC请求到< span class="docutils literal">supervisord,该请求将在服务器上运行任意shell命令。这些命令将以与< span class="docutils literal">supervisord相同的用户身份运行。根据< span class="docutils literal">supervisord的配置,这可能是由root用户。有关详细信息,请参阅https://github.com/Supervisor/supervisor/issues/964。
3.3.2 (2017-06-03)
修复了3.3.0中引入的bug,其中< span class="docutils literal">supervisorctl reload命令会使用< span class="docutils literal">kqueue轮询器时导致< span class="docutils literal">supervisord崩溃的错误< span class="docutils literal">OSError: [Errno 9] Bad file descriptor。修复由Jared Suttles提供。
修复了3.3.0中引入的bug,其中< span class="docutils literal">supervisord在Web界面使用后可能陷入轮询循环,导致CPU使用率很高。修复由Jared Suttles提供。
修复了如果在同一配置下运行了另一个< span class="docutils literal">supervisord实例,则尝试启动但由于另一个运行实例而失败的< span class="docutils literal">supervisord将删除正在运行的实例的pidfile的bug。修复由coldnight提供。
修复了< span class="docutils literal">supervisorctl fg吞并了大多数XML-RPC错误的bug。现在< span class="docutils literal">fg将打印故障并退出。
解析配置文件现在如果进程名或组名包含正斜杠字符(/),将因会破坏Web界面的URL而失败,并显示错误消息。
supervisorctl reload 现在如果给定参数将显示错误消息。由 Joel Krauska 修复。
supervisorctl 命令 avail、reread 和 version 现在如果给定参数将显示错误消息。
3.3.1 (2016-08-02)
修复了当系统时间在 supervisord 启动后回拨时,supervisord 响应HTTP请求(包括 supervisorctl 命令)可能会挂起的问题。
已经从 tests 目录中移除了名为 trackrefs 的Zope调试工具,这个工具已经多年未被使用。
3.3.0 (2016-05-14)
supervisord 现在将使用系统可用的 kqueue、poll 或 select 来监控其文件描述符,按此顺序。之前的版本仅使用 select,在运行大量子进程时(无论哪个数字导致文件描述符数量超过 select 使用的固定大小的文件描述符表,通常是 1024),将崩溃并显示错误 ValueError: filedescriptor out of range in select()。由 Igor Sobreira 修复。
已将 /etc/supervisor/supervisord.conf 添加到配置文件搜索路径。许多为 Debian 和 Ubuntu 打包的 Supervisor 的版本都包含一个修复程序,该修复程序添加了此路径。这种差异已在多个票据中报告,是混淆和升级困难的原因,因此已添加该路径。由 Kelvin Wong 修复。
在 [include] 部分中现在支持 host_node_name 展开模式。由 Paul Lockaby 修复。
通过 [include] 部分包含的文件现在将以 INFO 级别记录日志,而不是 WARN 级别。由 Daniel Hahler 修复。
3.2.4 (2017-07-24)
从 Supervisor 3.3.3 返回:修复 CVE-2017-11610。发现了一个漏洞,即经过身份验证的客户端可以向 supervisord 发送恶意 XML-RPC 请求,该请求将在服务器上运行任意shell命令。这些命令将以与 supervisord 相同的用户身份运行。根据 supervisord 的配置,这可能是 root 用户。有关详细信息,请参阅 https://github.com/Supervisor/supervisor/issues/964。
3.2.3 (2016-03-19)
如果收到带有无效正文数据的 XML-RPC 请求,现在将返回 400 Bad Request。在之前的版本中,返回 500 Internal Server Error。
3.2.2 (2016-03-04)
解析配置文件现在如果 inet_http_server 或 unix_http_server 部分包含 username= 但没有 password=,将失败并显示错误消息。在之前的版本中,supervisord 会以无效配置启动,但 HTTP 服务器将始终返回 500 Internal Server Error。感谢 Chris Ergatides 报告此问题。
3.2.1 (2016-02-06)
修复了服务器异常 OverflowError: int exceeds XML-RPC limits,该异常导致当系统时间远在未来时,supervisorctl status 无法使用。XML-RPC API 以 XML-RPC 整数形式返回时间戳,但时间戳将超过 XML-RPC 整数的最大值(2038年1月,“2038年问题”)。目前,超过最大整数值的时间戳将被限制在最大值,以避免异常并保持与现有 API 客户端的兼容性。在未来版本的 API 中,时间戳的返回类型将进行更改。
3.2.0 (2015-11-30)
通过 [include] 部分包含的文件现在按顺序读取。在以前的版本中,顺序是未定义的。这是由 Ionel Cristian Mărieș 修复的补丁。
当处理大量进程时,现在 supervisorctl start 和 supervisorctl stop 完成得更快。感谢 Chris McDonough 提供了这个补丁。见:https://github.com/Supervisor/supervisor/issues/131
现在为所有配置文件选项展开环境变量。这是 Dexter Tad-y 修复的补丁。
向 supervisor RPC 接口添加了 signalProcess、signalProcessGroup 和 signalAllProcesses XML-RPC 方法。感谢 Casey Callendrello、Marc Abramowitz 和 Moriyoshi Koizumi 提供的补丁。
向 supervisorctl 添加了 signal 命令。感谢 Moriyoshi Koizumi 和 Marc Abramowitz 提供的补丁。
现在在配置文件中值错误引起的错误将显示配置部分,以便更容易调试。这是由 Marc Abramowitz 修复的补丁。
现在禁止在 [eventlistener:x] 部分设置 redirect_stderr=true,因为写入 stderr 的任何消息都会干扰 stdout 上的 eventlistener 协议。
修复了一个错误,该错误在设置日志记录时可能导致 supervisord 崩溃,如果发生 IOError,则可能发生这种情况,例如如果日志文件名意外地设置为目录而不是文件。感谢 Grzegorz Nosek 报告此问题。
修复了在 3.1.0 版本中引入的bug,其中 supervisord 在尝试显示资源限制错误时可能会崩溃。
修复了一个错误,该错误导致 supervisord 可能会崩溃并显示消息 Assertion failed for processname: RUNNING not in STARTING,如果时间更改导致进程的最后一次启动时间在未来。感谢 Róbert Nagy、Sergey Leschenko 和 samhair 提供的补丁。
如果 eventlistener 进入 UNKNOWN 状态,现在会记录警告,这通常表示 eventlistener 中的错误。感谢 Steve Winton 和 detailyang 报告导致此更改的问题。
现在在错误级别记录来自 Web 界面的错误。以前,它们在 TRACE 级别记录,并且很容易错过。感谢 Thomas Güttler 报告此问题。
修复了 setuptools >= 11.3 上的 DeprecationWarning: Parameters to load are deprecated. Call .resolve and .require separately.。
如果 redirect_stderr=true 和 stderr_logfile=auto,则不会创建 stderr 日志文件。在以前的版本中,将创建一个空的 stderr 日志文件。感谢 Łukasz Kożuchowski 提供初始补丁。
修复了 Medusa 中的一个问题,该问题会导致在并行运行多个 supervisorctl 命令时,supervisorctl tail -f 断开连接。这是由 Stefan Friesel 修复的补丁。
3.1.4 (2017-07-24)
从 Supervisor 3.3.3 返回:修复 CVE-2017-11610。发现了一个漏洞,即经过身份验证的客户端可以向 supervisord 发送恶意 XML-RPC 请求,该请求将在服务器上运行任意shell命令。这些命令将以与 supervisord 相同的用户身份运行。根据 supervisord 的配置,这可能是 root 用户。有关详细信息,请参阅 https://github.com/Supervisor/supervisor/issues/964。
3.1.3 (2014-10-28)
修复了一个 XML-RPC 错误,其中基于 ElementTree 的解析器处理了类似于 <value><string>hello</string></value> 的字符串,但不能处理类似于 <value>hello</value> 的字符串,这些字符串在 XML-RPC 规范中是有效的。这修复了与 Java 的 Apache XML-RPC 客户端以及其他客户端的兼容性。
3.1.2 (2014-09-07)
修复了在 supervisorctl 中的 tail group:* 出现的错误,不会显示 500 内部服务器错误,而是显示 BAD_NAME 错误。
修复了网页界面显示 500 内部服务器错误而不是某些进程启动错误的错误信息的问题。
移除了 Supervisor 不使用的 medusa 文件。
3.1.1 (2014-08-11)
修复了在 tailing 时发生日志轮换导致 supervisorctl tail -f name 输出停止的漏洞。
在启动多个程序时,防止尝试打开比环境允许的更多的文件描述符导致的崩溃。现在,将记录一个 spawn 错误。
正确计算“通道延迟”,修复了当进程(或许多进程)向其 stdout 或 stderr 写入时,supervisorctl start 命令会长时间挂起的问题。请参阅 https://github.com/Supervisor/supervisor/pull/263 上的注释。
将 docs/conf.py、docs/Makefile 和 supervisor/scripts/*.py 添加到发布包中。
3.1.0 (2014-07-29)
现在 supervisorctl 中的 start、stop、restart 和 clear 命令的输出已更改为与 status 命令一致。以前,status 命令会显示类似于 foo:foo_01 的进程,但启动该进程将显示 foo_01: started(注意缺少组前缀 foo:)。现在,启动进程将显示 foo:foo_01: started。由 Chris Wood 建议。
现在 supervisorctl 中的 status 命令支持组名语法:status group:*。
现在,supervisorctl 中 status 命令输出的进程列会扩展以适应最宽的名称。
现在,supervisorctl 中的 update 命令接受可选的组名。当指定组名时,只有那些组将被更新。由 Gary M. Josack 补丁。
现在在 supervisorctl 中改进了 Tab 补全,并且现在适用于更多情况。感谢 Mathieu Longtin 和 Marc Abramowitz 提供的补丁。
现在,在 supervisorctl 中使用 group:* 语法尝试启动或停止进程组时,如果名称不存在,将显示与 process 语法相同的错误消息。以前,它会显示一个 Python 异常。由 George Ang 补丁。
添加了新的 PROCESS_GROUP_ADDED 和 PROCESS_GROUP_REMOVED 事件。当使用 supervisorctl 中的 add 和 remove 命令在 Supervisor 的运行时配置中添加或删除进程组时,会触发这些事件。由 Brent Tubbs 补丁。
现在,在回退状态下停止进程将将其更改为停止状态。以前,尝试在回退状态下停止进程将被忽略。由 Pascal Varet 补丁。
现在为同质进程组中的每个进程单独展开 directory 选项。这使得每个进程都可以有自己的工作目录。由 Perttu Ranta-aho 补丁。
从 setup.py 中的 requires 列表中删除了 setuptools,因为它导致某些系统上的安装问题。
修复了Medusa中的一个bug,即如果密码中包含冒号,HTTP Basic认证器会导致异常。感谢Thomas Güttler报告此问题。
修复了一个XML-RPC的bug,当使用类似于group:*的名称调用supervisor.clearProcessLogs()时,会导致500内部服务器错误,而不是返回BAD_NAME错误。
修复了在supervisord中可能出现的挂起问题,如果在使用日志轮转时外部程序删除了活动日志文件。由Magnus Lycka提供的补丁。
现在如果在[include]部分中,glob模式不匹配任何文件,将会记录一条警告信息。由Daniel Hahler提供的补丁。
3.0.1 (2017-07-24)
从 Supervisor 3.3.3 返回:修复 CVE-2017-11610。发现了一个漏洞,即经过身份验证的客户端可以向 supervisord 发送恶意 XML-RPC 请求,该请求将在服务器上运行任意shell命令。这些命令将以与 supervisord 相同的用户身份运行。根据 supervisord 的配置,这可能是 root 用户。有关详细信息,请参阅 https://github.com/Supervisor/supervisor/issues/964。
3.0 (2013-07-30)
如果进程或组名包含与事件监听器协议不兼容的字符,解析配置文件现在将失败并显示错误信息。
修复了在supervisorctl中的tail -f命令失败的问题,如果用户名和密码的长度总和超过56个字符。
现在读取配置文件时,如果配置文件存在但不能读取,将会给出一个单独的错误信息。之前,读取文件时发生的任何错误都会报告为“找不到配置文件”。由Jens Rantil提供的补丁。
修复了使用基于ElementTree的XML解析器时,XML-RPC中第一个元素之后的数组元素会被忽略的bug。由Zev Benjamin提供的补丁。
修复了supervisorctl输出的用法信息,以显示正确的默认配置文件路径。由Alek Storm提供的补丁。
3.0b2(2013-05-28)
程序选项user的行为已更改。在所有之前的版本中,如果supervisord无法切换到用户,则会将警告发送到stderr日志,但仍然会启动子进程。这意味着配置文件中的错误可能导致意外以root身份启动子进程。现在,supervisord只有在成功切换到用户的情况下才会启动子进程。感谢Igor Partola报告此问题。
如果配置文件中指定的用户在系统上不存在,supervisord现在将打印错误信息并拒绝启动。
撤销了3.0b1中引入的对日志记录的更改,该更改旨在允许多个进程使用旋转日志处理器将日志记录到同一文件。该实现导致supervisord在重新加载期间崩溃并泄漏文件句柄。此外,由于日志轮转选项是按程序设置的,因此可能会创建不可能的配置(同一文件的冲突轮转选项)。考虑到这些因素以及supervisord现在具有syslog支持,决定删除此功能。文档中添加了警告,说明两个进程可能无法将日志记录到同一文件。
修复了解析command=时可能导致supervisord崩溃的bug,例如,shlex.split()失败时的错误引用。由Scott Wilson提供的补丁。
现在可以在没有supervisord.conf文件的机器上使用supervisorctl,只需在命令行选项中提供连接信息即可。由Jens Rantil提供的补丁。
修复了如果使用syslog处理器并且supervisord收到SIGUSR2(日志重新打开请求)时,supervisord会崩溃的bug。
修复了XML-RPC的bug,当使用错误的名称调用supervisor.getProcessInfo()时,会导致500内部服务器错误,而不是返回BAD_NAME错误。
为Web界面添加了favicon。由Caio Ariede提供的补丁。
修复了由于在childutils测试中错误处理夏令时而导致的测试失败问题。由Ildar Hizbulin提供的补丁。
修复了关于未使用变量、导入和死代码的多个pyflakes警告。由Philippe Ombredanne提供的补丁。
3.0b1(2012-09-10)
修复了解析environment=时未验证键/值对是否正确分隔的bug。由Martijn Pieters提供的补丁。
修复了HTTP服务器代码中的一个bug,该bug可能会导致发送大响应时出现不必要的延迟。由Philip Zeyliger提供的补丁。
当supervisord以root身份启动时,如果没有提供
-c
标志,现在将在控制台发出警告。原因:supervisord会在当前工作目录中查找supervisord.conf
文件;有人可能会诱使root用户在cd到包含恶意supervisord.conf
的目录时启动supervisord。在文档中添加了关于在没有
-c
标志的情况下启动supervisord的安全影响的警告。添加了一个布尔程序选项
stopasgroup
,默认为false。当为true时,该标志会导致supervisor向整个进程组发送停止信号。这对于像Flask调试模式这样的程序很有用,这些程序不会将停止信号传播给它们的子进程,导致它们成为孤儿。Python 2.3不再受支持。支持Python 2.3的最后一个版本是Supervisor 3.0a12。
从setup.py中删除了未使用的“supervisor_rpc”入口点。
修复了旋转日志处理器中的一个bug,该bug会导致两个进程都设置将日志记录到同一文件时出现意外结果。由Whit Morriss提供的补丁。
修复了配置文件重新加载中的bug,每次重新加载都可能泄漏内存,因为警告消息列表会被追加但永远不会清除。由Philip Zeyliger提供的补丁。
添加了一个新的Syslog日志处理器。感谢Denis Bilenko、Nathan L. Smith和Jason R. Coombs,他们各自为补丁做出了贡献。
将所有变更历史放入单个文件(CHANGES.txt)。
3.0a12(2011-12-06)
发布以替换一个损坏的3.0a11包,其中未包含非Python文件。
3.0a11(2011-12-06)
添加了一个新的文件
PLUGINS.rst
,其中列出了Supervisor的第三方插件。由Jens Rantil提供。supervisorctl中的
pid
命令现在可以用来检索子进程的PID。参见help pid
。由Gregory Wisniewski提供的补丁。添加了一个新的
host_node_name
扩展,它将扩展到Python的platform.node
返回的值(参见https://docs.pythonlang.cn/library/platform.html#platform.node)。由Joseph Kondel提供的补丁。修复了Web界面中的bug,其中超过64K的页面会被截断。感谢Drew Perttula和Timothy Jones报告此问题。
将
README.txt
重命名为README.rst
,以便GitHub将该文件渲染为ReStructuredText。XML-RPC服务器现在与不发送空
<params>
(当方法调用没有参数时)的客户端兼容。感谢Johannes Becker报告此问题。修复了
supervisorctl --help
输出以显示正确的程序名称。配置选项
minfds
和minprocs
的行为已更改。以前,如果硬限制小于minfds
或minprocs
,supervisord会无条件地以错误终止。现在,supervisord将尝试提高硬限制。如果supervisord以root身份运行,这可能成功,否则将像以前一样打印错误。由Benoit Sigoure提供的补丁。添加了一个布尔程序选项
killasgroup
,默认为false。如果为true,当需要发送SIGKILL来停止/终止进程时,将其发送到整个进程组,而不是只发送给进程本身,以处理可能的后代,并防止它们成为孤儿。由Samuele Pedroni提供的补丁。现在可以在支持字符串扩展的配置文件选项中使用环境变量。由Aleksey Sivokon提供的补丁。
修复了 supervisord 在收到信号时可能不会采取行动的竞态条件。感谢 Adar Dembo 报告此问题和提供初始补丁。
更新了 echo_supervisord_conf 的输出,修复了拼写错误并改进了注释。感谢 Jens Rantil 发现这些问题。
修复了来自 Web 界面的可能 500 服务器错误。这在使用 Supervisor 在 Nginx 后面的域名套接字时观察到,此时 Supervisor 会抛出异常,因为 REMOTE_ADDR 未设置。由 David Bennett 提供补丁。
3.0a10 (2011-03-30)
修复了 Web 界面的样式表,使页脚行不会与长进程列表重叠。感谢 Derek DeVries 提供补丁。
允许 rpc 界面插件注册新的事件类型。
修复了在从 supervisorctl 发出 reload 命令时 FCGI 套接字无法清理的问题。此外,FCGI 套接字的默认行为已更改。现在,当组中运行的进程数达到零时,它们将被关闭。之前,除非发出组级停止命令,否则套接字将保持打开。
当 HTTP 服务器无法将主机名反向解析为 IP 地址时,提供了更好的错误信息。以前的行为:显示套接字错误。当前行为:将建议输出到 stdout。
通过 [supervisord] 部分的 environment= 值设置的环境变量没有效果。感谢 Wyatt Baldwin 提供补丁。
修复了停止进程会导致在停止请求发出后发生的进程输出丢失的 bug。请参阅 https://github.com/Supervisor/supervisor/issues/11。
将 2.X 变更日志条目移动到 HISTORY.txt。
将 CHANGES.txt 和 README.txt 转换为正确的 ReStructuredText,并将它们包含在 setup.py 中的 long_description 中。
向包中添加了 tox.ini(在包目录中通过 tox 运行)。在多个 Python 版本上测试 Supervisor。
3.0a9 (2010-08-13)
使用丰富的比较方法而不是 __cmp__ 来排序进程配置和进程组配置,以更好地跨越 Python 版本。(感谢 Jonathan Riboux 发现问题并提供初始补丁)
修复了 Python 2.7 的 test_supervisorctl.test_maintail_dashf 测试。(感谢 Jonathan Riboux 发现问题并提供初始补丁)
修复了 supervisor.datatypes.url 计算与 Python 2.7 和 Python >= 2.6.5 兼容的“良好”URL的方式。现在,带有虚假“schemes://”的 URL 将作为跨版本妥协被接受(之前在 Supervisor 启动之前会被拒绝)。感谢 Jonathan Riboux 发现问题并提供初始补丁)。
向 supervisord 添加了 -v / --version 选项:将 supervisord 版本号打印到 stdout 并退出。(Roger Hoover)
当可用时从 xml.etree 导入 iterparse(例如:Python 2.6)。由 Sidnei da Silva 提供补丁。
修复了 supervisor-users 邮件列表的链接。由 Sidnei da Silva 提供补丁。
当解析配置文件中的“environment=”时,3.0a8 中引入的更改防止了 Supervisor 解析路径中常见的某些字符,除非使用引号,如下例所示
environment=HOME='/home/auser'
Supervisor 再次允许以上行以以下方式编写
environment=HOME=/home/auser
数字和字母字符、“_”、“/”、“.”、“+”、“-”、“(”、“)”和“:”都可以用作值,而无需引号。如果需要其他字符作为值,请像上面的第一个例子一样对其进行引号处理。感谢 Paul Heideman 报告此问题。
现在,管理器将在可执行文件路径的相关位置查找其配置文件,使其在虚拟环境中更容易使用。如果sys.argv[0]是/path/to/venv/bin/supervisorctl,则管理器现在将在/path/to/venv/etc/supervisord.conf和/path/to/venv/supervisord.conf中查找配置文件,以及其他标准位置。此补丁由Chris Rossi提供。
3.0a8 (2010-01-20)
在第一次调用supervisord时不要清理文件描述符:这是针对使用libdispatch的Snow Leopard系统的一个拙劣的解决方案,这些系统在supervisord启动时收到“非法指令”消息。通过“supervisorctl restart”重新启动supervisord在这些系统上仍然可能导致崩溃。
在各种文件中移除了Medusa hashbang头,以简化RPM打包。
允许umask为000(由Rowan Nairn提供的补丁)。
修复了在3.0a7中引入的bug,其中supervisorctl不会从受密码保护的supervisord中请求用户名/密码组合,如果它没有被填入“[supervisorctl]”部分的用户名/密码值。现在它将正确请求用户名和密码。
修复了在3.0a7中引入的bug,其中setup.py无法正确检测Python版本。此补丁由Daniele Paolella提供。
修复了在3.0a7中引入的bug,其中解析键/值对字符串失败,因为使用了Python 2.4中引入的正则表达式语法,而在Python 2.3上。
移除了用于memmon控制台脚本的测试套件,该脚本在3.0a7中移动到Superlance包。
将发布日期添加到CHANGES.txt。
重新加载fcgi进程组的配置时不会关闭fcgi套接字 - 现在,当组作为一个单元停止时(包括配置更新期间),套接字将被关闭。然而,如果您单独停止组中的所有进程,套接字将保持打开状态,以允许FCGI守护进程优雅地重启。(Roger Hoover)
重新读取配置时没有检测到fcgi-program部分中套接字参数的变化。(Roger Hoover)
当无法创建FCGI套接字时,制作了一个更友好的异常消息。(Roger Hoover)
修复了一个bug,其中supervisorctl的–serverurl选项不会接受“unix”方案中的URL。(Jason Kirtland)
运行测试现在需要“mock”包。此依赖关系已添加到setup.py中的“tests_require”。(Roger Hoover)
添加了对设置FCGI套接字所有权和权限的支持。这是通过[fcgi-program:x]部分中的新“socket_owner”和“socket_mode”选项完成的。有关详细信息,请参阅手册。(Roger Hoover)
修复了在spawn错误时FCGI套接字引用计数不会递减的bug。(Roger Hoover)
修复了使用“sha”模块的Python 2.6弃用警告。
将ez_setup.py更新为支持setuptools 0.6c11的版本。
当“supervisorctl shutdown”无法连接到预期套接字上的supervisord时,不再转储Python回溯。感谢Benjamin Smith报告此问题。
移除了我们捆绑的asynchat版本中的collections.deque的使用,因为它破坏了与Python 2.3的兼容性。
“echo_supervisord_conf”输出的示例配置现在正确显示了“autorestart”的默认值为“unexpected”。感谢William Dode指出它显示了错误的值。
3.0a7 (2009-05-24)
我们现在捆绑了由Jason Kirtland提供的修正版Medusa,以使Supervisor能够在Python 2.6上运行。这样做是因为Python 2.6在stdlib中引入了对asyncore和asynchat的向后不兼容更改。
在Supervisor 3.0a4中引入的控制台脚本memmon已移动到Superlance(http://pypi.python.org/pypi/superlance)。Superlance包包含其他有用的监控工具,旨在在Supervisor下运行。
Supervisorctl 现在可以正确解释启动进程时可能返回的所有错误代码。由 Francesc Alted 提交的补丁。
已向 [program:x]、[fcgi-program:x] 和 [eventlistener:x] 部分添加了新的配置选项 stdout_events_enabled 和 stderr_events_enabled。这些选项可以启用程序的新 PROCESS_LOG 事件。如果未指定,则默认为 False。
如果为子进程启用了此功能,并且在 PROCESS_COMMUNICATION 使用的特殊捕获模式之外从子进程的 stdout 或 stderr 接收到数据时,将发出一个事件。
事件监听器可以单独订阅 PROCESS_LOG_STDOUT 或 PROCESS_LOG_STDERR,或同时订阅 PROCESS_LOG。
现在,在 supervisord.conf 中使用 environment= 指定的子进程环境变量的值可以可选地加引号,允许它们包含逗号。由 Tim Godfrey 提交的补丁。
添加了一个新的事件类型 REMOTE_COMMUNICATION,它由新的 RPC 方法 supervisor.sendRemoteCommEvent() 发出。
David E. Kindred 提交的补丁修复了 bug #268(在 stdout/stderr_logfile 的 here 扩展中 KeyError)。
根据 Anders Quist 的 online_config_reload.diff 补丁添加了 reread、update 和 avail 命令。此补丁扩展了“add”和“drop”命令的自动行为。
In supervisorctl: supervisor> status bar RUNNING pid 14864, uptime 18:03:42 baz RUNNING pid 23260, uptime 0:10:16 foo RUNNING pid 14866, uptime 18:03:42 gazonk RUNNING pid 23261, uptime 0:10:16 supervisor> avail bar in use auto 999:999 baz in use auto 999:999 foo in use auto 999:999 gazonk in use auto 999:999 quux avail auto 999:999 Now we add this to our conf: [group:zegroup] programs=baz,gazonk Then we reread conf: supervisor> reread baz: disappeared gazonk: disappeared quux: available zegroup: available supervisor> avail bar in use auto 999:999 foo in use auto 999:999 quux avail auto 999:999 zegroup:baz avail auto 999:999 zegroup:gazonk avail auto 999:999 supervisor> status bar RUNNING pid 14864, uptime 18:04:18 baz RUNNING pid 23260, uptime 0:10:52 foo RUNNING pid 14866, uptime 18:04:18 gazonk RUNNING pid 23261, uptime 0:10:52 The magic make-it-so command: supervisor> update baz: stopped baz: removed process group gazonk: stopped gazonk: removed process group zegroup: added process group quux: added process group supervisor> status bar RUNNING pid 14864, uptime 18:04:43 foo RUNNING pid 14866, uptime 18:04:43 quux RUNNING pid 23561, uptime 0:00:02 zegroup:baz RUNNING pid 23559, uptime 0:00:02 zegroup:gazonk RUNNING pid 23560, uptime 0:00:02 supervisor> avail bar in use auto 999:999 foo in use auto 999:999 quux in use auto 999:999 zegroup:baz in use auto 999:999 zegroup:gazonk in use auto 999:999
修复了当使用包含文档中记录的 `process_name` Python 字符串扩展的日志文件名时,出现“KeyError: ‘process_name’”症状的 bug。
作为 GSoC 的一部分实现了 supervisorctl shell 的自动完成功能和 Supervisor 的前台模式。现在 supervisorctl 程序具有 fg 命令,这使得向进程提供输入,并实时查看其输出/错误流成为可能。
Anders Quist 实现了进程配置重新加载。现在 supervisorctl 程序有“add”和“drop”命令。使用“add <programname>”向配置文件中添加由 <programname> 暗示的进程组。“drop <programname>”从运行配置中删除进程组(它必须已经停止)。这使得在不重启 supervisord 进程的情况下向运行中的 supervisord 添加和删除进程成为可能。
修复了一个 bug,即打开 HTTP 服务器时,对于除 errno.EADDRINUSE 以外的套接字错误会静默失败。
感谢 Dave Peticolas,使用“reload”针对在后台运行的 supervisord 不会再导致 supervisord 崩溃。
日志文件的配置选项现在接受混合大小写的保留词(例如,“AUTO”或“auto”),以与其他选项保持一致。
childutils.eventdata 存在 bug,它无法处理数据中的回车符。参见 http://www.plope.com/software/collector/257。感谢 Ian Bicking。
每个进程的 exitcodes= 配置现在将不接受不是 8 位无符号整数的退出代码(如果其中一个退出代码不在 0-255 范围内,则 supervisord 不会启动)。
每个进程的 directory 值现在可以包含可展开的值,如 %(here)s。(参见 http://www.plope.com/software/collector/262)。
接受 Roger Hoover 提交的补丁,允许一种新的进程组:“fcgi-program”。将其中一个添加到 supervisord.conf 中,可以控制 fastcgi 程序。FastCGI 程序不能属于异构组。
FastCGI 程序的配置与常规程序相同,但有一个额外的“socket”参数。替换发生在使用 here 和 program_name 变量的 socket 参数上。
[fcgi-program:fcgi_test] ;socket=tcp://localhost:8002 socket=unix:///path/to/fcgi/socket
Supervisorctl 现在支持 supervisorctl 命令的插件模型。
增加了通过XML-RPC接口的supervisor.getPID()或supervisorctl的新“pid”命令获取supervisord自身pid的功能。
3.0a6 (2008-04-07)
RotatingFileLogger的doRollover方法中存在竞争条件,可能导致尽管在上一个调用os.path.exists的地方尝试删除它,但文件实际上可能不存在。我们现在捕获异常并忽略丢失的文件。
3.0a5 (2008-03-13)
supervisorctl现在支持持久的readline历史记录。要启用,请在您的supervisord.conf文件中的[supervisorctl]部分添加“history_file = <pathname>”。
现在可以在一个supervisorctl命令行上发出多个命令,例如“restart prog; tail -f prog”。用单个分号分隔命令;它们将按顺序执行,正如您期望的那样。
3.0a4 (2008-01-30)
3.0a3破坏了Python 2.3的向后兼容性。
在Debian Sarge上,一位用户报告说,在supervisord启动时,调用options.mktempfile会失败,出现“[Errno 9] Bad file descriptor”。我无法重现此问题,但我们找到了一个似乎对他有效的解决方案,并将其包含在本发行版中。有关更多信息,请参阅http://www.plope.com/software/collector/252。感谢William Dode。
已删除错误< span class="docutils literal">ALREADY_TERMINATED。它仅由supervisor.sendProcessStdin()引发。现在该方法返回< span class="docutils literal">NOT_RUNNING,与其他方法保持一致。(Mike Naberezny)
已删除错误TIMED_OUT。它没有被使用。
Supervisor现在依赖于meld3 0.6.4,它默认不编译其C扩展,因此如果您系统上没有C编译器或Python开发库,在安装期间就不再需要处理NO_MELD3_EXTENSION_MODULES了。
不再为sample.conf文件创建root用户,而是提供一个便利命令“echo_supervisord_conf”,他可以使用它将sample.conf输出到他的终端(并适当地重定向到文件)。这是一个新的用户便利功能(特别是对于那些没有Python经验的用户)。
为[program:x]和[eventlistener:x]部分添加了numprocs_start配置选项。这是一个用于计算numprocs开始启动的第一个整数的偏移量。由Antonio Beamud Montero贡献。
在配置格式中添加了对[include]配置部分的支持。此部分必须包含一个名为“files”的单个键,它必须命名一个空格分隔的文件glob列表,该列表将被包含在supervisor的配置中。由Ian Bicking贡献。
调用reload supervisorctl命令可能会触发supervisord中的错误,导致其崩溃。请参阅http://www.plope.com/software/collector/253。感谢William Dode提供错误报告。
将pidproxy脚本制作成控制台脚本。
现在可以在[inet_http_server]和[unix_http_server]部分可选地指定密码值,而不是明文。以{SHA}前缀值将被视为SHA十六进制摘要。要使用Python加密密码以适合粘贴到配置文件中,例如。
>>> import sha >>> '{SHA}' + sha.new('thepassword').hexdigest() '{SHA}82ab876d1387bfafe46cc1c8a2ef074eae50cb1d'
已删除事件的子类型PROCESS_STATE_CHANGE(以及PROCESS_STATE_CHANGE本身),并用一组简单的可订阅事件类型PROCESS_STATE替换。
新的事件类型是
PROCESS_STATE_STOPPED PROCESS_STATE_EXITED PROCESS_STATE_STARTING PROCESS_STATE_STOPPING PROCESS_STATE_BACKOFF PROCESS_STATE_FATAL PROCESS_STATE_RUNNING PROCESS_STATE_UNKNOWN PROCESS_STATE # 抽象
PROCESS_STATE_STARTING取代
PROCESS_STATE_CHANGE_STARTING_FROM_STOPPED PROCESS_STATE_CHANGE_STARTING_FROM_BACKOFF PROCESS_STATE_CHANGE_STARTING_FROM_EXITED PROCESS_STATE_CHANGE_STARTING_FROM_FATAL
PROCESS_STATE_RUNNING取代PROCESS_STATE_CHANGE_RUNNING_FROM_STARTED
PROCESS_STATE_BACKOFF取代PROCESS_STATE_CHANGE_BACKOFF_FROM_STARTING
PROCESS_STATE_STOPPING取代
PROCESS_STATE_CHANGE_STOPPING_FROM_RUNNING PROCESS_STATE_CHANGE_STOPPING_FROM_STARTING
PROCESS_STATE_EXITED取代PROCESS_STATE_CHANGE_EXITED_FROM_RUNNING
PROCESS_STATE_STOPPED 替换了 PROCESS_STATE_CHANGE_STOPPED_FROM_STOPPING
PROCESS_STATE_FATAL 替换了 PROCESS_STATE_CHANGE_FATAL_FROM_BACKOFF
PROCESS_STATE_UNKNOWN 替换了 PROCESS_STATE_CHANGE_TO_UNKNOWN
PROCESS_STATE 替换了 PROCESS_STATE_CHANGE
抽象事件 PROCESS_STATE_CHANGE_EXITED_OR_STOPPED 已消失。
所有进程状态变化在其序列化中至少包含“processname”、“groupname”和“from_state”(前一个状态的名字)。
PROCESS_STATE_EXITED 在其序列化中额外包含“expected”(1或0)和“pid”(进程ID)。
PROCESS_STATE_RUNNING、PROCESS_STATE_STOPPING、PROCESS_STATE_STOPPED 在其序列化中额外包含“pid”。
PROCESS_STATE_STARTING 和 PROCESS_STATE_BACKOFF 在其序列化中包含“tries”(初始值为“0”,每次启动重试时加1)。
从 README.txt 中删除文档,指导人们查看 http://supervisord.org/manual/ 。
事件监听器请求/响应协议已更改。OK/FAIL 必须现在被包裹在 RESULT 封装中,这样我们就可以用它进行更专门的通信。
以前,为了表示成功,事件监听器会将字符串 OK\n 写入其标准输出。为了表示事件已被看到,但无法被监听器处理,应将其重新缓冲,事件监听器会将字符串 FAIL\n 写入其标准输出。
在新协议中,监听器必须写入字符串
RESULT {resultlen}\n{result}
例如,为了表示 OK
RESULT 2\nOK
为了表示 FAIL
RESULT 4\nFAIL
请参阅 scripts/sample_eventlistener.py 脚本以获取示例。
为了提供从事件处理器(见上文)返回的自定义结果的钩子点,现在 [eventlistener:x] 配置部分接受一个“result_handler=”参数,例如“result_handler=supervisor.dispatchers:default_handler”(默认值)或“handler=mypackage:myhandler”。键是 pkgutil “入口点”规范(可导入的 Python 函数名称)。结果处理器必须是可调用的,它接受两个参数:一个名为“event”的参数表示事件,另一个名为“result”的参数表示监听器的结果。结果处理器要么成功执行,要么引发异常。如果它引发了 supervisor.dispatchers.RejectEvent 异常,则事件将被重新缓冲,事件处理器将被放回 ACKNOWLEDGED 状态。如果它引发了任何其他异常,事件处理器将被放置在 UNKNOWN 状态。如果没有引发任何异常,则认为事件已成功处理。结果处理器的返回值被忽略。编写结果处理器是一种“紧急情况下的破玻璃”类型的事情,它不是用于任意业务代码的东西。特别是,处理器 不得阻塞 任何可感知的时间。
标准事件监听器结果处理器(supervisor.dispatchers:default_handler)在收到“OK”时不会做任何事情,如果它收到任何其他值,将引发 supervisor.dispatchers.RejectEvent 异常。
Supervisord 现在发出 TICK 事件,每隔 N 秒发生一次。有三种类型的 TICK 事件可用:TICK_5(每五秒一次)、TICK_60(每分钟一次)、TICK_3600(每小时一次)。事件监听器可以订阅这些类型之一的事件,以执行偶尔的处理。TICK 事件是 EVENT 类型的子类型。
删除与 OSX 平台特定的内存监视器,并用 memmon.py 替换,该脚本在 Linux 和 Mac OS 上都可以工作。此脚本现在是名为“memmon”的命令行脚本。
允许“web 处理器”(接收浏览器访问 supervisor 网络用户界面的 http 请求的处理程序)处理 POST 请求。
RPC 接口方法 stopProcess()、stopProcessGroup() 和 stopAllProcesses() 现在可以接受一个可选的“wait”参数,默认值为 True,与启动方法保持一致。
3.0a3 (2007-10-02)
当主 supervisor XML-RPC 命名空间未注册时,Supervisorctl 现在报告了更好的错误消息。感谢 Mike Orr 报告此问题。(Mike Naberezny)
在supervisor包中创建一个名为scripts的目录,将pidproxy.py文件移动到该目录,并在该目录中放置示例事件监听器和通信事件程序。
当一个事件通知被缓冲(无论是由于监听器拒绝了它,还是因为我们最初尝试发送它时所有监听器都很忙),我们现在以一种使其比以前更早重试的方式重新缓冲它。
当一个监听器进程在从BUSY状态转换之前意外退出时,重新缓冲正在处理的事件。
supervisorctl tail命令现在接受一个后缀指定符:stderr或stdout,分别允许用户跟踪指定进程的stderr或stdout。如果没有提供此指定符,tail默认为stdout。
supervisor clear命令现在清除指定进程的stderr和stdout日志。
当进程由于execve失败或无法设置uid到一个特定的uid而遇到spawn错误时,现在它将此信息放入进程的stderr日志中,而不是stdout日志中。
事件监听器协议头部现在包含server标识符、事件发出的pool以及poolserial,以及它之前包含的值(版本、事件名称、序列号和长度)。服务器标识符来自配置文件选项值identifier,pool值是事件发出的监听器池的名称,而poolserial是分配给在该池中处理事件的事件的序列号。
事件监听器协议头部现在是一系列键值对,而不是位置值的列表。以前,一个代表性的头部看起来像
SUPERVISOR3.0 PROCESS_COMMUNICATION_STDOUT 30 22\n
现在它看起来像
ver:3.0 server:supervisor serial:21 ...
特定事件负载序列化已更改。现在,所有涉及进程的事件类型都包括描述事件的进程的pid。在事件序列化“header”值中,我们移除了头部名称和值之间的空格,并且现在使用空格而不是换行符来分隔头部。所有事件类型的键的名称都已移除下划线。
为了速度和整洁性,放弃使用Python stdlib logging模块,我们已自己实现。
修复使用AUTO日志且进程的最大字节数为零时的启动崩溃问题。
改进进程通信事件性能。
进程配置参数stdout_capturefile和stderr_capturefile不再有效。它们已被替换为stdout_capture_maxbytes和stderr_capture_maxbytes参数,它们旨在是后缀乘以整数。它们都默认为零。当它们为零时,不执行进程通信事件捕获。当任一非零时,该值表示在进程事件开始和结束标签之间将捕获的最大字节数。此更改是为了支持我们不再将捕获数据保存在单独的文件中,我们只是使用RAM中的FIFO来维护捕获信息。对于不关心进程通信事件或尚未更改stdout_capturefile或stderr_capturefile默认值的用户,他们不需要对他们的配置进行任何更改来处理此更改。
日志消息级别已规范化。特别是,现在进程stdin/stdout在debug级别而不是在trace级别进行日志记录(trace级别现在保留用于通常用于调试supervisor的输出)。有关更多信息,请参阅文档中的“Supervisor日志级别”。
当一个事件需要重新缓冲(因为所有监听器都在忙碌或者某个监听器拒绝了该事件)时,现在重新缓冲的事件将被插入到监听器事件队列的头部。这并不保证事件的自然顺序发射,因为如果监听器在处理事件时拒绝事件或者崩溃,重新缓冲事件可能需要任意长的时间,而在此期间其他事件可能会被处理。但是,如果池中的监听器永远不会拒绝事件或者在处理事件时不会崩溃,这保证了事件将按照接收的顺序发射,因为如果所有监听器都在忙碌,重新缓冲的事件将在下一次尝试时“首先”被处理。
已移除 EVENT_BUFFER_OVERFLOW 事件类型。
supervisorctl xmlrpc 代理现在可以使用持久 HTTP 连接与 supervisord 通信。
新增了一个名为“supervisor.childutils”的模块。此模块为作为 supervisord 子进程的 Python 脚本提供了实用工具。最值得注意的是,它包含了一个 API 方法“getRPCInterface”,允许您获取一个愿意与父 supervisord 通信的 xmlrpclib ServerProxy。它还包含了一些实用函数,用于解析 supervisord 事件监听器协议头部。在脚本目录中增加了两个脚本(loop_eventgen.py 和 loop_listener.py),作为使用 childutils 模块的示例。
在子进程环境中新增了一个环境变量:SUPERVISOR_SERVER_URL。它包含运行子进程的 supervisord 的服务器 URL。
在 /ok.html 添加了一个 OK URL,它只返回字符串 OK(可用于通过纯 HTTP 的 up 检查或速度检查)。
supervisord 脚本接受了一个新的命令行选项 --profile_options,供开发者使用。
supervisord -n -c sample.conf --profile_options=cumulative,calls
这些是传递给标准 Python 分析器 PStats sort_stats 方法的 sort_stats 选项的值。
当退出 supervisor 时,它将 Python 分析器的输出打印到 stdout。
如果使用的 Python 中安装了 cElementTree,将使用一个替代的(大约快 2 倍) XML 解析器来解析 XML-RPC 请求体。cElementTree 作为 setup.py 中的“extras_require”选项被添加。
supervisorctl 添加了启动、停止和重启进程组的功能。要启动一个组,使用 start groupname:*。要启动多个组,使用 start groupname1:* groupname2:*。对于“停止”和“重启”,等效的命令也适用。您可以在任何这些命令的同一行上混合使用短进程名、完全指定的组:进程名和组名。
在进程配置中添加了 directory 选项。如果您设置此选项,supervisor 将在执行子程序之前 chdir 到此目录(因此它将是子程序的 cwd)。
在进程配置中添加了 umask 选项。如果您设置此选项,supervisor 将设置子程序的 umask。(感谢 Ian Bicking 提出此建议)。
在脚本目录中添加了两个脚本 osx_memmon_eventgen.py 和 osx_memmon_listener.py。如果按照其注释中的描述一起使用,则消耗“过多”内存的进程将被重启。该 eventgen 脚本仅在 OSX(我的主要开发平台)上工作,但它应该可以轻松地推广到其他操作系统。
supervisord 的长格式命令行选项 --configuration (-c) 存在问题。由 Mike Orr 报告。(Mike Naberezny)
新增了新的日志级别:BLAT(blather)。我们在其中记录所有与 supervisor 内部相关的调试信息。感谢 Mike Orr 提出此建议。
我们现在允许管理员同时监听UNIX域套接字和inet套接字,而不是让它们互斥。因此,“http_port”、“http_username”、“http_password”、“sockchmod”和“sockchown”这些选项不再属于[supervisord]节配置的一部分。这些已被两个其他部分所取代:[unix_http_server]和[inet_http_server]。您需要将其中一个(根据您是否想要分别监听UNIX域套接字或TCP套接字)或两者都插入到supervisord.conf文件中。这些部分有自己的选项(如果适用)用于端口、用户名、密码、chmod和chown。有关这些部分的更多信息,请参阅README.txt。
所有与“http_port”、“http_username”、“http_password”、“sockchmod”和“sockchown”相关的supervisord命令行选项都已删除(见上述点的原因)。
在[supervisord]节中曾经使用过的选项sockchown(现在在[unix_http_server]节中命名为chown)曾经接受点分隔的用户.group值。现在的分隔符必须是冒号“:”,例如“user:group”。Unix允许用户名中有点,所以这个更改是一个错误修复。感谢Ian Bicking提供的错误报告。
如果命令行中没有指定“-c”选项,supervisord和supervisorctl将分别在路径./supervisord.conf、./etc/supervisord.conf(相对于supervisord或supervisorctl被调用时的当前工作目录)或/etc/supervisord.conf(旧的默认路径)中搜索一个。这些路径按顺序搜索,supervisord和supervisorctl将使用找到的第一个。如果都没有找到,supervisor将无法启动。
Python字符串表达式%(here)s(指配置文件所在的目录)可以在配置文件中的以下部分/选项中使用
unix_http_server:file supervisor:directory supervisor:logfile supervisor:pidfile supervisor:childlogdir supervisor:environment program:environment program:stdout_logfile program:stderr_logfile program:process_name program:command
将--environment(也称为-b)选项从可用的命令行开关列表中删除了supervisord(请使用“A=1 B=2 bin/supervisord”代替)。
如果套接字文件名(unix:// URL的尾部)超过64个字符,supervisorctl在启动时将因编码错误而失败。
命令行参数identifier没有功能。
修复了http://www.plope.com/software/collector/215(当程序命令不在PATH上时,supervisorctl中的错误信息不正确)。
一些子进程在supervisor关闭时可能没有得到正确关闭。
转移到ZPL衍生(但不是ZPL)许可,可在http://www.repoze.org/LICENSE.txt获取;它比ZPL略微宽松(没有服务标记条款)。
在supervisord“重新加载”时间(使用supervisorctl的“重新加载”命令时)有关未关闭文件的错误(通常是“无效文件描述符”)明显。
我们不再捆绑ez_setup以引导setuptools安装。
3.0a2(2007-08-24)
修复了README.txt中定义配置文件中supervisor RPC接口的示例。感谢Drew Perttula。
修复了一个错误,其中如果有效负载数据非常短,进程通信事件将不会具有正确的有效负载。
当supervisord在“stopwaitsecs”使用“正常”的kill信号未能杀死进程后,试图使用SIGKILL杀死进程时,supervisord会因错误的AssertionError而崩溃。感谢Calvin Hendryx-Parker。
在Linux上,Supervisor会在子进程退出和supervisor被通知其退出状态之间消耗过多的CPU,进行有效的“忙等待”。感谢Drew Perttula。
RPC接口行为变更:如果调用“sendProcessStdin”RPC方法针对已关闭stdin文件描述符(例如,它执行了“sys.stdin.close(); os.close(0)”等价操作)的进程,我们将返回一个NO_FILE错误,而不是接受数据。
更改了进程配置中关于进程在RUNNING和EXITED状态之间转换的
autorestart
参数的语义。autorestart
之前是一个布尔值。现在它是三元值,接受false
、unexpected
或true
之一。如果是false
,进程将永远不会从EXITED状态自动重启。如果是unexpected
,如果进程以未在进程配置的exitcodes
列表中命名的退出代码退出,进入EXITED状态的进程将自动重启。如果是true
,进入EXITED状态的进程将无条件自动重启。默认值现在是unexpected
(之前是true
)。这个功能的重新添加是对3.0a1的更改日志中的行为变更注释的回归,该注释断言我们从不关心进程的退出状态来决定是否重启。在Python 2.3.3下,
setup.py develop
(以及假设的setup.py install
)会失败,因为setuptools试图从urllib2导入splituser
,但该模块不存在。如果您在调用这些命令的shell中设置环境变量“NO_MELD3_EXTENSION_MODULES=1”,则可以在没有C编译器的系统上使用
setup.py install
和setup.py develop
(版本meld3 > 0.6.1会尊重此环境变量,并在设置时不会尝试编译可选的C扩展)。测试套件会在Python版本≤2.3.3时失败,因为那些版本中的unittest.TestCase的“assertTrue”和“assertFalse”方法不存在。
为了使用setuptools的
console_scripts
入口点设置,不再使用supervisorctl
和supervisord
包装脚本。文档文件和示例配置文件被放置在生成的supervisor egg的
doc
目录中。现在要求使用不似乎从其C扩展中泄漏内存的meld3版本(0.6.3),以使用Web界面,因为这会导致相当明显的内存泄漏。
3.0a1(2007-08-16)
默认配置文件注释将进程配置中的
startsecs
值记录为默认为10秒,但实际上是1秒。感谢Christoph Zwerschke。在README.txt中记录子进程环境的行为。感谢Christoph Zwerschke。
新的“strip_ansi”配置文件选项试图从日志中删除ANSI转义序列,以生成更小/更易读的日志(由Mike Naberezny提交)。
为了清晰起见,将XML-RPC方法supervisor.getVersion()重命名为supervisor.getAPIVersion()。旧名称作为兼容性别名,但已弃用,将在未来的版本中删除(Mike Naberezny)。
改进了Web界面的样式(Mike Naberezny, Derek DeVries)
现在XML-RPC方法supervisor.startProcess()会检查文件是否存在且可执行(Mike Naberezny)。
在子进程的环境中设置了两个环境变量,“SUPERVISOR_PROCESS_NAME”和“SUPERVISOR_PROCESS_GROUP”,分别表示supervisor配置中的进程名称和组。
进程状态映射更改:进程现在可以直接从STARTING状态切换到STOPPING状态(作为停止请求的结果)。
行为变更:如果
autorestart
为true,即使进程以“预期”的退出代码退出,它也还会被重启。在supervisor的前一个版本中,这已经是正确的,没有人抱怨,所以我们现在将考虑这是“官方正确”的行为。现在Supervisor独立记录子进程的stdout和stderr。旧程序配置键“logfile”、“logfile_backups”和“logfile_maxbytes”被“stdout_logfile”、“stdout_logfile_backups”和“stdout_logfile_maxbytes”所替代。新增加的键包括“stderr_logfile”、“stderr_logfile_backups”和“stderr_logfile_maxbytes”。新增的“redirect_stderr”键用于将程序的stderr输出发送到其stdout通道。已删除的键包括“log_stderr”和“log_stdout”。
[program:x]配置文件部分现在表示“同质进程组”,而不是单个进程。部分中的“numprocs”键表示组中进程的数量。部分中的“process_name”键允许组成同质组中每个进程的名称。
现在存在一种新的配置文件部分[group:x],允许用户将异质进程组合成一个可以由客户端作为一个单元控制的进程组。
Supervisord现在在其正常操作的某些点上发出“事件”。这些事件包括Supervisor状态变更事件、进程状态变更事件和“进程通信事件”。
现在存在一种新的配置文件部分[eventlistener:x]。每个部分代表一个“事件监听池”,这是一种特殊类型的同质进程组。池中的每个进程都旨在通过其stdin接收Supervisor“事件”并执行一些通知(例如发送邮件、记录日志、发起HTTP请求等)。
Supervisord现在可以捕获子进程stdout/stderr输出中的特殊令牌之间的数据,并作为结果发出“进程通信事件”。
程序可以任意扩展Supervisor的XML-RPC接口。可以通过配置文件中的[rpcinterface:foo]声明添加额外的顶级命名空间XML-RPC接口。
已添加新的supervisor-命名空间XML-RPC方法:getAPIVersion(返回XML-RPC API版本,较旧的“getVersion”现在已弃用)、“startProcessGroup”(启动Supervisor进程组中的所有进程)、“stopProcessGroup”(停止Supervisor进程组中的所有进程)和“sendProcessStdin”(向进程的stdin文件描述符发送数据)。
之前仅接受进程名称作为“name”的supervisor-命名空间XML-RPC方法(startProcess、stopProcess、getProcessInfo、readProcessLog、tailProcessLog和clearProcessLog)现在接受可能包含进程名称和进程组名称的“name”,格式为groupname:procname。出于向后兼容性的目的,也将接受“简单”名称,但将在内部进行展开(例如,如果发送“foo”作为名称,它将展开为“foo:foo”,表示foo进程组中的foo进程)。
2.X版本的supervisorctl可以以降级的方式与supervisor 3.0服务器协同工作,但3.X版本的supervisorctl将根本无法与supervisor 2.X服务器协同工作。
2.2b1(2007-03-31)
单独的程序配置部分现在可以指定一个环境。
向supervisorctl添加了‘version’命令。这将返回远程supervisord进程使用的supervisor2包的版本。
2.1 (2007-03-17)
当supervisord被多次调用,并且其配置设置为使用UNIX域套接字作为HTTP服务器时,套接字文件会错误地被删除。这种症状是,随后的supervisorctl调用无法找到套接字文件,因此无法控制该进程(它及其所有子进程需要手动杀死)。
当子进程退出或以其他方式死亡时,正确关闭子进程文件描述符。这应该会减少在supervisor长时间运行时出现的“打开文件过多,无法启动foo”的消息。
在关机时,如果进程不能用“正常”信号结束,日志会接收到过多的“INFO: 等待x结束”消息,直到我们用SIGKILL结束进程。现在,SIGKILL之前每三秒最多发送一条消息。感谢Ian Bicking。
添加断言:我们绝对不希望尝试将None序列化到XML-RPC调用者。vgatto在收集器中报告的问题223表明,某种方式下,一个管理器XML-RPC方法返回None(这不应该发生),但我无法识别原因。也许断言会在再次发生时给我们更多的线索。
在Python 2.5下运行时,管理器会崩溃,因为Python 2.5中的xmlrpclib.Transport类以向后不兼容的方式更改。感谢Eric Westra提供的错误报告和修复。
现在在Python 2.5下测试通过。
改善了对具有FAILED状态的停止请求的supervisorctl报告。
移除了重复的代码(readLog/readMainLog),感谢Mike Naberezny。
向XML-RPC API添加了tailProcessLog命令。它提供了一个比readProcessLog()更有效的方法来跟踪日志。使用readProcessLog()读取块,使用tailProcessLog()跟踪。感谢Mike Naberezny。
2.1b1(2006-08-30)
“supervisord -h”和“supervisorctl -h”不起作用(显示帮助视图而不是跟踪回溯,感谢马其顿的Damjan提供的错误报告)。
在最初启动失败后成功启动的进程不再在BACKOFF状态下报告(感谢马其顿的Damjan提供的错误报告)。
向supervisorctl shell添加了新的“maintail”命令,允许您跟踪“main”管理器日志。这使用新的readMainLog xmlrpc API。
与进程状态转换相关的各种更改,全部为内部。README.txt已更新,包含新的状态转换图。
startProcess和startAllProcesses xmlrpc API已更改:而不是接受一个超时整数,它们接受一个wait布尔值(超时由进程的“startsecs”配置隐含)。如果wait为False,则不等待startsecs。
已知问题
代码不匹配状态转换图。配置为自动重启且启动“成功”但随后在‘startsecs’后死亡的进程会经历RUNNING -> BACKOFF -> STARTING的转换,而不是正确的转换RUNNING -> EXITED -> STARTING。这没有真正的负面影响,但应该修复以保持正确性。
2.0 (2006-08-30)
以守护进程模式写入的pidfile具有错误的pid。
supervisorctl:tail(非-f)在从服务器提供时没有传递适当的错误消息。
在调试级别用于杀死进程的日志信号名称。
supervisorctl“tail -f”与配置了绝对unix:// URL的supervisorctl部分不工作。
新的“environment”配置文件选项允许您从配置文件中添加环境变量值到supervisord环境。
2.0b1(2006-07-12)
基于1.0.7的基本重写,仅使用distutils(仅)进行安装,使用ConfigParser而不是ZConfig,使用HTTP进行线协议,Web界面,supervisorctl中少了谎言。
1.0.7 (2006-07-11)
如果错误值是“没有子进程”,则不记录waitpid错误。
针对子文件描述符管道使用select()并相应地提高select超时。
1.0.6 (2005-11-20)
对Mac OS X的运行进行了一些调整,以提高其效率(包括修复测试以在Mac OS X上运行,不再在logtail输出中出现“从fd XXX读取错误”,由于Mac OS上不再不必要地写入日志文件,因此减少了磁盘/CPU的使用)。
1.0.5 (2004-07-29)
简短描述:在以前的版本中,在supervisor下调用时,创建了大量stdout/stderr输出的管理程序运行速度可能比通常慢,现在它们不再这样。
详细描述:supervisord通过轮询与子进程stderr/stdout相关的管道来管理子输出。轮询操作在主循环中执行,该循环还对与客户端/服务器操作相关的文件描述符执行“select”。在以前的版本中,select超时设置为2秒。本版本将超时更改为1/10秒,以便跟上客户端stdout/stderr输出。
详细描述:在Linux系统中,至少在Linux中,管道缓冲区大小是由内核固定的,大约在512 - 4096字节之间;当一个子进程写入足够的数据以填满管道缓冲区时,它将阻塞在进一步的stdout/stderr输出上,直到supervisord出现并读取管道内的字节数以清除缓冲区。由于主循环中缓冲区读取频率的增加,我们现在比以前更快地清除这些缓冲区;0.1秒的超时值似乎足够快,可以在管理非常快速的系统上的程序时清除子进程管道的缓冲区,同时仍然使supervisord进程在大多数时间处于休眠状态。
1.0.4或“Alpha 4”(2004-06-30)
忘记在configure.py中更新版本标签,所以a3中的supervisor版本列出的为“1.0.1”,而应该是“1.0.3”。a4将列出为“1.0.4”。
与其防止无法调用setuid()时进程启动(例如,当supervisord作为非root运行时),不如记录错误并继续。
1.0.3或“Alpha 3”(2004-05-26)
守护进程可能会消耗大量CPU时间,试图在真实文件上select()(我不知道当文件位于EOF时select()会失败)。通过轮询而不是使用select()来修复。
由于回收已死子进程的bug,进程可能会“泄漏”并成为僵尸进程。
supervisord现在默认会将自己作为守护进程。
从supervisord的可接受选项中删除了“daemon”配置文件选项和-d/–daemon命令行选项。取而代之,我们现在有“nodaemon”配置文件选项和-n/–nodaemon命令行选项。
logtail现在可以工作了。
pidproxy略有变化,以同步回收子进程。
在alpha2更改列表中,报告说supervisord有一个“noauth”命令行选项。这并不准确。关闭服务器身份验证的方法是不在服务器配置文件中包含“passwdfile”配置文件选项。然而,客户端确实仍然有一个noauth选项,该选项阻止它尝试向服务器发送身份验证凭据。
将ZPL许可证添加到LICENSE.txt中的ZConfig。
1.0.2或“Alpha 2”(未发布)
由于添加了网络套接字支持,supervisorctl和supervisord不再需要在同一台机器上运行。
supervisorctl和supervisord不再共享相同的配置文件格式。
supervisorctl现在使用持久连接到supervisord(与为每个命令创建新的连接相反)。
SRP(安全远程密码)认证现在是supervisord支持的访问控制形式。在supervisorctl交互模式下,默认情况下,当尝试与需要SRP认证的supervisord通信时,会要求用户输入凭据。
supervisord有一个新的命令行选项和配置文件选项来指定“noauth”模式,表示它不应要求客户端进行身份验证。
supervisorctl有一个新的命令行选项和配置选项来指定“noauth”模式,表示它永远不会尝试向服务器发送身份验证信息。
supervisorctl有新的命令:open:打开到新supervisord的连接;close:关闭当前连接。
supervisorctl的“logtail”命令现在从supervisord的日志文件远程检索日志数据(而不是直接从公共文件系统读取)。它也不再模拟“tail -f”,它只返回服务器日志文件中的
行。 supervisord/supervisorctl的线协议现在有协议版本控制,并在“protocol.txt”中进行了文档说明。
“configfile”命令行覆盖-C更改为-c
supervisor模式的最顶层部分名称从“supervisor”更改为“supervisord”
添加了“pidproxy”shim程序。
alpha 2中的已知问题
如果supervisorctl失去了与supervisord的连接,或者远程supervisord意外崩溃或关闭,那么与它通信的任何supervisorctl都可能会无限期地“挂起”等待数据。按Ctrl-C可以重新启动supervisorctl。
一次只能有一个supervisorctl进程与一个特定的supervisord进程通信。如果两个supervisorctl进程尝试与同一个supervisord进程通信,其中一个会“获胜”,另一个将被断开连接。
有时如果使用pidproxy启动程序,pidproxy程序本身可能会“泄漏”。
1.0.0或“Alpha 1”(未发布)
初始发布。
项目详情
下载文件
下载适合您平台文件。如果您不确定该选择哪个,请了解有关安装包的更多信息。