Monit не очищает файл pid и не перезапускает процесс, когда процесс становится зомби

Я запускаю monit внутри док-контейнера, который отслеживает кучу процессов, таких как хранилище, nginx, mongodb и некоторые другие. Я создал сценарии-оболочки для каждого процесса с функцией запуска и остановки, которые загружаются в

#!/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 не очищает файлы pid и не перезапускает процесс. Кроме того, чтобы проверить и не поймать зомби-процесс в моей функции состояния, я добавил предложение grep -v "\[" в оператор ps -ef. Есть ли что-то еще, что мне нужно сделать, или если кто-то уже сталкивался с этой проблемой?


person Shrenik Gala    schedule 13.09.2016    source источник
comment
Я не уверен, связано это или нет. Но у меня проблемы с тем, что mongod.exe в моей среде Windows становится зомби при разработке против него. Я обнаружил, что почти невозможно избавиться от процесса, когда он находится в определенном состоянии. // Итак, что касается этого вопроса, могут ли быть проблемы с процессами, а не с мониторингом?   -  person KDecker    schedule 14.09.2016


Ответы (1)


Если ваше приложение порождает зомби, добавьте в стек tini. Ваша точка входа/cmd становится tini, которая вызывает вашу существующую точку входа, а tini будет обрабатывать жатву зомби.

Это результат того, что процессы-зомби не передают тюрьму контейнера с пространством имен, чтобы процесс инициализации хоста пожинал плоды. Итак, вам нужен pid 1 с пространством имен, который пожинает ваших зомби.

person BMitch    schedule 14.09.2016
comment
Спасибо @BMitch. Я согласен с тем, что зомби-процессы - это проблема, но не следует ли контролировать очистку файлов pid и перезапускать процесс в первую очередь? - person Shrenik Gala; 15.09.2016
comment
Я не так хорошо знаком с monit, просто знаю проблемы с докером. Тем не менее, пока pid 1 не пожинает процесс зомби, никакой другой процесс не может удалить зомби (вы не можете их убить), поэтому любые проверки существования pid будут говорить, что он все еще существует (в списке ps). Если monit по-прежнему не работает после сбора процессов, обязательно обновите вопрос. - person BMitch; 15.09.2016
comment
единственная проблема, с которой я столкнулся сейчас, заключается в том, что я запускаю monit как pid 1, чтобы он продолжал отслеживать процессы, даже если вы останавливаете/запускаете докер. Если я добавлю tini в качестве pid 1, я предполагаю, что не смогу добиться от него такого же поведения. Верно ли мое предположение? - person Shrenik Gala; 16.09.2016
comment
Вы пробовали? tini должен проходить через сигналы и ввод/вывод, чтобы сделать его прозрачным. Поведение Docker, отбрасывающего контейнеры при перезапуске демона, управляется параметром dockerd --live-restore. Без этого контейнер, включающий pid 1, в конечном итоге уничтожается с помощью -9, и он ничего не может сделать, чтобы заблокировать это. - person BMitch; 16.09.2016
comment
Привет, @Bmitch, я пытался использовать tini, он решил проблему с докером, но я сталкиваюсь с проблемами, когда процесс не запущен, но его файл pid все еще там, потому что он не был правильно остановлен, а monit показывает статус как 'Бег' - person Shrenik Gala; 22.09.2016
comment
Я бы связался с разработчиками monit, все мои знания касаются Docker. - person BMitch; 22.09.2016