我在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
語句中。還有什麼我需要做的或者是否有人遇到過這個問題?
我不確定這是否相關。但是在我的Windows環境中遇到'mongod.exe'問題,在開發它時會變成殭屍。我發現當它處於特定狀態時幾乎不可能處理這個過程。 //對於這個問題,它可能是流程而不是monit的問題嗎? – KDecker