有没有办法自动重新加载Supervisor进程?

时间:2013-11-26 21:06:54

标签: supervisord

我有一个开发服务器,我经常通过Git推送代码更改。每次推送后,我需要手动登录服务器并重新启动管理程序进程。

有没有办法让Supervisor监控文件系统目录以进行更改并重新加载更改过程?

5 个答案:

答案 0 :(得分:6)

您应该能够使用监视文件系统的Event Listener(可能watchdog)并使用XML-RPC API重新启动。从superlance包中查看memmon听众,获取灵感。它不需要那么复杂。由于看门狗会调用您的重启例程,因此您无需使用childutils.listener.wait读取事件。

或者,如果权限对于要访问的supervisord API(套接字权限,HTTP密码)是正确的,git钩子可能会起作用。一种更简单但不太安全的方法。

更简单,甚至更不安全的方法是允许您发出supervisorctl restart。正在运行的用户必须匹配您的推送用户(或git或www,具体取决于您的设置)。很多方法都会出现安全问题。但是对于发展来说,可能会做得很好。

相关:

答案 1 :(得分:6)

我也没有找到任何解决方案,所以我试着自己做。 Here it is

您可以通过以下命令安装软件包:

pip install git+https://github.com/stavinsky/supervisord-touch-reload.git

(我会在添加一些测试后将它添加到PyPI。)

在github中的examples文件夹中设置supervisor的示例。我相信,文档将很快发布。 基本上你需要开始使用这个模块就是添加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

答案 2 :(得分:1)

虽然不是使用主管的解决方案,但我通常会在受监督的应用中解决此问题。例如,将--reload标志添加到gunicorn,只要你的应用发生变化,它就会重新加载。

答案 3 :(得分:1)

我遇到了同样的问题并创建了可以做你想做的Superfsmon:https://github.com/timakro/superfsmon

pip install superfsmon

以下是自述文件中的一个简单示例:

  

重新启动芹菜工作人员/app/devops的更改   你的supervisord.conf看起来像这样的目录。

[program:celery]
command=celery -A devops.celery worker --loglevel=INFO --concurrency=10

[program:superfsmon]
command=superfsmon /app/devops celery

答案 4 :(得分:1)

这是一种使用 inotify 工具的线性解决方案:

apt-get install -y inotify-tools
while true; do  inotifywait -r src/ && service supervisor restart; done