【问题标题】:how to kill uwsgi process without worker respawn如何在没有工人重生的情况下杀死 uwsgi 进程
【发布时间】:2021-09-30 04:30:36
【问题描述】:

我在杀死 ​​uwsgi 进程时遇到了麻烦。 每当我使用以下命令关闭 uwsgi 时,几秒钟后另一个 uwsgi 工作人员会重新生成。所以关闭 uwsgi 进程并再次启动 uwsgi 服务器后,uwsgi 进程会继续在内存中积累。

  • sudo pkill -f uwsgi -9
  • 杀死 -9 cat /tmp/MyProject.pid
  • uwsgi --stop /tmp/MyProject.pid

我想知道如何杀死 uwsgi 进程而不使 uwsgi 工作人员重生。 我附上ini文件如下。

[uwsgi]
chdir            = /home/data/MyProject/
module           = MyProject.wsgi
home             = /home/data/anaconda3/envs/env1
master           = true
pidfile          = /tmp/MyProject.pid
single-interpreter = true
die-on-term     = true 
processes       = 4
socket          = /home/data/MyProject/MyProject.sock
chmod-socket    = 666
vacuum          = true

提前谢谢你!!

【问题讨论】:

    标签: python django uwsgi


    【解决方案1】:

    起初:

    1. uwsgibinary protocol that uWSGI uses to communicate with other serversuWSGI 是应用服务器。
    2. 如果你关心子进程(worker),你应该避免(12)使用-9SIGKILL)来停止进程

    根据你的信息我能说什么:

    每当我使用以下命令关闭 uwsgi 时,另一个 uwsgi 工作人员 几秒钟后重生

    看起来您试图杀死工作(子)进程而不是 uWSGI 应用程序服务器(主进程)。这是您的配置中的processes = 4,因此应用程序服务器(主进程)监视最少运行的工作人员(子进程)。如果其中一个退出(通过KILL 信号或源代码异常,不管)应用程序服务器启动新的第四个进程。

    所以在关闭 uwsgi 进程并再次启动 uwsgi 服务器后

    如果uwsgi process 是工作人员(子进程) - 请参阅上面的答案

    如果uwsgi process 是应用服务器(主进程) - 这是另一个问题。您使用KILL (-9) 信号停止服务器。这不允许正确退出应用程序(请参阅at first 的第二点)。因此,当您的应用程序服务器意外终止时,它会使所有 4 个子进程在没有父(主)进程的情况下运行(向 orphaned process 打个招呼)

    您应该使用SIGTERM instdead of SIGKILL。你明白die-on-term = true的意思吗?是的!这意味着please stop stack of all processes on SIGTERM

    uwsgi --stop /tmp/MyProject.pid

    这个命令should stop所有进程正常。您的问题中没有任何信息可以确定可能是什么问题...

    我有三个猜测:

    1. web应用源码问题:退出操作处理不当
    2. die-on-term = true inverts the meanings of SIGTERM and SIGQUIT to uWSGI,所以在这种情况下,stop 可能像 reload 一样工作?不确定。
    3. 某种误解

    更新一:如何动态控制子进程的数量

    此外,您可以查看此helpful article 以了解如何动态扩展和扩展子进程,以便仅在需要时运行所有第 4 个进程,并在服务空闲时仅运行 1 个进程。

    更新 2:检查行为是否可重现

    我创建了简单的 uWSGI 应用程序来检查行为:

    opt
    `-- wsgi_example
        |-- app.py
        `-- wsgi.ini
    
    • wsgi.ini
    [uwsgi]
    chdir            = /opt/wsgi_example
    module           = app
    master           = true
    pidfile          = /opt/wsgi_example/app.pid
    single-interpreter = true
    die-on-term     = true
    processes       = 2
    socket          = /opt/wsgi_example/app.sock
    chmod-socket    = 666
    vacuum          = true
    
    • app.py
    def application(env, start_response):
        start_response('200 OK', [('Content-Type','text/html')])
        return [b"Hello World"]
    

    我通过wsgi wsgi.ini运行这个应用程序
    我通过uwsgi --stop app.pid停止了这个应用程序

    输出是

    spawned uWSGI master process (pid: 15797)
    spawned uWSGI worker 1 (pid: 15798, cores: 1)
    spawned uWSGI worker 2 (pid: 15799, cores: 1)
    SIGINT/SIGQUIT received...killing workers...
    worker 1 buried after 1 seconds
    worker 2 buried after 1 seconds
    goodbye to uWSGI.
    VACUUM: pidfile removed.
    VACUUM: unix socket /opt/wsgi_example/app.sock removed.
    

    一切正常。所有进程都已停止。
    您的问题不可重现。

    在应用程序代码或您的个人基础架构配置中搜索问题。

    ※与uWSGI 2.0.82.0.19.1python 3.6.7核对

    【讨论】:

    • 首先,非常感谢您的回答!!正如您提到的“die-on-term = true”,当我使用“uwsgi --stop /tmp/MyProject.pid”命令停止应用程序时,子进程被杀死并且新的子进程立即重新生成。我分享 uwsgi 日志如下
    • SIGINT/SIGQUIT received...killing workers... worker 1 buried after 1 seconds worker 2 buried after 1 seconds worker 3 buried after 1 seconds worker 4 buried after 1 seconds goodbye to uWSGI. pp) spawned uWSGI master process (pid: 18825) spawned uWSGI worker 1 (pid: 18830, cores: 1) spawned uWSGI worker 2 (pid: 18831, cores: 1) spawned uWSGI worker 3 (pid: 18832, cores: 1) spawned uWSGI worker 4 (pid: 18833, cores: 1)
    • 我想阻止工人(另一个子进程)在先前的子进程被杀死后重新生成
    • @JoJay 1. 使用SIGTERM (kill -15 $PID) 代替SIGKILL 的结果是什么? 2.如果设置die-on-term=false,使用uwsgi --stop /tmp/MyProject.pid会有什么结果?
    • 2.如果设置 die-on-term=false,使用 uwsgi --stop /tmp/MyProject.pid 的结果是什么? -> 结果与 die-on-term=true 相同。子进程被杀死,新的子进程立即重生
    猜你喜欢
    • 1970-01-01
    • 2019-07-11
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多