2016-09-13 8 views
1

저는 monit을 볼트, nginx, mongodb와 같은 프로세스를 모니터링하는 도커 컨테이너에서 실행하고 있습니다. 나는 프로세스가 충돌과 좀비가된다가, MONIT는 PID 파일을 삭제하고 프로세스를 다시 시작하지 않습니다 어떤 이유로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 

에 공급 시작 정지 기능, 각 프로세스에 대한 래퍼 스크립트를 만들었습니다. 또한 상태 확인 기능에서 좀비 프로세스를 확인하고 catch하지 않으려면 ps -ef 문에 grep -v "\[" 절을 추가했습니다. 제가해야 할 일이 있습니까? 아니면 이전에이 문제에 직면 한 사람이 있습니까?

+0

관련성 여부는 확실하지 않습니다. 하지만 내 Windows 환경에서'mongod.exe'에 문제가 생겨서 좀비가 되려고합니다. 특정 상태에 이르면 프로세스를 처리하는 것이 거의 불가능하다는 것을 알게되었습니다. //이 질문에 관해서는, 아마도 프로세스가 아닌 monit의 문제 일 수 있습니까? – KDecker

답변

1

응용 프로그램이 좀비를 생성하는 경우 스택에 tini을 추가하십시오. 진입 점/cmd는 기존 진입 점을 호출하는 tini가되며 tini는 좀비 수확을 처리합니다.

이것은 좀비 프로세스가 네임 스페이스 컨테이너 감옥을 통과하지 않아서 호스트의 init 프로세스에서 수확 한 결과입니다. 그래서 좀비를 거두는 네임 스페이스의 PID 1이 필요합니다.

+0

감사합니다. @BMitch. 나는 좀비 프로세스가 문제가된다는 것에 동의하지만, pid 파일을 지우고 처음부터 프로세스를 다시 시작해서는 안된다. –

+0

나는 monit에 익숙하지 않다. 단지 docker와 관련된 문제를 알고있다. 즉, pid 1이 좀비 프로세스를 거칠 때까지는 다른 프로세스가 좀비를 제거 할 수 없으므로 (죽일 수는 없음), pid에 대한 모든 검사는 여전히 존재한다고 (ps 목록에 있음) 말합니다. 프로세스가 완료된 후에도 모니터가 계속 실패하면 질문을 업데이트하십시오. – BMitch

+0

지금 당장 가지고있는 유일한 도전은 pid 1로 모니터를 실행하여 docker를 중지/시작하더라도 프로세스를 계속 모니터링한다는 것입니다. tini를 ​​pid 1로 추가하면 같은 동작을 수행 할 수 없다고 가정합니다. 내 가정이 맞습니까? –