我有一个开发服务器,我经常通过Git推送代码更改。每次推送后,我需要手动登录服务器并重新启动管理程序进程。
有没有办法让Supervisor监控文件系统目录以进行更改并重新加载更改过程?
答案 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