6

我正在使用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
4

1 回答 1

13

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;
    }
?>

现在,当您尝试停止该进程时,它不会被终止。但是,它仍然会在 10 秒后停止。为什么?

因为stopwaitsecs默认设置为 10 秒。这是supervisord将等到发送SIGKILL将杀死您的进程的时间。将其设置为您知道会很好的设置,例如 600 秒将允许您的索引器在关闭之前完成工作。

[program:indexer]
command=php index.php
stopwaitsecs=600

以上应该足以让您的索引器正常停止。但是,至少有一个等待时间长的问题:supervisorctl将继续等待并且在进程停止之前不处理进一步的命令。您可以运行另一个实例。不确定网络客户端会发生什么(可能会继续加载并期待响应)。

虽然上述方法可能适合您,但您可能应该修改您的设置,并且不要supervisord等待这么长时间等待关机发生。您的索引器可能应该尽快停止,不再获取任何工作、刷新结果或它们正在执行的任何操作。较小的有用工作块将确保它们在合理的时间内退出。

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

于 2013-11-30T10:38:41.433 回答