gpt4 book ai didi

supervisord - 如何停止 Supervisord 进程而不终止其控制的程序?

转载 作者:行者123 更新时间:2023-12-03 06:13:55 24 4
gpt4 key购买 nike

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

最佳答案

当请求停止时,

supervisord 将发出 SIGTERM 信号。您的 child 很可能捕获并处理此信号(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 长时间等待关闭发生。您的索引器可能应该尽快停止,不再获取任何更多工作、刷新结果或执行任何操作。较小的有用工作 block 将确保它们在合理的时间内退出。

希望这有帮助。让我知道进展如何。

关于supervisord - 如何停止 Supervisord 进程而不终止其控制的程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18414209/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com