2016-09-13 114 views
1

我在docker容器內運行monit,該容器正在監視像vault,nginx,mongodb等一些進程。我已經與啓停功能,這被送入Monit未清除pid文件並在進程變爲殭屍時重新啓動進程

#!/bin/sh 
# vault service script 

VAULT_DIR="/tmp/vault" 
VAULT_USER="myuser" 
USER=$(whoami) 
if [ $USER != "root" ] 
then 
    echo "Only root can run vault-server service" 
    exit 1 
fi 


usage() { 
    echo "Usage: `basename $0`: <start|stop|status|restart>" 
    exit 1 
} 

start() { 
    status 
    if [ $PID -gt 0 ] 
    then 
     echo "vault server daemon was already started. PID: $PID" 
     return $PID 
    fi 
    echo "Starting vault server daemon..." 
    rm -f /var/run/vault.pid 
    VAULT_OPTIONS="" 
    VAULT_OPTIONS="-dev" 
    su $VAULT_USER -c "/usr/bin/nohup vault server $VAULT_OPTIONS 1>/var/log/vault/vault.log 2>/var/log/vault/vault.err &" 
    status 
    if [ $PID -gt 0 ] 
    then 
     echo $PID >> /var/run/vault.pid 
    fi 
    sleep 5 
    su $VAULT_USER /opt/vault/setup-vault.sh 
} 

stop() { 

    status 
    if [ $PID -eq 0 ] 
    then 
     echo "vault server daemon is already not running" 
     return 0 
    fi 
    echo "Stopping vault server daemon..." 
    rm -f /var/run/vault.pid 
    kill $PID 
} 
status() {                
    PID=`ps -ef | grep "vault server" | grep -v grep | grep -v "\[" | awk '{print $1}'`             
    if [ "x$PID" = "x" ]          
    then                             
     PID=0              
    fi                              

    # if PID is greater than 0 then vault server is running, else it is not            
    return $PID               
}                    

if [ "x$1" = "xstart" ]               
then                               
    start                 
    exit 0                 
fi                                

if [ "x$1" = "xstop" ]                           
then                               
    stop                 
    exit 0                 
fi                    

if [ "x$1" = "xrestart" ]              
then                   
    stop              
    start                 
    exit 0        
fi                    

if [ "x$1" = "xstatus" ]              
then           
    status                 
    if [ $PID -gt 0 ]           
    then                 
     echo "vault server daemon is running with PID: $PID" 
    else                 
     echo "vault server daemon is NOT running"     
    fi                  
    exit $PID               
fi                    

usage 

出於某種原因,當進程崩潰,變成了殭屍,monit的不清除進程文件並重新啓動過程中的每個進程所創建的包裝腳本。另外爲了驗證並且不在我的狀態函數中捕獲殭屍進程,我已將grep -v "\["子句添加到ps -ef語句中。還有什麼我需要做的或者是否有人遇到過這個問題?

+0

我不確定這是否相關。但是在我的Windows環境中遇到'mongod.exe'問題,在開發它時會變成殭屍。我發現當它處於特定狀態時幾乎不可能處理這個過程。 //對於這個問題,它可能是流程而不是monit的問題嗎? – KDecker

回答

1

如果您的應用程序產生殭屍,請將tini添加到您的堆棧中。你的入口點/ cmd變成tini,它調用你現有的入口點,tini將處理殭屍收割。

這是殭屍進程沒有通過命名空間容器jail被主機的init進程獲得的結果。所以你需要一個命名空間pid 1來收割你的殭屍。

+0

謝謝@BMitch。我同意殭屍進程是一個問題,但不應該首先清除pid文件並重新啓動進程? –

+0

我不像monit那麼熟悉,只知道docker面臨的挑戰。也就是說,直到pid 1收穫殭屍進程,沒有其他進程可以移除殭屍(你不能殺死它們),所以對現有pid的任何檢查都會說它仍然存在(在'ps'列表中)。如果monit在收穫完成後仍然失敗,請務必更新問題。 – BMitch

+0

我現在面臨的唯一挑戰是,我正在運行monit作爲pid 1,以便即使您停止/啓動docker,它也會持續監視這些進程。如果我將tini添加爲pid 1,我假設我無法從中獲得相同的行爲。我的假設是否正確? –