Monit不清除PID文件,并在进程成为僵尸时重新启动进程

我正在运行一个docker容器的监视器,它监视着一堆像vault,nginx,mongodb和更多的进程。 我已经为每个具有启动停止function的进程创build了包装器脚本,并将其引入到

#!/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文件并重新启动进程。 此外,为了validation并不捕获我的状态函数中的僵尸进程,我已经将ps -ef语句添加了grep -v "\["子句。 还有什么我需要做的或者如果有人面对这个问题呢?

如果您的应用程序正在产卵僵尸,那么将tini添加到您的堆栈中。 你的入口点/ cmd成为tini,调用你现有的入口点,tini将处理僵尸收割。

这是僵尸进程没有通过命名空间容器监狱被主机的init进程收回的结果。 所以你需要一个命名空间pid 1来收割你的僵尸。

Interesting Posts