Python 使用fabric和supervisor部署web应用程序-SIGHUP会导致服务器终止

Python 使用fabric和supervisor部署web应用程序-SIGHUP会导致服务器终止,python,deployment,fabric,supervisord,Python,Deployment,Fabric,Supervisord,我们正在使用supervisor部署python web应用程序。部署时,web应用程序通过构建安装在服务器上,并使用collective.recipe.supervisor创建用于运行supervisor的脚本。此脚本在部署过程结束时由结构脚本调用。问题是,当部署脚本完成时,会向进程发送一个SIGHUP信号,这会导致supervisor重新启动(根据此行:),但由于某些原因,web应用程序在终止后不会重新启动。在以下操作之后没有日志输出: 2012-10-24 15:23:51,510 WAR

我们正在使用supervisor部署python web应用程序。部署时,web应用程序通过构建安装在服务器上,并使用collective.recipe.supervisor创建用于运行supervisor的脚本。此脚本在部署过程结束时由结构脚本调用。问题是,当部署脚本完成时,会向进程发送一个SIGHUP信号,这会导致supervisor重新启动(根据此行:),但由于某些原因,web应用程序在终止后不会重新启动。在以下操作之后没有日志输出:

2012-10-24 15:23:51,510 WARN received SIGHUP indicating restart request
2012-10-24 15:23:51,511 INFO waiting for app-server to die
2012-10-24 15:23:54,650 INFO waiting for app-server to die
2012-10-24 15:23:57,653 INFO waiting for app-server to die
2012-10-24 15:24:00,657 INFO waiting for app-server to die
2012-10-24 15:24:01,658 WARN killing 'app-server' (28981) with SIGKILL
2012-10-24 15:24:01,659 INFO stopped: app-server (terminated by SIGKILL)
所以我有两个问题。第一个问题是,有人知道为什么主管会在SIGHUP上重新启动吗?我找不到对此的任何解释,并且没有任何命令行选项可以关闭此行为。第二个问题是,我们如何解决我们面临的问题?我们试着用nohup启动supervisor,但仍然收到通知。奇怪的是,当我登录到服务器,手动启动supervisor并注销时,这种情况不会发生

以下是buildout生成的主管脚本:

#!/usr/bin/python2.6

import sys
sys.path[0:0] = [
'/home/username/.buildout/eggs/supervisor-3.0b1-py2.6.egg',
'/home/username/.buildout/eggs/meld3-0.6.9-py2.6.egg',
'/home/username/.buildout/eggs/distribute-0.6.30-py2.6.egg',
]


import sys; sys.argv.extend(["-c","/home/username/app_directory/parts/supervisor/supervisord.conf"])

import supervisor.supervisord

if __name__ == '__main__':
sys.exit(supervisor.supervisord.main())
[supervisord]
childlogdir = /home/username/app_directory/var/log
logfile = /home/username/app_directory/var/log/supervisord.log
logfile_maxbytes = 50MB
logfile_backups = 10
loglevel = info
pidfile = /home/username/app_directory/var/supervisord.pid
umask = 022
nodaemon = false
nocleanup = false

[unix_http_server]
file = /home/username/app_directory/supervisor.sock
username = username
password = apasswd
chmod = 0700

[supervisorctl]
serverurl = unix:///home/username/app_directory/supervisor.sock
username = username
password = apasswd

[rpcinterface:supervisor]
supervisor.rpcinterface_factory=supervisor.rpcinterface:make_main_rpcinterface

[program:app-server]
command = /home/username/app_directory/bin/gunicorn --bind 0.0.0.0:5000 app:wsgi
process_name = app-server
directory = /home/username/app_directory/bin
priority = 50
redirect_stderr = false
directory = /home/username/app_directory
这是supervisor的配置文件,也是由buildout生成的:

#!/usr/bin/python2.6

import sys
sys.path[0:0] = [
'/home/username/.buildout/eggs/supervisor-3.0b1-py2.6.egg',
'/home/username/.buildout/eggs/meld3-0.6.9-py2.6.egg',
'/home/username/.buildout/eggs/distribute-0.6.30-py2.6.egg',
]


import sys; sys.argv.extend(["-c","/home/username/app_directory/parts/supervisor/supervisord.conf"])

import supervisor.supervisord

if __name__ == '__main__':
sys.exit(supervisor.supervisord.main())
[supervisord]
childlogdir = /home/username/app_directory/var/log
logfile = /home/username/app_directory/var/log/supervisord.log
logfile_maxbytes = 50MB
logfile_backups = 10
loglevel = info
pidfile = /home/username/app_directory/var/supervisord.pid
umask = 022
nodaemon = false
nocleanup = false

[unix_http_server]
file = /home/username/app_directory/supervisor.sock
username = username
password = apasswd
chmod = 0700

[supervisorctl]
serverurl = unix:///home/username/app_directory/supervisor.sock
username = username
password = apasswd

[rpcinterface:supervisor]
supervisor.rpcinterface_factory=supervisor.rpcinterface:make_main_rpcinterface

[program:app-server]
command = /home/username/app_directory/bin/gunicorn --bind 0.0.0.0:5000 app:wsgi
process_name = app-server
directory = /home/username/app_directory/bin
priority = 50
redirect_stderr = false
directory = /home/username/app_directory
在真正了解问题之前,我们不想安装修补版的supervisor,因此我们非常感谢您提供的任何信息


提前感谢

SIGHUP上重新启动或重新加载
是linux系统编程中的常见做法。问题是,为什么在部署结束后会出现
SIGHUP
。由于supervisor daemonize自身正确(因为您可以启动它并注销,它将正常工作),重新加载信号可能会通过构建bot发送给supervisor,表明需要重新启动webapp,因为代码已更改

因此,主管启动应用程序关闭,以便使用新代码启动应用程序。但应用程序不会在给定的超时时间内停止,并且主管决定应用程序挂起并使用
SIGKILL
终止它


要解决问题,您需要在主管要求时教应用程序关闭。

supervisord文档明确指出,向supervisord进程发送SIGHUP将“停止所有进程,从找到的第一个配置文件重新加载配置,然后重新启动所有进程”

参考-

也许你的过程行为不端;看起来主管尝试了几次很好地关闭它,但后来决定需要一次硬杀:

process.py:560
# kill processes which are taking too long to stop with a final
# sigkill.  if this doesn't kill it, the process will be stuck
# in the STOPPING state forever.
self.config.options.logger.warn(
    killing %r (%s) with SIGKILL' % (self.config.name, self.pid))
self.kill(signal.SIGKILL)

可能kill调用失败了?

您可能遇到了以下错误:


解决办法是将supervisord降级,直到在发布的版本中修复为止。

遇到了完全相同的问题,降级到3.0a10解决了这个问题