bto*_*own 11 worker background-process supervisord
我有一些由supervisord管理的Python工作者,如果他们正常工作,应该连续打印到stdout(在每个完成的任务之后).但是,他们往往会挂起,我们很难找到错误.理想情况下,supervisord会注意到它们没有在X分钟内打印并重新启动它们; 任务是幂等的,所以不优雅的重启很好.是否有任何supervisord功能或插件可以做到这一点?或者是另一个类似管理员的程序,开箱即用?
我们已经在使用http://superlance.readthedocs.io/en/latest/memmon.html来杀死内存使用量突然增加,这可以缓解一些挂起,但是一个不会导致内存泄漏的挂起仍然会导致工人达到停顿状态.
一种可能的解决方案是将您的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
Run Code Online (Sandbox Code Playgroud)
然后,你会在supervisord运行一个python脚本,如:kill-if-hung.sh python -u some-script.py(-u禁止输出缓冲,或设置PYTHONUNBUFFERED).
我相信你可以想象一个类似的东西的python脚本.
| 归档时间: |
|
| 查看次数: |
842 次 |
| 最近记录: |