Background process 如何让主管重新启动吊运工人?
我有一些由supervisord管理的Python工作人员,如果他们工作正常,他们应该(在完成每个任务后)不断打印到stdout。然而,它们往往会挂起,我们很难找到bug。理想情况下,supervisord会注意到他们在X分钟内没有打印,然后重新启动它们;任务是幂等的,因此非优雅重启是可以的。是否有任何supervisord功能或插件可以做到这一点?或者是另一个像主管一样的程序,有这个现成的Background process 如何让主管重新启动吊运工人?,background-process,supervisord,worker,Background Process,Supervisord,Worker,我有一些由supervisord管理的Python工作人员,如果他们工作正常,他们应该(在完成每个任务后)不断打印到stdout。然而,它们往往会挂起,我们很难找到bug。理想情况下,supervisord会注意到他们在X分钟内没有打印,然后重新启动它们;任务是幂等的,因此非优雅重启是可以的。是否有任何supervisord功能或插件可以做到这一点?或者是另一个像主管一样的程序,有这个现成的 我们已经在使用to kill if内存使用量猛增,这减轻了一些挂起,但是,不会导致内存泄漏的挂起仍然会导
我们已经在使用to kill if内存使用量猛增,这减轻了一些挂起,但是,不会导致内存泄漏的挂起仍然会导致工作进程停止。一种可能的解决方案是将python脚本包装在bash脚本中,该脚本将监视它,并在一段时间内没有输出到stdout时退出 例如: 挂起时杀死。sh
#!/usr/bin/env bash
set -e
TIMEOUT=60
LAST_CHANGED="$(date +%s)"
{
set -e
while true; do
sleep 1
kill -USR1 $$
done
} &
trap check_output USR1
check_output() {
CURRENT="$(date +%s)"
if [[ $((CURRENT - LAST_CHANGED)) -ge $TIMEOUT ]]; then
echo "Process STDOUT hasn't printed in $TIMEOUT seconds"
echo "Considering process hung and exiting"
exit 1
fi
}
STDOUT_PIPE=$(mktemp -u)
mkfifo $STDOUT_PIPE
trap cleanup EXIT
cleanup() {
kill -- -$$ # Send TERM to child processes
[[ -p $STDOUT_PIPE ]] && rm -f $STDOUT_PIPE
}
$@ >$STDOUT_PIPE || exit 2 &
while true; do
if read tmp; then
echo "$tmp"
LAST_CHANGED="$(date +%s)"
fi
done <$STDOUT_PIPE
#/usr/bin/env bash
set-e
超时=60
上次更改=“$(日期+%s)”
{
set-e
虽然是真的;做
睡眠1
kill-USR1$$
完成
} &
陷阱检查输出USR1
检查输出(){
当前=“$(日期+%s)”
如果[[$((当前-上次更改))-ge$超时]];则
echo“进程标准输出在$TIMEOUT秒内未打印”
echo“考虑挂起和退出流程”
出口1
fi
}
标准管道=$(mktemp-u)
mkfifo$标准管道
陷阱清理出口
清理(){
kill--$$#将术语发送到子进程
[[-p$STDOUT_管道]]和&rm-f$STDOUT_管道
}
$@>$STDOUT|u管道|出口2&
虽然真实;做
如果读取tmp;然后
echo“$tmp”
上次更改=“$(日期+%s)”
fi
好了,谢谢!这里发生了很多事情,谢谢你写这篇文章!用于轮询的后台处理,通过信号向主脚本发送信号;临时FIFO,以确保主脚本获得子脚本的输出;正确的信号处理,代理任何出口上的子级(SIGINT和SIGTERM触发一个trap\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu!