gpt4 book ai didi

background-process - 如何让supervisord重新启动挂起的 worker ?

转载 作者:行者123 更新时间:2023-12-04 02:18:27 24 4
gpt4 key购买 nike

我有许多由 supervisord 管理的 Python 工作人员,如果他们工作正常,应该连续打印到标准输出(在每个完成的任务之后)。但是,它们往往会挂起,我们很难找到错误。理想情况下,supervisord 会注意到他们在 X 分钟内没有打印并重新启动它们;任务是幂等的,所以非正常重启是可以的。是否有任何监督功能或插件可以做到这一点?或者另一个开箱即用的类似主管的程序?

我们已经在使用 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

然后你会在 supervisord 中运行一个 python 脚本,如: kill-if-hung.sh python -u some-script.py ( -u 禁用输出缓冲,或设置 PYTHONUNBUFFERED )。

我相信你可以想象一个会做类似事情的 python 脚本。

关于background-process - 如何让supervisord重新启动挂起的 worker ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43665318/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com