【发布时间】:2013-12-12 05:43:49
【问题描述】:
我有一个开发服务器,我经常通过 Git 推送代码更改。每次推送后,我需要手动登录服务器并重新启动主管进程。
有没有办法让 Supervisor 监视文件系统目录的更改并在更改时重新加载进程?
【问题讨论】:
标签: supervisord
我有一个开发服务器,我经常通过 Git 推送代码更改。每次推送后,我需要手动登录服务器并重新启动主管进程。
有没有办法让 Supervisor 监视文件系统目录的更改并在更改时重新加载进程?
【问题讨论】:
标签: supervisord
您应该能够使用Event Listener 来监视文件系统(可能使用watchdog)并使用XML-RPC API 发出重新启动。查看superlance 包中的memmon 监听器以获取灵感。它不需要那么复杂。由于看门狗会调用您的重启例程,因此您无需使用 childutils.listener.wait 读取事件。
或者,如果权限对于要访问的 supervisord API 是正确的(套接字权限、HTTP 密码),则 git 挂钩可能会起到作用。一种更简单但安全性较低的方法。
一种更简单甚至更不安全的方法是允许您发出supervisorctl restart。运行用户必须匹配您的推送用户(或 git,或 www,取决于您的设置方式)。有很多方法让它在安全方面出错。但是对于开发来说,可能会做得很好。
相关:
【讨论】:
我也没有找到任何解决方案,所以我尝试自己制作。 Here it is.
你可以通过这个命令安装包:
pip install git+https://github.com/stavinsky/supervisord-touch-reload.git
(我会在添加一些测试后将其添加到 PyPI 中。)
在 github 的示例文件夹中设置主管的示例。我相信文档很快就会完成。
基本上你需要开始使用这个模块就是添加带有command的事件监听器,比如:
python -m touch_reload --socket unix:///tmp/supervisor.sock --file <path/to file file> --program <program name>
其中file 是一个将使用绝对或相对于directory 路径监视的文件,socket 是来自supervisorctl 部分的套接字,program 是来自[program:<name>] 部分定义的程序名称。
还可以使用 --username 和 --password,如果您有自定义主管配置,则可以使用它们。
【讨论】:
虽然不是使用主管的解决方案,但我通常在受监督的应用程序中解决此问题。例如,将 --reload 标志添加到 gunicorn,它会在您的应用更改时重新加载。
【讨论】:
我遇到了同样的问题并创建了 Superfsmon 可以做你想做的事:https://github.com/timakro/superfsmon
pip install superfsmon
这是自述文件中的一个简单示例:
根据
/app/devops的更改重新启动您的 celery 工作人员 您的supervisord.conf的目录可能如下所示。[program:celery] command=celery -A devops.celery worker --loglevel=INFO --concurrency=10 [program:superfsmon] command=superfsmon /app/devops celery
【讨论】:
这是一个带有 inotify 工具的线性解决方案:
apt-get install -y inotify-tools
while true; do inotifywait -r src/ && service supervisor restart; done
【讨论】: