我有一些由supervisord管理的Python工作者,如果他们正常工作,应该连续打印到stdout(在每个完成的任务之后)。但是,它们往往会挂起,我们很难找到错误。理想情况下,监督人员会注意到他们没有在X分钟内打印并重新启动它们;任务是幂等的,所以不优雅的重启很好。是否有任何supervisord功能或插件可以做到这一点?或者是另一个类似管理员的程序,开箱即用?
我们已经在使用http://superlance.readthedocs.io/en/latest/memmon.html来杀死内存使用量猛增,这可以缓解一些挂起,但是一个不会导致内存泄漏的挂起仍然会导致工作人员陷入停顿。 / p>
答案 0 :(得分:6)
一种可能的解决方案是将您的python脚本包装在一个bash脚本中,该脚本监视它并在一段时间内没有输出到stdout时退出。
例如:
<强> kill-if-hung.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
然后你将在supervisord中运行一个python脚本,如:kill-if-hung.sh python -u some-script.py
(-u
来禁用输出缓冲,或设置PYTHONUNBUFFERED
)。
我相信你可以想象一个类似的东西的python脚本。