如何在不杀死其控制的程序的情况下停止Supervisord进程?

T. *_*nes 5 supervisord

我正在使用Supervisord来持续运行一些索引程序.每次运行索引器时,它都会抓取一组文档,对它们编制索引,然后结束.然后,Supervisord进程将生成另一个相同的索引器程序,该索引器将获取一组新的索引文档.

有时我需要停止运行这些索引器程序的Supervisord进程.但是,当我这样做时,它总是在工作中间杀死索引器程序.

我想做的是停止Supervisord进程,以便当前运行的索引器程序将执行完成,但Supervisord进程不会产生另一个索引器.

以下是此过程的supervisord.conf设置:

; TRIGGERING INDEXERS
;
[program:indexer]
command=php /data/app/index_company.php
process_name=%(program_name)s_%(process_num)d
redirect_stderr=true
stdout_capture_maxbytes=10MB
stdout_logfile_backups=0
numprocs=5
startsecs=0
autostart=false
autorestart=true
[group:indexers]
programs=indexer
Run Code Online (Sandbox Code Playgroud)

sou*_*kah 11

supervisordSIGTERM当请求停止时将发出信号.您的孩子很可能会捕获并处理此信号(stopsignal配置可以更改发送的信号).

既然你正在使用PHP,那么pcntl_signal就好了.我无法猜测你的主人是如何工作的我会假设它只是一个无限循环,单线程.这是一个非常原始的例子:

<?php
    $stop_requested = false;

    pcntl_signal( SIGTERM, function() {
        global $stop_requested;
        $stop_requested = true;
    } );

    while ( true ) {
        do_work();
        if ( $stop_requested ) break;
    }
?>
Run Code Online (Sandbox Code Playgroud)

现在,当您尝试停止该过程时,它将不会被终止.但是,它会在10秒后停止.为什么?

因为stopwaitsecs默认设置为10秒.这是supervisord等待发送一个SIGKILL将终止你的进程的时间.将它设置为你知道的东西会很好用,比如说600秒就可以让你的索引器在关闭之前完成工作.

[program:indexer]
command=php index.php
stopwaitsecs=600
Run Code Online (Sandbox Code Playgroud)

上面应该足以让你的索引器优雅地停止.但是,等待时间长了至少有一个问题:supervisorctl在进程停止之前,它将继续等待并且不会处理更多命令.您可以运行另一个实例.不确定webclient会发生什么(可能会继续加载并期待响应).

虽然上面的方法可能对您有用,但您可能应该修改您的设置并且不要supervisord等待很长时间等待关机发生.您的索引器应该尽快停止,不要再获取任何工作,刷新结果,或者他们正在做的任何事情.较小的有用工作量将确保它们在合理的时间内退出.

希望这可以帮助.让我知道事情的后续.