2013-08-24 63 views
2

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

回答

6

supervisord將發出SIGTERM信號時,被要求停止。你的孩子很可能捕捉並處理這個信號(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將繼續等待,並且不會處理進一步的命令,直到過程停止。您可以運行另一個實例。不知道webclient會發生什麼(可能會繼續加載並期待響應)。

儘管上述方法可能對您有效,但您應該修改您的設置,並且不要讓supervisord長時間等待關機發生。您的索引者可能應該儘快停下來,不要進行更多的工作,沖淡結果或者他們正在做的任何事情。較小的有用工作塊將確保它們在合理的時間內退出。

希望這會有所幫助。讓我知道事情的後續。

+0

非常有用!我注意到SIGTERM在默認情況下殺死了php腳本,除非使用'pcntl_signal'並且指定了回調。例如,如果我運行類似於上面的腳本,它將立即終止,除非我已經定義了SIGTERM回調函數。一旦定義了SIGTERM回調,腳本就會繼續運行,直到它被殺死或處理。另外需要注意的是,所有這些信號都會立即終止當前位於sleep()函數內的php腳本。看到這裏:[鏈接](http://php.net/manual/en/function.pcntl-signal.php) –

相關問題