gpt4 book ai didi

python - 使用 fabric 和 supervisor 部署 Web 应用程序 - SIGHUP 导致服务器终止

转载 作者:太空宇宙 更新时间:2023-11-03 11:08:29 24 4
gpt4 key购买 nike

我们正在使用 supervisor 来部署 python 网络应用程序。在部署时,Web 应用程序通过 buildout 安装在服务器上,并使用 collective.recipe.supervisor 创建用于运行 supervisor 的脚本。该脚本在部署过程结束时由结构脚本调用。问题是当部署脚本完成时,一个 SIGHUP 信号被发送到进程,这导致主管重新启动(按照这一行:https://github.com/Supervisor/supervisor/blob/master/supervisor/supervisord.py#L300),但由于某种原因,网络应用程序在它之后没有重新启动被终止。后面没有日志输出:

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)

所以我有两个问题。第一个是,有谁知道为什么 supervisor 在 SIGHUP 上重启?我找不到任何解释,也没有命令行选项可以关闭此行为。第二个问题是,我们如何解决我们面临的问题?我们尝试用 nohup 启动主管,但仍然收到 SIGHUP。奇怪的是,当我登录到服务器、手动启动主管并注销时,这并没有发生。

这里是buildout生成的supervisor脚本:

#!/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())

这里是 supervisor 的配置文件,也是由 buildout 生成的:

[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 守护进程本身正确(因为你可以启动它并注销它会工作),重新加载信号可能会通过构建 bot 发送给 supervisor,表明需要重新启动 webapp,因为代码已更改。

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

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

关于python - 使用 fabric 和 supervisor 部署 Web 应用程序 - SIGHUP 导致服务器终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13050472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com