【问题标题】:Is there a way to automatically reload Supervisor processes?有没有办法自动重新加载主管进程?
【发布时间】:2013-12-12 05:43:49
【问题描述】:

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

有没有办法让 Supervisor 监视文件系统目录的更改并在更改时重新加载进程?

【问题讨论】:

    标签: supervisord


    【解决方案1】:

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

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

    一种更简单甚至更不安全的方法是允许您发出supervisorctl restart。运行用户必须匹配您的推送用户(或 git,或 www,取决于您的设置方式)。有很多方法让它在安全方面出错。但是对于开发来说,可能会做得很好。

    相关:

    【讨论】:

    • 所以,这并不是真正的解决方案,更像是“如何创建解决方案”。那么现在已经快 3 年了,在我看来是一个非常普遍的问题仍然没有实际的解决方案吗?
    【解决方案2】:

    我也没有找到任何解决方案,所以我尝试自己制作。 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,如果您有自定义主管配置,则可以使用它们。

    【讨论】:

    • 感谢您发布此内容。似乎运作良好。确实很奇怪,没有内置的解决方案可以做这样的事情
    • 欢迎。很高兴知道这对某人有帮助。如果您有任何问题或想法如何改进这个脚本,请在此处或 github 上写给我
    • 此解决方案是否一次只监控一个文件? github.com/gorakhargosh/watchdog 可以让你观看整个目录。
    • 我的模块的主要目标是在某些文件被更改时重新启动 supervisord 作业。例如与 CI 一起使用是很好的。
    【解决方案3】:

    虽然不是使用主管的解决方案,但我通常在受监督的应用程序中解决此问题。例如,将 --reload 标志添加到 gunicorn,它会在您的应用更改时重新加载。

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题并创建了 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
      

      【讨论】:

      • 与接受的答案中提到的github.com/stavinsky/supervisord-touch-reload 相比,这有什么特别的优势吗?
      • @hackel 它有更多选项,例如递归监视目录、按文件扩展名或正则表达式过滤以及重新启动多个程序(可选在主管组中)。它可能在 PyPI 上有更好的文档记录。
      【解决方案5】:

      这是一个带有 inotify 工具的线性解决方案:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-14
        • 2018-07-31
        • 2010-12-24
        • 1970-01-01
        • 1970-01-01
        • 2021-08-25
        • 1970-01-01
        • 2019-12-31
        相关资源
        最近更新 更多